如果 NSExtensionActivationRule 设置为仅音频,则共享扩展不会出现在有能力的应用程序中
Share extension does not appear in capable apps if NSExtensionActivationRule is set for audio only
我正在尝试创建一个共享扩展程序,用户可以在其中从任何功能强大的应用程序上传她的录音。该文档甚至有一个简单的示例(参见 Declaring Supported Data Types for a Share or Action Extension) (also brought up in ),但它不适用于任何录音机(在 iOS 10.3.3,iPad)。
看着Uniform Type Identifiers Reference,我需要public.audio
。分享扩展的相关条目 Info.plist
:
为了缩小范围,我尝试将 NSExtensionActivationRule
更改为 public.mpeg4
和 public.audiovisual-content
,结果相同。
不过,当我更改 NSExtensionActivationRule
以符合 public.image
时,它会出现在照片应用程序中:
SUBQUERY (
extensionItems,
$extensionItem,
SUBQUERY (
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image"
).@count == $extensionItem.attachments.@count
).@count == 1
将 NSExtensionActivationRule
更改为 TRUEPREDICATE
字符串将使其最终也出现在音频应用程序中,但当然,这不会在 App Store 中被接受。
我还尝试了以上每一步,都是从头开始(即,清理 + 清理构建文件夹 + 删除 DerivedData 内容 + 从 iPad 中删除应用程序),但结果是一样的。
似乎也相关,但更改共享扩展的部署目标没有帮助。
我是不是漏掉了什么?
NOTE: As Jamshed Alam states in his comment, changes in iOS 13 make this answer obsolete.
我的共享扩展允许将音频文件上传到 Firebase 后端,我天真地认为录音应用程序会适当地声明其支持的文件类型,但事实并非如此。大多数符合多个统一类型标识符(参见 reference),其中 public.data
是最常见的。
我找到了 this Github issue from 2014 并用作参考。它的标题完美地概括了这个问题:
Share extensions will only show up if they explicitly support all
of the provided activity items
使用NSExtensionActivationDictionaryVersion
worked for me too. According to Information Property Key List Reference的解决方案:
Activation dictionary version 1 Only when the app extension handles
all of the asset types being offered by a host app item provider
Activation dictionary version 2 When the app extension handles at
least one of the asset types being offered by a host app item provider
我的分享扩展 Info.plist
现在看起来像这样:
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationDictionaryVersion</key>
<integer>2</integer>
<key>NSExtensionActivationSupportsAttachmentsWithMinCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>20</integer>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
或 Xcode:
除了 NSExtensionActivationDictionaryVersion
之外,仅使用 NSExtensionActivationSupportsFileWithMaxCount
可能就足够了。
添加 public.mpeg-4-audio
有助于在以前 public.audio
不会显示的共享表中显示应用。对每种扩展类型都执行此操作可能是不可行的。但是可以在 Audiovisual content types
.
下的 Uniform Type Identifiers 找到扩展列表
最好的情况似乎是像这样构造查询。我已经包含了一些著名的扩展,但上面的 link 中还有其他扩展。
SUBQUERY(
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.mpeg-4-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.mp3" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.windows-media-wma" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.aifc-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.aiff-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.midi-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.ac3-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.waveform-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.OTHER_EXTENSIONS" ||
).@count = 1
我正在尝试创建一个共享扩展程序,用户可以在其中从任何功能强大的应用程序上传她的录音。该文档甚至有一个简单的示例(参见 Declaring Supported Data Types for a Share or Action Extension) (also brought up in
看着Uniform Type Identifiers Reference,我需要public.audio
。分享扩展的相关条目 Info.plist
:
为了缩小范围,我尝试将 NSExtensionActivationRule
更改为 public.mpeg4
和 public.audiovisual-content
,结果相同。
不过,当我更改 NSExtensionActivationRule
以符合 public.image
时,它会出现在照片应用程序中:
SUBQUERY (
extensionItems,
$extensionItem,
SUBQUERY (
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image"
).@count == $extensionItem.attachments.@count
).@count == 1
将 NSExtensionActivationRule
更改为 TRUEPREDICATE
字符串将使其最终也出现在音频应用程序中,但当然,这不会在 App Store 中被接受。
我还尝试了以上每一步,都是从头开始(即,清理 + 清理构建文件夹 + 删除 DerivedData 内容 + 从 iPad 中删除应用程序),但结果是一样的。
我是不是漏掉了什么?
NOTE: As Jamshed Alam states in his comment, changes in iOS 13 make this answer obsolete.
我的共享扩展允许将音频文件上传到 Firebase 后端,我天真地认为录音应用程序会适当地声明其支持的文件类型,但事实并非如此。大多数符合多个统一类型标识符(参见 reference),其中 public.data
是最常见的。
我找到了 this Github issue from 2014 并用作参考。它的标题完美地概括了这个问题:
Share extensions will only show up if they explicitly support all of the provided activity items
使用NSExtensionActivationDictionaryVersion
worked for me too. According to Information Property Key List Reference的解决方案:
Activation dictionary version 1 Only when the app extension handles all of the asset types being offered by a host app item provider
Activation dictionary version 2 When the app extension handles at least one of the asset types being offered by a host app item provider
我的分享扩展 Info.plist
现在看起来像这样:
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationDictionaryVersion</key>
<integer>2</integer>
<key>NSExtensionActivationSupportsAttachmentsWithMinCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>20</integer>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
或 Xcode:
除了 NSExtensionActivationDictionaryVersion
之外,仅使用 NSExtensionActivationSupportsFileWithMaxCount
可能就足够了。
添加 public.mpeg-4-audio
有助于在以前 public.audio
不会显示的共享表中显示应用。对每种扩展类型都执行此操作可能是不可行的。但是可以在 Audiovisual content types
.
最好的情况似乎是像这样构造查询。我已经包含了一些著名的扩展,但上面的 link 中还有其他扩展。
SUBQUERY(
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.mpeg-4-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.mp3" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.windows-media-wma" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.aifc-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.aiff-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.midi-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.ac3-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.waveform-audio" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.OTHER_EXTENSIONS" ||
).@count = 1