1

我正在使用这样开始的方法:

    static func getMediaAssets(item: NSItemProvider, completion: @escaping (Result<UploadableMediaAssets, Error>) -> ()) {
        guard item.canLoadObject(ofClass: PHLivePhoto.self) else {
            logger.error("Could not load PHLivePhoto")
            completion(.failure(LiveImageItemProviderError.cannotGetLivePhoto))
            return
        }
        
        item.loadObject(ofClass: PHLivePhoto.self) { livePhoto, error in
            guard let livePhoto = livePhoto as? PHLivePhoto else {
                logger.debug("No live photo!")
                completion(.failure(LiveImageItemProviderError.cannotGetLivePhoto))
                return
            }
            
            let assetResources = PHAssetResource.assetResources(for: livePhoto)
            guard assetResources.count == 2 else {
                completion(.failure(LiveImageItemProviderError.cannotGetLivePhoto))
                return
            }
            
            let filteredForMovie = assetResources.filter {$0.uniformTypeIdentifier == movieUTI}

            guard filteredForMovie.count == 1 else {
                logger.error("Could not find movie resource: \(movieUTI)")
                completion(.failure(LiveImageItemProviderError.cannotGetLivePhoto))
                return
            }
            
            let movie:PHAssetResource = filteredForMovie[0]
            
            let filteredForOther = assetResources.filter {$0 !== movie}
            
            guard filteredForOther.count == 1 else {
                logger.error("Could not find other resource")
                completion(.failure(LiveImageItemProviderError.cannotGetLivePhoto))
                return
            }
            let image: PHAssetResource = filteredForOther[0]

            let pickedImageType: ImageType

            // more code ...
   }

PHPickerViewController使用我的主应用程序获取实时照片。这工作正常。

但是,当我尝试在共享扩展中使用相同的方法从照片的应用程序中获取照片时,两者都item.canLoadObject失败item.loadObject了。

为了更清楚地说明这一点,对于“从照片应用程序获取照片的共享扩展”,我有一个UIViewController使用以下代码的共享扩展 (a):

        let attachments = (self.extensionContext?.inputItems.first as? NSExtensionItem)?.attachments ?? []
        
        guard attachments.count == 1 else {
            completion(.failure(HandleSharedFileError.notJustOneFile))
            return
        }

使用那个NSItemProvider附件,我调用我的getMediaAssets方法。

我进入照片应用程序,选择一张实时照片,从共享扩展程序列表中使用我的应用程序,然后它会调用我的共享扩展程序。

这是我目前在 Info.plist 中使用的,用于选择共享扩展接收到的文件:

    <key>NSExtension</key>
    <dict>
        <key>NSExtensionAttributes</key>
        <dict>
            <key>NSExtensionActivationRule</key>
                <string>SUBQUERY (
              extensionItems,
              $extensionItem,
              SUBQUERY (
                  $extensionItem.attachments,
                  $attachment,
                  ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.apple.live-photo"
              ).@count == $extensionItem.attachments.@count and $extensionItem.attachments.@count == 1
            ).@count == 1</string>
        </dict>

有什么建议么?

- - 更新 - -

  1. 来自loadObject(如果我注释掉canLoadObject检查)的错误是:

2020-12-27T15:18:40-0700 调试:没有实时照片:可选(错误域=NSItemProviderErrorDomain 代码=-1200“无法将项目强制归类为 PHLivePhoto”UserInfo={NSLocalizedDescription=无法强制将项目归类为 PHLivePhoto })

  1. 有了这个尿路感染

    静态让 livePhotoUTI = "com.apple.live-photo"

这返回真:

item.hasItemConformingToTypeIdentifier(livePhotoUTI)

在共享扩展中(在哪里itemNSItemProvider

  1. 无法从共享扩展访问实时图像的附加参考支持想法:https ://developer.apple.com/forums/thread/22132?login=true&page=1#654410022
4

0 回答 0