从一个App拷贝文件到另一个App的坑

从一个App拷贝到另一个App,只需给App的info.plist添加一个字段CFBundleDocumentTypes(具体细节不再此处详细介绍)。
然后App在- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options方法中,通过以下代码根据返回的url就能获取到该文件。

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
    NSData *data = [NSData dataWithContentsOfURL:url];
    return YES;
}

不过有的时候获取到的url获取到的data为空,这是咋回事呢?打印一下 options会发现,当data为空时,optionsUIApplicationOpenURLOptionsOpenInPlaceKey值为1,

po options :
    UIApplicationOpenURLOptionsOpenInPlaceKey = 1;
    UIApplicationOpenURLOptionsSourceApplicationKey = "com.csj.ling";

当该值为0时,表示文件已经自动复制到了本App的沙盒,所以返回的url即为本App中沙盒的副本路径。而该值为1时,该文件并未自动复制到本App的沙盒,所以返回的url是原App沙盒的文件路径,此时是无法夸App获取文件的。所以取到的data值自然为空了。

解决方案:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
    //请求获取文件权限
    BOOL canAccess = [url startAccessingSecurityScopedResource];

    NSError *error;
    NSString *docsFolder = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *newPath = [docsFolder stringByAppendingPathComponent:(NSString *)url.lastPathComponent];
    NSURL *newURL = [NSURL fileURLWithPath:newPath];
    
    // 拷贝原App内的文件到本App沙盒
    [NSFileManager.defaultManager copyItemAtURL:url toURL:newURL error:&error];
    
    [url stopAccessingSecurityScopedResource]; //结束权限请求
    
    //此时该data就不为空了
    NSData *data = [NSData dataWithContentsOfURL: newURL];
}

参考代码:https://github.com/fhirblocks/seaturtle/blob/fbb5d086365bbab1d8f0a139f388c515ecc1e586/PSPDFCatalog/PSCAppDelegate.m

你可能感兴趣的:(从一个App拷贝文件到另一个App的坑)