[英]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.