我有一个带有共享扩展的 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 的内容,通常(如预期的那样)共享选项不可用。如果我将其更改为NSExtensionActivationRule
从TRUEPREDICATE
Simplenote 共享笔记文件时可以看到这样的示例。
[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
扩展名(正确),那么问题似乎出在谓词规则上。