如何在 iOS 17 中实现“与应用程序共享”功能?

How to implement "Share with apps" functionality in iOS 17?

提问人:Scoota P 提问时间:11/17/2023 最后编辑:HangarRashScoota P 更新时间:11/22/2023 访问量:67

问:

赏金将在 4 天后到期。这个问题的答案有资格获得 +100 声望赏金。Scoota P 正在寻找来自信誉良好的来源的答案

我正在尝试创建一个应用程序扩展,我可以使用“与应用程序共享”操作在快捷方式中使用该扩展。我创建了扩展程序,它显示在常规共享表中,用于共享任何内容。但是,当我进入快捷方式应用程序以创建使用“与应用程序共享”操作的自动化并尝试选择我的应用程序时,我只能看到健康,LinkedIn,松弛,提醒和其他一些应用程序。此共享功能与常规共享功能有何不同?

有谁知道如何让他们的应用程序显示在使用“与应用程序共享”操作的快捷方式中时可以选择的应用程序列表中?

iOS Swift iOS17 共享扩展

评论


答:

1赞 Sparga 11/22/2023 #1

股份延期确实是实现这一目标的必经之路。根据您的屏幕截图,您似乎已经实现了该扩展。

我在 iOS 模拟器中重新创建了与您相同的快捷方式,并且 actuall 设法使用您在问题中使用的相同方式使共享扩展工作。话虽如此,有一种更简单的方法可以对以下配置执行相同的操作:NSActivationRule

在共享扩展目标中,应包含如下内容:Info.plist

<key>NSExtension</key>
<dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.share-services</string>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>1</integer>
        </dict>
    </dict>
</dict>
  • NSExtensionPointIdentifier定义扩展的类型,这里是共享扩展,
  • NSExtensionMainStoryboard指向包含共享扩展 UI 的情节提要,
  • NSExtensionActivationRule定义共享表何时应根据要共享的数据的 UTI 类型显示扩展。

此处,激活规则设置为计数为 1。这意味着扩展仅在共享单个图像时显示,这就是快捷方式的作用。请注意,这只是一个速记,与问题中的激活规则执行相同的操作。NSExtensionActivationSupportsImageWithMaxCount

在模拟器上测试

另一件需要考虑的事情是,Xcode 有时会在模拟器或设备上部署最新版本的扩展时出现问题。我发现最可靠的测试方法是运行扩展目标,然后选择快捷方式应用程序作为主机应用程序。

Menu to select host application for the extension

在设备上进行测试

最后,在设备上,“与应用共享”步骤似乎仅列出使用分发证书签名的应用程序。一旦 TestFlight 版本在模拟器中工作,它可能是在您的设备上测试它的方法。

评论

0赞 Scoota P 12/6/2023
这是我想要的流程。我想创建一个快捷方式,在我点击手机时截取屏幕截图。我正在工作。从那里我希望保存该媒体,然后我希望将其传递到我的应用程序扩展中,以便我可以获取图像并对其进行处理。我想保留在拍摄屏幕截图时所在的原始应用程序中,并在顶部显示一个 UI,其中包含我处理后的图像的结果。现在,作为示例,我可以这样做,并让松弛覆盖在上面,然后我可以像发布该图像一样进行交互。相反,我希望我的应用程序显示给我看图像。
0赞 Scoota P 12/6/2023
我尝试了带有 UI 的意图框架,但它没有显示在快捷方式应用程序操作“与应用程序共享”中,以便能够选择我的应用程序。如果我使用 AppIntents,是否可以拥有交互式 UI?@Sparga
0赞 Sparga 12/7/2023
我看到你用更多细节编辑了你的帖子,现在我更了解你想做什么。AppIntent 框架旨在实现一个步骤,然后可以在快捷方式中使用该步骤。要使用现有的“与应用共享”步骤,您最初创建共享扩展的想法是正确的。至于为什么您的应用程序没有出现在列表中,可能是因为扩展的 Info.plist 中的 NSExtensionActivationRule 不正确。你能在你的原始帖子中分享这部分吗?
0赞 Scoota P 12/7/2023
用我的最新更新更新了原始帖子。任何帮助都是值得赞赏的@sparga
1赞 Pierre Janineh 11/26/2023 #2

您是否在?info.plist

例如,如果扩展支持:

  • 文本>public.text
  • 或者,图像>public.image

信息.plist

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>Public Text</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.text</string>
        </array>
    </dict>
    <dict>
        <key>CFBundleTypeName</key>
        <string>Public Image</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.image</string>
        </array>
    </dict>
</array>

评论

0赞 Scoota P 12/7/2023
我确实尝试过这个,但没有运气