URL Schemes или как передать данные между iOS приложениями

URL Schemes или как передать данные между iOS приложениями

Думаю, все разработчики мобильных iOS приложений в курсе, что из собственного приложения можно запускать сторонние приложения. Например можно запустить клиент Youtube, кликнув на ссылку на видео, или вызвать почтовый клиент если нажать на кнопку «написать письмо». В конце концов — самый банальный пример — это открытие браузера при нажатии на гиперссылку. Подобное поведение реализуется путем добавления и настройки URL-схем в приложение. Более того, при помощи этого инструмента можно в операционной системе iOS зарегистрировать собственную URL-схему и использовать ее для передачи данных: т.е. реализовать запуск своего приложения из других приложений с заданными параметрами.

Задача

Нужно написать iOS приложение, из которого можно запустить системное приложение «Карты», стороннее приложения Youtube, а также собственное приложение. Для реализации двух первых пунктов нам потребуется разработать только одно приложение, однако для передачи данных именно в свое приложение нам понадобится это самое второе свое приложение. Т.е. необходимо написать два iOS приложения одно из которых (для упрощения понимания мы назовем его Sender) будет с помощью URL-Scheme вызвать другое iOS приложение (назовем его Receiver). В зависимости от настройки приложения Sender в приложении Receiver, при его запуске из приложения Sender, будут меняться параметры отображения — цвет фона, надписи и пр.

Еще раз подчеркну, что подобным способом можно передать практически любые данные из одного приложения в другое — не только параметры отображения.

Решение

Создание Sender

Как было указано выше — данное приложение будет открывать сторонние приложения, а также вызывать приложение Receiver и передавать в него нужные нам параметры отображения. В Xcode создайте новое приложение, в качестве шаблона укажите Single View Application, назовите его Sender, язык разработки — Swift.

В данном проекте необходимо собрать интерфейс, который будет состоять из нескольких надписей UILabel, одного текстового поля UITextField и трех кнопок UIButton. В MainStoryboard перетащите эти элементы на ViewController и задайте нужные ограничения. Для удобства я задам цвет фона приложения и сделаю кнопки красивыми. Если у читателей возникнут вопросы как именно это сделать, то можно прочитать тут. Также необходимо создать нужные IBOutlet и IBAction. Надеюсь читатели смогу сделать это самостоятельно, однако как именно это сделать можно прочитать в предыдущих уроках. Или можно задать вопрос в комментария и я или другие читатели с удовольствием ответят. Процесс создания интерфейса:

Код, который я добавил в ViewController:

После компиляции интерфейс проекта выглядит вот таким образом:

Теперь нужно добавить код в созданные методы, которые вызываются по нажатию на кнопки. Весь фокус именно в них. Для кнопки карт добавьте следующий метод:

В данном методе следует обратить внимание на метод canOpenURL. Это метод проверит может ли iOS открыть передаваемую ссылку. Если в качестве URL-схемы будет передана схема, не зарегистрированная в iOS (и отличная, например, от http://, или ftp:// ), этот метод вернет false. Мы обрабатываем этот вариант развития событий и выводим сообщение пользователю.

Также, идя на поводу у параноиков Apple, нашему приложению нужно разрешить использовать URL-схему. Поэтому мы идем в plist-файл проекта и добавляем ключ LSApplicationQueriesSchemes и в качестве значения в массив устанавливаем строку receiverapp.

То же самое, толко в тестовом виде: в Project Navigator ctrl-клик на файл info.plist -> Open as -> Source Code добавьте строки:

Приложение Receiver

Создайте новый проект в Xcode, используя шаблон Single View Application и назовите его Receiver. Перенесите несколько UILabel на View Controller, разместите их, задайте им ограничения и для одного создайте IBOutlet. У меня получилось так:

Все очень просто: запустите приложение, чтобы убедиться что оно заработало.

Далее нам необходимо зарегистрировать упомянутую нами ранее URL-схему receiverapp:// . Для этого идем в plist-файл проекта и добавляем в нем ключ URL types, а в нем добавляем ключ URL Scemes на одном уровне с ключом URL identifier. Чтобы вы не запутались привожу картинку как выглядит plist-файл и его код.

Или то же самое в текстовом виде: в Project Navigator ctrl-клик на файл info.plist -> Open as -> Source Code:

Таким образом при установке приложения в операционную систему iOS наша URL-схема будет зарегистрирована, и мы сможем открывать наше приложение и передавать ему данные.

Теперь немного порассуждаем: у нас приложение Receiver уже есть, оно работает, ни от кого не зависит. И даже регистрирует все необходимые параметры при установке. Оно запускается, и отображает View Controller. Однако оно ни как не реагирует на запуск себя из другого приложения. Более того, если сейчас запустить приложение Sender и нажать на третью кнопку, то приложение запуститься, точно также как если бы его запустил с экрана пользователь. Нет никакой разницы.

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

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

Далее мы получили ссылку на отображаемый ViewController и передали ему полученный текст для отображения. Запускаем проект, переходим в приложение Sender, пишем какой-нибудь текст в строке textField и нажимаем на третью кнопку:

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

Как всегда, жду критики, вопросов и тем для следующих уроков в комментариях.

📎📎📎📎📎📎📎📎📎📎