2015-08-11 2 views
3

У меня есть приложение 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, поэтому кажется, что проблема связана с правилом предиката.

+2

Я получаю то же самое, даже с вариациями строки предиката. К сожалению, я бы назвал это ошибкой в ​​системе предикатов. –

+0

Chiming сказать, что совместное использование приложения Podcasts также демонстрирует это. – nomad00

+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, как в вашем случае).

Смежные вопросы