我正在 iOS 中构建一个共享扩展,允许用户将 URL(例如,来自 Instagram)共享到我的应用程序。当我使用时,我的扩展程序运行良好:
<key>NSExtensionActivationRule</key>
<string>TRUEPREDICATE</string>
但是,当我尝试将构建上传到 TestFlight 时,这被 Apple 拒绝,并出现以下错误:
Info.plist 值无效。捆绑包中的键“NSExtensionActivationRule”的值无效。
为了遵守 Apple 的准则,我尝试对 URL 使用特定的激活规则。我现在的
Info.plist
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<string>
ANY NSExtensionItems.attachments.contentTypeUTI == "public.url"
</string>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
</dict>
</plist>
但是,有了这个规则:
当我尝试共享 URL 时,共享扩展名未出现在共享表中。
调试日志确认附件类型为public.url
Attachment Type Identifiers: ["public.url"]
<key>NSExtensionActivationSupportsAttachmentsWithMatchingTypeIdentifiers</key>
<array>
<string>public.url</string>
</array>
结果:扩展程序仍然没有显示。
<key>NSExtensionActivationRule</key>
<string>TRUEPREDICATE</string>
扩展在共享表中正确显示并按预期工作,但 Apple 在验证期间拒绝了它(当我尝试将应用程序上传到 TestFlight 时)。问题:
public.url
定位
NSExtensionActivationRule
时,为什么我的共享扩展名没有出现在共享表中?
NSExtensionActivationRule
以便扩展程序出现在 URL 中并通过 TestFlight 验证?
NSExtensionActivationSupportsWebURLWithMaxCount
键,我最初忽略了它。Apple 关于
NSExtensionActivationSupportsWebURLWithMaxCount
的文档很微妙,并且并不总是清楚它如何补充
NSExtensionActivationSupportsAttachmentsWithMatchingTypeIdentifiers
。我(错误地)认为仅
public.url
就足以满足所有情况,因为它是一种普遍的尿路感染。然而,Instagram 等主机应用程序对 URL 的不同处理方式暴露了这一假设的缺陷。将
NSExtensionActivationSupportsWebURLWithMaxCount
显式添加到 Info.plist 会产生很大的不同。这是最终起作用的完整
Info.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsAttachmentsWithMatchingTypeIdentifiers</key>
<array>
<string>public.url</string>
</array>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
</dict>
</plist>