iOS分享扩展未显示/无法接收URL。

12

我遇到了一个关于我的应用iOS共享扩展的问题。以下是我在共享扩展的Info.plist中的代码。

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>1</integer>
        </dict>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.share-services</string>
</dict>
主要问题是扩展程序在 Google Chrome、NYTimes、WSJ 和许多其他应用中无法显示。所有这些应用程序都应该提供 Web 页面或 Web URL。我在某个地方读到,我必须将以下内容添加到 NSExtensionActivationRule 字典中。
<key>NSExtensionActivationSupportsText</key>
<true/>

如果我添加分享扩展,那么在上面列出的应用程序中将出现该扩展,但只向我的扩展返回一个字符串。例如,如果我在Google Chrome中转到apple.com并使用我的共享扩展,它只会提供Apple作为一个字符串给我的扩展,而我的应用程序实际上并不支持这个。它应该提供某种类型的URL或类似的东西。而在NYTimes应用程序中,它只会将文章标题发送到扩展。

该扩展在Safari中完美工作。只是不确定第三方应用程序。

下面是在我的扩展的swift文件中接收URL的主要代码:

if let item = extensionContext?.inputItems.first as? NSExtensionItem {
    if let itemProvider = item.attachments?.first as? NSItemProvider {
        if itemProvider.hasItemConformingToTypeIdentifier("public.url") {
            itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) -> Void in
                if let shareURL = url as? NSURL {
                    print (shareURL.absoluteString!)

我会按照应用程序的要求处理URL。

当我添加了NSExtensionActivationSupportsText选项后,我稍微修改了上述代码,从public.url改为public.text,还进行了一些其他测试,结果只返回了没有帮助的字符串。

我知道从这些应用程序中获取URL是可能的,因为即使在NYTimes中也有一个选项针对Google Chrome,它绝对需要一个URL而不仅仅是文章标题。有什么想法可以获取该URL吗?

1个回答

8
我建议你使用这个:

我建议您使用以下内容:

    <key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <string>
  SUBQUERY (
      extensionItems,
      $extensionItem,
      SUBQUERY (
          $extensionItem.attachments,
          $attachment,
          ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url"
      ).@count == 1
  ).@count == 1
        </string>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.share-services</string>
</dict>

考虑到您的代码需要获取附件,您仅检查了第一个输入项和第一个附件,您需要在这两种情况下都使用for-each循环并检查所有附件。


使用您的代码示例时出现以下错误消息:(null): couldn't parse contents of ' Share Extension/Info.plist': The data couldn’t be read because it isn’t in the correct format.。如果您能提供更多详细信息并解释该代码为什么有效,那将非常有帮助。由于它给出了该错误消息,因此不确定它是否有效。 - Charlie Fish
@CharlieFish 这是我从 Xamarin on Windows 项目中复制的。可能是因为 Windows 换行符导致了这个问题,所以尝试逐行复制,虽然最终版本在 Mac 上使用 Xcode 编译正常。你可能在复制粘贴时做错了什么。 - Ivan Ičin
好的,现在至少在Chrome中显示了。唯一的问题是itemProvider.hasItemConformingToTypeIdentifier("public.url")返回false。那么我该如何获取URL呢? - Charlie Fish
@CharlieFish 你只检查了第一个附件,你需要使用foreach循环来检查所有的附件。 - Ivan Ičin
看起来好像成功了!非常感谢!!我会等到悬赏结束再标记为被接受的答案并颁发奖励(以防有人给出更好的答案)。非常感谢!! - Charlie Fish
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接