从一个App拷贝到另一个App,只需给App的info.plist
添加一个字段CFBundleDocumentTypes
(具体细节不再此处详细介绍)。
然后App在- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
方法中,通过以下代码根据返回的url
就能获取到该文件。
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
NSData *data = [NSData dataWithContentsOfURL:url];
return YES;
}
不过有的时候获取到的url
获取到的data
为空,这是咋回事呢?打印一下 options
会发现,当data
为空时,options
中 UIApplicationOpenURLOptionsOpenInPlaceKey
值为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<UIApplicationOpenURLOptionsKey,id> *)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];
}