我正在尝试创建一个共享扩展程序,用户可以从任何功能强大的应用程序上传她的录音。文档甚至有一个简单的例子(参见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
中的相关条目:
为了缩小范围,我尝试将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删除应用程序),但结果在哪里相同。
This SO question似乎也很重要,但更改共享扩展程序的部署目标并没有帮助。
我错过了什么吗?
答案 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