3

我有一个带有共享扩展的 iOS 应用程序。共享扩展使用“谓词语法” NSExtensionActivationRule plist 设置。这是使用的谓词字符串。

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

目标是匹配具有一个 URL 的内容,而不管它具有哪些其他属性。不幸的是,在某些情况下,这似乎与没有任何 URL 的内容相匹配(由类型 ofpublic.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]

对于没有 URL 的内容,通常(如预期的那样)共享选项不可用。如果我将其更改为NSExtensionActivationRuleTRUEPREDICATESimplenote 共享笔记文件时可以看到这样的示例。

[public.plain-text]

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

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

我无法弄清楚为什么我的扩展会出现在这个内容中,因为既不public.image也不public.plain-text符合public.url. 纯文本项中确实有一个 URL,但也有一堆其他非 URL 文本。

我很想弄清楚为什么我的扩展程序的谓词与此内容匹配以及如何停止它(或者甚至更好,如果在某个地方实际上有一个我找不到的 URL)。

如果我为 NYT Now 故事使用字典NSExtensionActivationRule并设置NSExtensionActivationSupportsWebURLWithMaxCount=1扩展名(正确),那么问题似乎出在谓词规则上。

4

1 回答 1

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-textpublic.url就像您的情况一样)。

于 2015-11-27T15:08:13.137 回答