Делитесь разным контентом для определенных приложений, рассматривайте activity types вне предопределенного списка iOS и т. д.

В этой статье мы рассмотрим обмен контентом iOS, чтобы понять проблемы и ограничения UIActivityViewController.

Этот класс предоставляет несколько стандартных услуг, таких как копирование элементов на монтажный стол, размещение контента на сайтах социальных сетей, отправка элементов по электронной почте или SMS и многое другое.

Давайте посмотрим на это в действии:

Это выглядит очень просто, всего 2 строки кода.

В качестве входных данных этот контроллер представления получает список элементов, которыми мы хотим поделиться, по умолчанию мы получаем поддержку текста, изображения и URL-адресов для любых других типов, которые вам нужны настраиваемой поддержки.

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

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

1. Делитесь разным контентом для определенных приложений

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

Для этого вы должны соответствовать UIActivityItemSource и реализовать метод itemForSourceType.

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

Мы реализовали наши методы делегата. Но подождите минутку! Если мы запустим код в текущем состоянии, мы все равно не получим HTML-код, отображаемый в почтовом приложении.

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

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

Как видно из приведенного выше фрагмента, мы передаем делегата как элемент в списке элементов для совместного использования, это должно решить нашу проблему. Обратите внимание, у нас есть лучший подход к настройке этого делегата, о котором я расскажу позже в этой статье, но если вы хотите что-то очень простое и быстрое, этот подход может быть решением.

2. Удаляйте элементы при совместном использовании для определенных приложений

По умолчанию все элементы, проходящие через инициализацию контроллера представления активности, объединяются, а затем передаются в приложение общего доступа. В этом случае мы не хотим, чтобы некоторые конкретные приложения делились всеми элементами, с которыми мы сталкиваемся.

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

Если мы возьмем тот же пример, представленный выше, и добавим изображение в список, мы получим следующий результат:

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

Ранее в этой статье я обещаю, что вернусь с лучшим решением для установки делегата UIActivityViewController, и вот оно, одно решение, которое должно решить обе проблемы.

Таким образом, вместо того, чтобы передавать экземпляр self в список инициализации, мы будем передавать пользовательские объекты, соответствующие UIActivityItemSource, что даст нам больше гибкости, теперь весь код будет выглядеть так:

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

3. Обмен HTML в Gmail

Совместное использование HTML-контента в приложении Gmail может быть допустимым случаем, возможно, большинство пользователей iOS будут использовать собственное почтовое приложение, но есть довольно много пользователей, которые используют приложение Gmail для обработки своей почты. Грустно сообщать вам, но на данный момент обмен HTML через приложение Gmail не работает должным образом, и не потому, что это какое-то UIActivityViewController ограничение, а на самом деле ограничение приложения Gmail, которое знает только, как обрабатывать текстовый контент.

Вот снимок экрана, показывающий, как общий доступ к HTML выглядит в приложении Gmail:

Как видно, приложение Gmail обрабатывает содержимое HTML как обычный текст. Единственное, что мы можем сделать для улучшения взаимодействия с пользователем, — убедиться, что мы передаем обычный текст в приложение Gmail.

4. Обрабатывать activity types вне предопределенного списка iOS

Система iOS поставляется с предопределенным списком типов активности для обычных приложений социальных сетей, таких как Facebook, Twitter и т. д.

Проблема здесь в том, что система iOS не может предоставить предопределенные типы для всех возможных приложений. Таким образом, в этом случае мы должны вручную идентифицировать идентификаторы пользовательских типов приложений. Например, предположим, что мы хотим поделиться некоторым контентом через приложения Gmail и Pinterest, которые не предопределены в системе iOS.

Простой способ найти идентификатор пользовательского типа приложения — поставить точку останова в методе делегата itemForSourceType и распечатать заданный тип.

Вот пример:

Это ограничения и проблемы, которые я обнаружил, работая с контроллером представления активности. Я надеюсь, что вы найдете эту статью интересной и информативной, если вы знаете о каких-либо других ограничениях, не стесняйтесь добавлять комментарии.