簡體   English   中英

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

[英]Sharing PDF file from Safari with Action Extension failing in Swift 4.2 Xcode 10

我正在編寫啟用了“應用程序組”功能的應用程序。 此應用程序中的“動作擴展”已對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>

看來這僅是Xcode 10 iOS 12 Simulator中的錯誤。

在真實的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-563DF597872 /IMG_0003.JPG“:無效的參數}}}

但是后來,我決定在iOS 12下的真實設備上進行檢查。

一切都在設備上完美運行!

該解決方案對我有用,因為iOS已停止了iOS12中的此類支持,因此我為解決此問題所做的工作。 早些時候,我使用此方法的完成處理程序loadItemForTypeIdentifier

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

completeHandler塊的第一個參數的類型信息應設置為預期類型的​​類。 例如,當請求文本數據時,可以將第一個參數的類型設置為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);
                                     }];
            }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM