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