2

我正在尝试创建一个共享扩展,用户可以在其中从任何有能力的应用程序上传她的录音。该文档甚至有一个简单的示例(请参阅Declaring Supported Data Types for a Share or Action Extension)(也在此 SO 答案中提出),但它不适用于任何录音机(在 iOS 10.3.3、iPad 上)。

看着统一类型标识符参考,我需要public.audio。共享扩展中的相关条目Info.plist

![在此处输入图像描述

为了缩小范围,我尝试更改NSExtensionActivationRulepublic.mpeg4and 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

更改NSExtensionActivationRuleTRUEPREDICATE字符串也会使其最终出现在音频应用程序中,但当然,这不会在 App Store 中被接受。

我还尝试了干净启动的上述每个步骤(即干净 + 干净构建文件夹 + 删除 DerivedData 内容 + 从 iPad 中删除应用程序),但结果相同。

这个 SO question似乎也很相关,但更改共享扩展的部署目标并没有帮助。

我错过了什么吗?

4

2 回答 2

1

注意:正如 Jamshed Alam 在他的评论中所说,iOS 13 的变化使这个答案过时了

我的共享扩展允许将音频文件上传到 Firebase 后端,我天真地假设录音应用程序会适当地声明其支持的文件类型,但事实并非如此。大多数符合最常见的多个统一类型标识符(请参阅参考资料) 。public.data

从 2014 年发现了这个 Github 问题并将其用作参考。它的标题完美地概括了这个问题:

共享扩展仅在明确支持所有 提供的活动项目时才会显示

使用的解决方案NSExtensionActivationDictionaryVersion也对我有用。根据信息属性键列表参考

激活字典版本 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 中:

在此处输入图像描述

仅使用NSExtensionActivationSupportsFileWithMaxCount除此之外NSExtensionActivationDictionaryVersion可能就足够了。

于 2018-03-21T16:13:13.627 回答
0

添加public.mpeg-4-audio有助于在 sharesheet 中显示以前不会显示的应用程序public.audio。对每种扩展类型都这样做可能是不可行的。但是扩展列表可以在统一类型标识符中找到Audiovisual content types

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

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
于 2021-02-23T10:33:49.250 回答