如果 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.mpeg4public.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