如果NSExtensionActivationRule仅设置为音频,则共享扩展程序不会出现在功能强大的应用程序中

时间:2018-03-15 20:54:56

标签: ios share-extension

我正在尝试创建一个共享扩展程序,用户可以从任何功能强大的应用程序上传她的录音。文档甚至有一个简单的例子(参见Declaring Supported Data Types for a Share or Action Extension)(也在this SO answer中提出),但它不适用于任何录音机(在iOS 10.3.3,iPad上)。

查看Uniform Type Identifiers Reference,我需要public.audio。共享扩展程序Info.plist中的相关条目:

![enter image description here

为了缩小范围,我尝试将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删除应用程序),但结果在哪里相同。

This SO question似乎也很重要,但更改共享扩展程序的部署目标并没有帮助。

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

我的共享扩展程序允许将音频文件上传到Firebase后端,我天真地认为录音应用程序会适当地声明其支持的文件类型,但它们并不适用。大多数符合多个统一类型标识符(请参阅reference),public.data是最常见的。

我找到this Github issue from 2014并将其用作参考。它的标题完美地总结了这个问题:

  如果他们明确支持所有

共享扩展程序才会显示   提供的活动项目

使用NSExtensionActivationDictionaryVersion的解决方案也适用于我。根据{{​​3}}:

  

激活字典版本1 仅在应用扩展程序处理时    所有 主机应用商品提供商提供的资产类型

     

激活词典版本2 当应用扩展程序处理 时   至少一个 主机应用商品提供商提供的资产类型

我的分享扩展程序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中:

Information Property Key List Reference

除了NSExtensionActivationSupportsFileWithMaxCount之外只使用NSExtensionActivationDictionaryVersion可能已经足够了。

答案 1 :(得分:0)

添加 public.mpeg-4-audio 有助于在共享表中显示以前不会在 public.audio 中显示的应用。对每一种扩展类型都这样做可能是不可行的。但是可以在 Audiovisual content types 下的 Uniform Type Identifiers 中找到扩展列表。

最好的情况似乎是像这样构造查询。我已经包含了一些著名的扩展程序,但上面的链接中还有其他扩展程序。

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