Safari分享选项无法显示ShareExtension的问题排查
你的问题很典型——ShareExtension在照片App里能正常出现,但Safari默认分享时找不到,只有切换到PDF或Web Archive选项才会显示,这本质是你的NSExtensionActivationRule规则没有覆盖Safari默认分享的附件组合。
先分析你的规则问题
看你第二个OR分支的规则:
SUBQUERY( extensionItems, $extensionItem, SUBQUERY( $extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.content" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.apple.webarchive" ).@count == $extensionItem.attachments.@count ).@count >= 1
这个分支有个严格要求:当前extensionItem下的所有附件必须全部匹配public.url/public.content/com.apple.webarchive三者之一(因为子查询的匹配计数要等于附件总数量)。
但Safari默认分享时,通常会同时发送两个附件:一个是public.url类型的网址,另一个是public.image类型的网页预览图。这时候,子查询只能匹配到1个符合条件的附件(网址),而总附件数是2,1 != 2,导致这个分支的规则不触发,你的Extension自然不会出现在分享列表里。
而当你选择Safari的「Web Archive」或「PDF」选项时,分享的extensionItem里只有一个符合条件的附件(比如com.apple.webarchive或属于public.content的PDF),这时候子查询计数等于总附件数,规则触发,Extension就显示了。
解决方案
你只需要调整第二个OR分支的规则,把“所有附件都匹配”的要求改成“至少有一个附件匹配”即可,修改后的规则如下:
OR SUBQUERY( extensionItems, $extensionItem, SUBQUERY( $extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.content" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.apple.webarchive" ).@count >= 1 ).@count >= 1
如果你想更精准控制,也可以先确认Safari默认分享的具体UTI:在你的ShareViewController代码中加入日志,打印收到的附件信息:
// 示例Objective-C代码,Swift可自行转换 - (void)viewDidLoad { [super viewDidLoad]; for (NSExtensionItem *item in self.extensionContext.inputItems) { for (NSItemProvider *provider in item.attachments) { NSLog(@"附件UTI列表:%@", provider.registeredTypeIdentifiers); } } }
运行Extension后,在Xcode控制台就能看到Safari默认分享的所有附件UTI,再针对性调整规则会更准确。
总结
问题根源是你的规则对Safari默认的多附件分享场景做了过度限制,放宽“所有附件匹配”为“至少一个附件匹配”,就能让你的Extension在Safari默认分享选项中正常显示了。
备注:内容来源于stack exchange,提问作者Ryan

