Ограничение активности расширений UIActivityViewController

Я использую UIActivityViewController с несколькими пользовательскими UIActivityProviders. Мои провайдеры возвращают NSString, UIImage и пользовательские объекты данных. Я исключаю действия, которые я не хочу использовать, установив UIActivityViewController excludedActivityTypes и встроенные типы активности Apple.

Мне не нравятся приложения, которые появляются на представленном UIActivityViewController, которые не строятся в типах действий. Я предполагаю, что они появляются, потому что приложения сообщили iOS 8, что они могут обрабатывать текстовые и графические данные. Примерами являются расширение Flickr, Evernote и FaceBook. Эти действия имеют собственный тип URL активности, который я не хочу жестко кодировать.

Причина, по которой я не хочу, чтобы эти приложения были в моем активном совместном использовании, больше всего не работает должным образом, в результате чего мои пользователи испытывают плохой опыт и, вероятно, обвиняют мое приложение в плохой реализации. Реальность такова, что эти приложения не обрабатывают данные, которые, по их утверждению, могут. Например, Evernote всегда просто представляет пустой почтовый диалог. Некоторые, такие как Facebook, расширяют даже ошибки журнала, если они не могут обрабатывать тип данных (действительно?).

Можно ли заблокировать все сторонние расширения общего доступа?

Если ответ отрицательный, кажется, у меня есть только 2 варианта:

  • Поделиться только с помощью встроенных действий Apple и моих пользовательских действий
  • Разрешить 3 сторожевым расширениям отключить руку.
  • Оберните весь свой контент в пользовательский класс, чтобы он не распознавался расширениями. Это генерирует зарегистрированную ошибку из Facebook

Трудность возникает из initWithPlaceholderItem:(id)placeholderItem. Я передаю общий NSString или UIImage, которые, по словам расширений, могут обрабатывать, но часто не регистрируют или регистрируют ошибку при публикации. Это было бы ужасным местом для обнаружения общих расширений.

Я хочу предоставить своим пользователям самый гибкий опыт обмена, но не ценой неудачной реализации сторонних разработчиков.

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

Ответ 1

Не уверен, что это так, но вы можете настроить "белый список" доверенных операторов. Затем используйте UIActivityItemProvider с протоколом UIActivityItemSource. Вы получите:

- (id)activityViewController:(UIActivityViewController *)activityViewController
     itemForActivityType:(NSString *)activityType

Проверьте activityType. Если он включен в белый список доверенных поставщиков, верните элемент данных. Если activityType не распознается, верните nil (или верните некоторый кастрированный "безопасный" элемент данных).

Неверные действия могут отображаться в листе активности, но они не будут получать данные, которые могут вызвать проблему для вашего приложения.

Ответ 2

Можно ли заблокировать все сторонние расширения общего доступа?

Да, возможно. Но через частный API. Я не могу рассказать вам подробности, но это возможно.