iOS 14 iPad从Photos拖拽图片到自定义App返回无效路径如何解决
iOS 14 iPad端Photos应用拖拽图片读取失败问题解答
问题成因
- 你获取到的带
version、uuid参数的URL是iOS DragUI系统生成的临时标识URL,并非实际存储在磁盘中的标准文件路径,系统解析该URL时会将拼接的参数识别为文件名的一部分,自然无法匹配到实际文件 - 该类DragUI生成的临时文件生命周期极短,默认会在拖拽会话结束前就被系统回收,等到执行
performDrop回调时临时文件已经被清理,即使拿到标准路径也无法读取 startAccessingSecurityScopedResource仅对符合安全域规则的外部资源URL生效,这类系统内部拖拽生成的临时标识URL不支持该接口的权限申请,调用后也不会生效- 从Brave浏览器拖拽正常是因为浏览器直接传递了
NSConcreteData类型的实体数据,没有依赖临时URL引用,所以不存在生命周期问题
修复方案
不要直接读取拖拽获取到的NSURL对应的文件,通过NSItemProvider加载图片实体数据是最稳定的实现方式,示例代码如下:
- (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session { for (UIDropItem *item in session.items) { NSItemProvider *provider = item.itemProvider; if ([provider conformsToTypeIdentifier:(NSString *)kUTTypeImage]) { // 方式1:直接加载UIImage对象 [provider loadObjectOfClass:[UIImage class] completionHandler:^(id<NSItemProviderReading> _Nullable object, NSError * _Nullable error) { if (object && [object isKindOfClass:[UIImage class]]) { UIImage *dragImage = (UIImage *)object; // 在此处处理拿到的图片 } }]; // 方式2:加载图片原始Data,可自行写入沙盒存储 [provider loadDataRepresentationForTypeIdentifier:(NSString *)kUTTypeImage completionHandler:^(NSData * _Nullable data, NSError * _Nullable error) { if (data) { // 可写入沙盒Tmp/Documents目录后再做后续处理 NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", [NSUUID UUID].UUIDString]]; [data writeToFile:tmpPath atomically:YES]; NSURL *localUrl = [NSURL fileURLWithPath:tmpPath]; // 处理本地沙盒的URL,无权限和生命周期问题 } }]; } } }
注意:使用kUTTypeImage需要先导入MobileCoreServices框架
如果有必须通过URL处理图片的需求,将加载到的图片数据写入自身应用沙盒目录后生成的本地URL,不会出现找不到文件的问题。
内容的提问来源于stack exchange,提问作者Mapsy
相关产品推荐
相关产品推荐

