微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Share Extension 中获取 PHAsset

如何解决如何在 Share Extension 中获取 PHAsset

使用 iOS14.3、XCode12.3、Swift 5.3.2

我成功地在我的应用中实现了一个共享扩展。

只要用户选择一个或多个图像和/或视频并按下照片应用中的共享符号,就会在照片应用中应用共享扩展。到现在为止还挺好。我的应用图标显示在共享下,我可以继续我的自定义共享扩展。

现在的问题:

我想提取用户选择的 PHAsset 的唯一 localIdentifer。 (或任何其他对所选实际相册图像或视频的引用)。

我需要所有选定媒体的 localIdentifiers,以便将其发送到 Share-Extension 的母应用程序以进一步处理相关图像或视频。

从文档中,我能够获得扩展项的附件属性(见下面的代码

但由于某种原因,在检索到的附件的 NSItemProvider 上没有 PHAsset 信息。

这是我获取所选媒体(即用户在照片应用中多选并共享的图像和视频)的代码

    func getSelectedMedia(completion: (([SelectionMediaType]?)->())?) {
        var returnMediaArray = [SelectionMediaType]()
        let contentType = kUTTypeData as String
        let asyncGroup = dispatchGroup()
        if let inputItem = extensionContext!.inputItems.first as? NSExtensionItem {
            if let attachments = inputItem.attachments {
                for provider in attachments {
                    if provider.hasItemConformingToTypeIdentifier(contentType) {
                        asyncGroup.enter()
                        provider.loadItem(forTypeIdentifier: contentType,options: nil) { (data,error) in
                            
                            guard error == nil else {
                                completion?(nil)
                                return
                            }
                            
                            if let url = data as? URL {
                                
                                let creationDate = self.retrieveCreationDateFromEXIF(url) ?? Date()
                                
                                if let img = UIImage(contentsOfFile: url.path) {
                                    let imgMedia = SelectionMediaType.photo(p: img,creationDate: creationDate)
                                    returnMediaArray.append(imgMedia)
                                } else {
                                    let vidMedia = SelectionMediaType.video(v: url,creationDate: creationDate)
                                    returnMediaArray.append(vidMedia)
                                }
                            } else {
                                print("Impossible to retrieve mediaURL")
                                completion?(nil)
                            }
                            asyncGroup.leave()
                        }
                    } else { completion?(nil) }
                }
            } else { completion?(nil) }
        } else { completion?(nil) }
        
        asyncGroup.notify(queue: .main) {
            completion?(returnMediaArray)
        }
    }

如何获取所选媒体的照片本地标识符???

是否有其他方法可以引用用户在我的自定义共享扩展程序中的照片应用中多选的图像/视频。

我进一步的尝试:

  • 比较 EXIF creationDate 和 PHAsset creationDate(但它们不完全匹配并且相差一两秒)。我不认为这是考虑日期范围的最佳主意

  • 将 EXIF 文件名与 PHAsset 名称进行比较 - 但同样,这也不是 100% 防弹

什么是更好的方法??

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。