读一读

+ (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。

image.png


这样就可以通过头为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  截图到相关设置