在Swift 4.2 Xcode 10中使用Action Extension从Safari共享PDF文件失败

时间:2018-09-23 02:26:05

标签: xcode pdf safari appgroups

我正在编写启用了“应用程序组”功能的应用程序。此应用程序中的“动作扩展”已打开对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}}})`

任何人都可以对正在发生的事情有所了解吗?该应用程序及其操作扩展名都属于同一应用程序组。 Action Extension在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>

2 个答案:

答案 0 :(得分:1)

它似乎仅是Xcode 10 iOS 12模拟器中的错误。

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

我在我们的项目中遇到了这个问题。共享扩展程序停止在iOS 12 Simulators下运行,但仍在Xcode 10的iOS 11 Simulators下运行。

itemProvider.loadItem(forTypeIdentifier: typeIdentifier, options: nil) { secureCoding, error in
}

我花了半天多的时间根据文档尝试不同的参数: https://developer.apple.com/documentation/foundation/nsitemprovider/completionhandler

没有任何帮助-iOS 12模拟器下“ NSItemProvider的loadItem”中始终出现相同的错误:

"Cannot load representation of type public.jpeg" "Invalid argument"

错误域= NSItemProviderErrorDomain代码= -1000“无法加载类型为public.jpeg的表示形式” UserInfo = {NSLocalizedDescription =无法加载类型为public.jpeg的表示形式,NSUnderlyingError = 0x6000005e1fe0 {错误域= NSPOSIXErrorDomain代码= 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下的真实设备上进行检查。

一切都可以在设备上正常运行!

答案 1 :(得分:0)

该解决方案对我有用,因为iOS已停止了iOS12中的此类支持,因此我为解决此问题所做的工作。早些时候,我为此方法loadItemForTypeIdentifier使用此完成处理程序

completionHandler:^(id <NSSecureCoding> urlItem, NSError *error)

您的completedHandler块的第一个参数的类型信息应设置为预期类型的​​类。例如,当请求文本数据时,可以将第一个参数的类型设置为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);
                                     }];
            }

    }