从Safari共享PDF文件,操作扩展名在Swift 4.2 Xcode 10中失败

从Safari共享PDF文件,操作扩展名在Swift 4.2 Xcode 10中失败,xcode,pdf,safari,appgroups,Xcode,Pdf,Safari,Appgroups,我正在编写一个启用了“应用程序组”功能的应用程序。此应用程序中的操作扩展插件对PDF文件开放,当以阅读器模式打开Safari中加载的网页并将其转换为PDF时,该扩展插件可用 简而言之,该应用程序可以接收从Safari转换为PDF文件的网页。它在升级到Swift 4.2之前工作正常。下载Xcode 10后,它已停止工作,出现以下错误: (Error Domain=NSItemProviderErrorDomain Code=-1000 "Cannot load representation of

我正在编写一个启用了“应用程序组”功能的应用程序。此应用程序中的操作扩展插件对PDF文件开放,当以阅读器模式打开Safari中加载的网页并将其转换为PDF时,该扩展插件可用

简而言之,该应用程序可以接收从Safari转换为PDF文件的网页。它在升级到Swift 4.2之前工作正常。下载Xcode 10后,它已停止工作,出现以下错误:

(Error Domain=NSItemProviderErrorDomain Code=-1000 "Cannot load 
representation of type com.adobe.pdf"  UserInfo   
{NSLocalizedDescription=Cannot load representation of type 
com.adobe.pdf, NSUnderlyingError=0x600002dd9a70 {Error
Domain=NSPOSIXErrorDomain Code=22 "Invalid argument" UserInfo=    
{NSLocalizedDescription=Cannot issue a sandbox extension for file  
"/Users/xxx/Library/Developer/CoreSimulator/Devices/FE5463C2-FAA3-
41A9938B-C1C234EA966A/data"/Containers/Data/Application/B6FB42C6-B4E3-
46D8-B9F95856FF88F0B6/tmp//Safari - Sep 22, 2018 at 10:00 PM.pdf": 
Invalid argument}}})`
有人能解释一下发生了什么事吗?应用程序及其操作扩展都属于同一个应用程序组。操作扩展在info.plist中有以下条目:

<dict>
  <key>NSExtensionAttributes</key>
  <dict>
  <key>NSExtensionActivationRule</key>
  <string>
                SUBQUERY (
                extensionItems,
                $extensionItem,
                SUBQUERY (
                $extensionItem.attachments,
                $attachment,
                ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" ||
                ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.file-url"
                ).@count == $extensionItem.attachments.@count
                ).@count == 1
            </string>
  </dict>
  <key>NSExtensionMainStoryboard</key>
  <string>MainInterface</string>
  <key>NSExtensionPointIdentifier</key>
  <string>com.apple.ui-services</string>
  </dict>

N扩展属性
NSExtensionActivationRule
子查询(
伸展岩,
多边主义,
子查询(
$m.attachments,
$附件,
任何$attachment.registeredTypeIdentifiers UTI-Compliance-TO“com.adobe.pdf”||
任何$attachment.registeredTypeIdentifiers UTI-Compliance-TO“public.file url”
)@count=$extensionItem.attachments@count
)@count==1
NSextensionMainstryBoard
主界面
NSExtensionPointIdentifier
com.apple.ui-services

我的解决方案是,iOS已经停止了iOS12中的此类支持,因此我采取了哪些措施来解决此问题。早些时候,我将此完成处理程序用于此方法loadItemForTypeIdentifier

completionHandler:^(id-urlItem,NSError*error)

completionHandler块的第一个参数的类型信息应设置为预期类型的类。例如,在请求文本数据时,可以将第一个参数的类型设置为NSString或NSAttributedString。项目提供程序可以执行数据到指定类的简单类型转换,例如从NSURL到NSData或NSFileWrapper,或从NSData到UIImage(在iOS中)或NSImage(在macOS中)。如果无法检索数据或将数据强制到指定的类,则会将错误传递到完成块的

- (void)getFilelist :(NSItemProvider *)itemProvider
 setPublicIdentifier:(NSString *)indentifier
                    :(void (^)(void))complete {

    [itemProvider loadItemForTypeIdentifier:indentifier options:nil completionHandler:^(NSURL *  _Nullable item, NSError * _Null_unspecified error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSURL *selectURl = (NSURL*)item;
            if ([[selectURl pathExtension] isEqualToString:@"pdf"] || [[selectURl pathExtension] isEqualToString:@"xlsx"] || [[selectURl pathExtension] isEqualToString:@"csv"]) {
                int randomID = arc4random() % 9000 + 1000;
                NSString *filename = [[(NSURL*)item path] lastPathComponent];
                if ([filename isEqualToString:@"FullSizeRender.jpg"]) {
                    filename = [NSString stringWithFormat:@"MD%d.jpg",randomID];
                }
                [_items addObject:selectURl.absoluteString];
                complete();
            }
        });
    }];
}
这样称呼这个

    for (NSItemProvider *itemProvider in item.attachments) {

            if([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeText]) {
                [self getFilelist:itemProvider
                    setPublicIdentifier:(NSString *)kUTTypeText
                                       :^{
                                           openFile(self, i, totalnt);
                                       }];
            }

            if([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePDF]) {
                [self getFilelist:itemProvider
                  setPublicIdentifier:(NSString *)kUTTypePDF
                                     :^{
                                         openFile(self, i, totalnt);
                                     }];
            }

            if([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeSpreadsheet]) {
                [self getFilelist:itemProvider
                  setPublicIdentifier:(NSString *)kUTTypeSpreadsheet
                                     :^{
                                         openFile(self, i, totalnt);
                                     }];
            }

    }

看起来它只是Xcode 10 iOS 12模拟器中的一个bug。

在真正的iOS 12设备上错误为零,共享扩展在iOS 11和iOS 12设备上都有效

我在我们的项目中遇到了这个问题。共享扩展在iOS 12模拟器下停止工作,但在Xcode 10的iOS 11模拟器下仍然工作

itemProvider.loadItem(forTypeIdentifier: typeIdentifier, options: nil) { secureCoding, error in
}
根据文档,我花了半天多的时间尝试不同的参数:

没有任何帮助-iOS 12模拟器下的“NSItemProvider's loadItem”总是出现相同的错误:

"Cannot load representation of type public.jpeg" "Invalid argument"
Error Domain=NSItemProviderErrorDomain Code=-1000“无法加载public.jpeg类型的表示形式”UserInfo={NSLocalizedDescription=无法加载public.jpeg类型的表示形式,NSUnderlyingError=0x6000005e1fe0{Error Domain=NSPOSIXErrorDomain Code=22“无效参数”UserInfo={NSLocalizedDescription=无法为文件“/Users/user/Library/Developer/CoreSimulator/Devices/4771D8A8-E366-43CB-8A2E-7FF397E4CF6A/data/Media/PhotoData/OutgoingTemp/82644FB8-E3B8-45DE-A0BF-563DF597872D/IMG_0003.JPG”发出沙盒扩展名:无效参数}}

但后来,我决定在iOS 12下的真实设备上进行检查


在一台设备上,一切都运行得很好!

你有什么解决方案吗?这个问题还没有解决方案..我这样做了,让我解释一下什么是
\mPhotos
?编辑了答案,请检查没有任何意义-getFileList:setPublicIdentifier:方法中的关键区别,而你没有展示它是如何工作的吗?难道你不明白吗?与其使用self,不如在你的类中粘贴该方法,它对我有用