iOS 共享扩展不显示/无法接收 URL

Posted

技术标签:

【中文标题】iOS 共享扩展不显示/无法接收 URL【英文标题】:iOS Share Extension not displaying/not able to receive URL 【发布时间】:2017-05-02 22:26:05 【问题描述】:

我的应用程序的 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 和许多其他应用程序中。所有这些都应提供网页或网址。

我在某处读到我必须将以下内容添加到 NSExtensionActivationRule 字典中。

<key>NSExtensionActivationSupportsText</key>
<true/>

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

该扩展在 Safari 中完美运行。只是不是某些 3rd 方应用程序。

下面是在我的扩展的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】:

我建议你使用这个:

    <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>

考虑到您获取附件的代码,您只检查第一个 inputItems 和第一个附件,您需要在这两种情况下都有 foreach 循环并检查所有这些。

【讨论】:

使用您的代码示例获取以下错误消息:(null): couldn't parse contents of ' Share Extension/Info.plist': The data couldn’t be read because it isn’t in the correct format.。如果您可以提供更多详细信息并解释该代码可能起作用的原因,也会很有帮助。不确定它是否有效,因为它给出了错误消息。 @CharlieFish 这是从我在 Windows 上的 Xamarin 项目中复制的。可能是 Windows 换行符导致了该问题,因此请尝试逐行复制,尽管它应该可以正常工作,因为最终版本可以在 Mac 上使用 Xcode 正确编译。您可能在复制和粘贴方面做错了。 @CharlieFish 正在考虑解释 - Chrome 只是没有以这种格式设置数据。对于 Chrome,您需要再添加一种数据格式(我相信纯文本)。但即使这样也不适用于所有应用程序,例如苹果新闻。只要确实只有一个带有 URL 的附件,这就会告诉应用程序可以工作。 好的,现在它至少可以在 Chrome 中显示了。唯一的问题是 itemProvider.hasItemConformingToTypeIdentifier("public.url") 返回 false。那我怎么才能得到网址呢? @CharlieFish 您只检查第一个附件,您需要进行 foreach 循环并检查所有附件。

以上是关于iOS 共享扩展不显示/无法接收 URL的主要内容,如果未能解决你的问题,请参考以下文章

iOS 共享扩展激活规则不应该用于 public.url 类型时触发

IOS 分享到 Facebook 的 URL 不显示预览

iOS 共享扩展禁用预览

Xamarin.iOS 无法在推送通知中显示照片

IOS8 beta 中的共享扩展

iOS 共享扩展仅在 Safari 中显示