iOS端Google Drive「Send a copy」不显示应用扩展的激活规则咨询
这问题我之前帮开发者排查过不少,核心原因是Google Drive的「Send a copy」流程传递文件的方式和Photos、Files、Safari略有差异,导致你现有激活规则没命中。下面给你几个针对性的调整方向:
1. 细化UTI匹配规则,覆盖Google Drive的文件类型传递
Google Drive在分享文件时,可能会传递更具体的UTI(而非你配置的通用UTI),比如:
- 音频文件可能用
public.mp3、com.apple.coreaudio-format而非宽泛的public.audio - 视频文件可能用
public.mpeg-4、com.apple.quicktime-movie而非public.movie - PDF文件确保包含
com.adobe.pdf
建议把这些具体UTI加入规则,或者更稳妥的是用UTI的「继承匹配」——比如在谓词里用UTI-CONFORMS-TO来匹配所有符合父类UTI的子类。
2. 改用谓词格式的激活规则(更灵活)
相比简单的UTI数组,谓词规则能更精准匹配复杂场景。把你的NSExtensionActivationRule替换成下面的谓词字符串(可根据你的文件类型调整):
<key>NSExtensionActivationRule</key> <string>SUBQUERY ( extensionItems, $extensionItem, SUBQUERY ( $extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.audio" OR ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.movie" OR ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" ).@count >= 1 ).@count >= 1</string>
这个规则会检查每个扩展项里至少有一个附件是音频、视频或PDF类型,不管具体子UTI是什么,只要符合父类UTI就会触发。
3. 添加文件大小限制配置
Google Drive的文件可能比你默认配置的大小限制更大,导致扩展被过滤。在Info.plist里添加:
<key>NSExtensionActivationSupportsFileWithMaxSize</key> <integer>104857600</integer> <!-- 100MB,按需调整单位为字节 -->
如果你的扩展支持更大文件,直接调高数值即可。
4. 确保支持public.file-url类型
有些APP(包括Google Drive)在分享时会传递文件URL而非直接的文件数据,所以你的规则需要支持public.file-url这个UTI。可以在谓词里补充:
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.file-url"
这样即使是通过URL传递的文件,你的扩展也能被触发。
5. 调试验证传递的参数
如果还是不行,建议在Xcode里调试扩展的beginRequestWithExtensionContext:方法,打印extensionContext.extensionItems的详细信息,看看Google Drive传递的附件UTI、类型是什么,再针对性调整规则。比如:
- (void)beginRequestWithExtensionContext:(NSExtensionContext *)context { for (NSExtensionItem *item in context.extensionItems) { for (NSItemProvider *provider in item.attachments) { NSLog(@"Registered UTIs: %@", provider.registeredTypeIdentifiers); } } // 其他逻辑... }
按照上面的步骤调整后,你的扩展应该就能在Google Drive的「Send a copy」里正常显示了。
内容的提问来源于stack exchange,提问作者user516542

