+ (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSString* path = (__bridge_transfer NSString *)(contextInfo);
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
NSLog(@"保存结束");
if( error == nil )
{
}
else
{
NSLog( @"Error saving image with UIImageWriteToSavedPhotosAlbum: %@", error );
}
}
int _SavePhoto(char *readAddr)
{
int result = 0;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000
if( CHECK_IOS_VERSION( @"14.0" ) )
{
result = [__NtNotificationWrapper requestPhotoPermissionNewest];
}
else
#endif
result = [__NtNotificationWrapper requestPhotoPermissionNew];
if(result != 1)
{
return result;
}
NSString *strReadAddr = [NSString stringWithUTF8String:readAddr];
UIImage *img = [UIImage imageWithContentsOfFile:strReadAddr];
NSLog([NSString stringWithFormat:@"w:%f, h:%f", img.size.width, img.size.height]);
UIImageWriteToSavedPhotosAlbum(img, nil,
@selector(image:didFinishSavingWithError:contextInfo:), nil);
return 1;
}
+ (int)requestPhotoPermissionNew
{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if( status == PHAuthorizationStatusAuthorized )
return 1;
else if(status == PHAuthorizationStatusNotDetermined)
{
__block BOOL authorized = NO;
dispatch_semaphore_t sema = dispatch_semaphore_create( 0 );
[PHPhotoLibrary requestAuthorization:^( PHAuthorizationStatus status )
{
authorized = ( status == PHAuthorizationStatusAuthorized );
dispatch_semaphore_signal( sema );
}];
dispatch_semaphore_wait( sema, DISPATCH_TIME_FOREVER );
return authorized ? 1 : 0;
}
return 0;
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000
+ (int)requestPhotoPermissionNewest
{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatusForAccessLevel:PHAccessLevelReadWrite];
if( status == PHAuthorizationStatusAuthorized )
return 1;
else if( status == PHAuthorizationStatusLimited )
{
return 2;
}
else if( status == PHAuthorizationStatusNotDetermined )
{
[PHPhotoLibrary requestAuthorizationForAccessLevel:PHAccessLevelReadWrite handler:^( PHAuthorizationStatus status )
{
}];
return 3;
}
return 0;
}
#endif一、打包成Xcode项目后,在目录中找到UnityAppController.mm文件,打开搜索到openurl就是这里接受其他应用传送过来的url的,听说会有不同的版本。新建一个全局的变量存储这个Url,然后在需要的时候将这个Url传递给Unity那边进行解析处理。
//extern void UnitySendMessage(const char *,const char *,const char *);
static NSString *URLString = @"";//声明变量保存Url
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url options:(NSDictionary *)options
{
URLString = [url absoluteString];
//UnitySendMessage("Gameobject",[@"method" UTF8String],[URLString UTF8String]);
return YES;
}
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
NSMutableArray* keys = [NSMutableArray arrayWithCapacity: 3];
NSMutableArray* values = [NSMutableArray arrayWithCapacity: 3];
#define ADD_ITEM(item) do{ if(item) {[keys addObject:@#item]; [values addObject:item];} }while(0)
ADD_ITEM(url);
ADD_ITEM(sourceApplication);
ADD_ITEM(annotation);
#undef ADD_ITEM
NSDictionary* notifData = [NSDictionary dictionaryWithObjects: values forKeys: keys];
AppController_SendNotificationWithArg(kUnityOnOpenURL, notifData);
//这方法次行上面的都是打包都有的了,新加下面一行就行了
URLString = [url absoluteString];
//UnitySendMessage("Gameobject",[@"method" UTF8String],[URLString UTF8String]);
return YES;
}
extern "C"
{
char* _GetURLString();//声明一个C语言方法,提供给Unity使用
}
char* _GetURLString()
{
//将保存好的Url转换为字符串给Unity
char *x = (char *)malloc(strlen([URLString UTF8String]) + 1);
strcpy(x, [URLString UTF8String]);
URLString = @"";
return x;
}在Unity中声明并使用_GetURLString方法
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
public static extern string _GetURLString();
#endif
public string GetSchemePars()
{
string data = "";
#if UNITY_ANDROID && !UNITY_EDITOR
data = mJavaObject.Call<string>("GetSchemePars");
#elif UNITY_IOS && !UNITY_EDITOR
data = _GetURLString();//这里使用。。。
#endif
return data;
}二、在Xcode上设置可以唤醒这个app的URL Scheme,点击项目选择Info->URL Types,新加一个,编写一个唯一的Identifier,重点设置URL Scheme。

这样就可以通过头为zfzx://来唤醒app了,后面可以添加其他东西,具体百度。
在运行的最后一步时 报错为:Command CodeSign failed with a nonzero exit code
解决办法:Product->Clean Build Folder 【重启电脑】
cmd+c 复制
cmd+x 剪切
cmd+v 粘贴
cmd+z 撤销操作
cmd+shift+z 重做操作
cmd+a 全选内容
cmd+f 查找
cmd+d 再次查找
cmd+shift+g 查找上一个
cmd+s 保存
cmd+h 隐藏当前窗口
cmd+option+h 隐藏其他的所有窗口
cmd+t 新建新标签
cmd+shift+n 在访达中创建一个新文件夹
cmd+w 关闭当前应用的最上面的窗口
cmd+option+esc 强制关闭应用
cmd+tap 切换到其他应用
cmd+shift+5 屏幕录屏截图相关设置等
cmd+shift+4 截图到相关设置