У меня есть приложение iOS с расширением для общего доступа. В расширении share используется настройка plc "predicate syntax"NSExtensionActivationRule
. Вот предикатная строка, которая используется.Правило активации расширения общего доступа iOS запускается, когда оно не должно быть для public.url type
SUBQUERY (
extensionItems,
$extensionItem,
SUBQUERY (
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url"
)[email protected] == 1
)[email protected] == 1
Целью является сопоставление контента, содержащего один URL-адрес, независимо от его свойств. К сожалению, есть случаи, когда это похоже на контент без каких-либо 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]
Для содержимого, не имеющего URL-адреса, обычно (как и ожидалось) опция совместного доступа недоступна. Если я изменю NSExtensionActivationRule
на TRUEPREDICATE
, я могу увидеть пример, подобный этому, когда вы используете файл заметок из Simplenote.
[public.plain-text]
К сожалению, я наткнулся на случай в Нью-Йорк Таймс Теперь приложение, где мой оригинальный предикат делает матч, но содержание не имеет каких-либо вложений с public.url
типа (или любой тип, который соответствует public.url
согласно this list) , Вот выход журнала из публикации истории NYT Now.
[public.image]
[public.plain-text]
Я не могу понять, почему мое расширение показывает на это содержание, так как ни public.image
, ни public.plain-text
соответствуют public.url
. В текстовом элементе есть URL-адрес, но есть и другой текст, не содержащий URL.
Мне бы хотелось выяснить, почему предикат моего расширения соответствует этому контенту и как его остановить (или даже лучше, если на самом деле есть URL-адрес, который я не могу найти).
Если я использую словарь для NSExtensionActivationRule
и устанавливаю NSExtensionActivationSupportsWebURLWithMaxCount=1
, расширение (правильно) не отображается для историй NYT Now, поэтому кажется, что проблема связана с правилом предиката.
Я получаю то же самое, даже с вариациями строки предиката. К сожалению, я бы назвал это ошибкой в системе предикатов. –
Chiming сказать, что совместное использование приложения Podcasts также демонстрирует это. – nomad00
Пахнет как ошибка. Вы положили в радар? –