iOS共享扩展激活规则在不应该为public.url类型

时间:2015-08-11 02:14:51

标签: ios swift ios8-share-extension

我有一个分享扩展的iOS应用。共享扩展程序使用"predicate syntax" NSExtensionActivationRule plist设置。这是使用的谓词字符串。

SUBQUERY (
    extensionItems,
    $extensionItem,
    SUBQUERY (
        $extensionItem.attachments,
        $attachment,
        ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url"
    ).@count == 1
).@count == 1

目标是匹配具有一个URL的内容,而不管它具有哪些其他属性。不幸的是,在某些情况下,这似乎与没有任何网址的内容匹配(由public.url的类型或符合它的任何内容定义)。

出于一个简单的例子的目的,我用这个简化的类交换了视图控制器。

import UIKit
import Social
import MobileCoreServices

class ShareViewController: SLComposeServiceViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    self.logAttachments()
    // do nothing
    self.extensionContext?.completeRequestReturningItems([]) {(_:Bool) -> Void in}
  }

  func logAttachments() {
    if let items:[NSExtensionItem] = self.extensionContext?.inputItems as? [NSExtensionItem] {
      for item in items {
        self.logItemAttachments(item)
      }
    } else {
      println("No items")
    }
  }

  func logItemAttachments(item:NSExtensionItem) {
    if let attachments = item.attachments as? [NSItemProvider] {
      for a in attachments {
        println(a.registeredTypeIdentifiers)
      }
    } else {
      println("No attachments")
    }
  }
}

所有这个类都打印了每个共享项的附件的类型。大多数时候,我得到的是一个public.url类型的附件。以下是iOS Chrome应用中网页的示例。

[public.plain-text]
[public.url]

对于没有网址的内容,通常(按预期方式),共享选项不可用。如果我将NSExtensionActivationRule更改为TRUEPREDICATE,我可以在从Simplenote共享笔记文件时看到这样的示例。

[public.plain-text]

不幸的是,我在NYT Now应用程序中遇到了一个案例,其中我的原始谓词 匹配,但内容没有public.url类型的任何附件(或任何符合的类型) public.url根据this list)。以下是分享NYT Now故事的日志输出。

[public.image]
[public.plain-text]

我无法弄清楚为什么我的扩展程序会显示此内容,因为public.imagepublic.plain-text都不符合public.url。纯文本项 中有一个URL,但也有一堆其他非URL文本。

我想知道为什么我的扩展程序的谓词与这些内容匹配以及如何阻止它(或者甚至更好,如果实际上有一个我无法找到的URL)。

如果我使用NSExtensionActivationRule的字典并设置NSExtensionActivationSupportsWebURLWithMaxCount=1,则NYT Now故事不会显示扩展名(正确),因此问题似乎与谓词规则有关。

1 个答案:

答案 0 :(得分:0)

虽然这可能对您的具体情况没有帮助,但我想分享我的解决方法。

上下文:以下是我在NSItemProviderCompletionHandler符合NSItemProvider时使用的kUTTypePlainText的框架版本。

lazy var textHandler: NSItemProviderCompletionHandler = { [unowned self]
(result: NSSecureCoding?, error: NSError!) in
    if let text = result as? String {
        print("Text: \(text)")
        // If NSDataDetector thinks we have a link - use it!
        let types: NSTextCheckingType = [.Link]
        let detector = try? NSDataDetector(types: types.rawValue)
        if let match = detector?.firstMatchInString(text, options: [], range: NSMakeRange(0, (text as NSString).length))
            where match.resultType == .Link  {
                print("URL: \(match.URL!.absoluteString)")
        }
    }
}

值得注意的是,即使该应用不宣传对public.plain-text的支持(仅在您的情况下为public.url)。