从Safari共享PDF文件,操作扩展名在Swift 4.2 Xcode 10中失败
我正在编写一个启用了“应用程序组”功能的应用程序。此应用程序中的操作扩展插件对PDF文件开放,当以阅读器模式打开Safari中加载的网页并将其转换为PDF时,该扩展插件可用 简而言之,该应用程序可以接收从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
(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,不如在你的类中粘贴该方法,它对我有用