Вы можете убедиться, что файл цифровых ресурсов имеет правильный формат и правильно размещен, используя API Google для ссылок на цифровые ресурсы, как показано в этом примере:
Как передавать данные между iOS-приложениями с помощью URL Schemes
Большинство iOS-разработчиков в курсе, что с помощью URL-схем можно, например, запустить Safari из своего приложения. Однако не все знают, что в разрабатываемом приложении А можно зарегистрировать собственную URL-схему, которая в дальнейшем может использоваться другими приложениями Б или В для вызова приложения А с заданными параметрами.
URL-схемы являются довольно удобным способом передачи данных в iOS-приложение из, например, другого iOS-приложения, зачастую в весьма специфических ситуациях. Например автору этого блога в определенный момент времени пришлось искать способ передачи параметров одного сложного объекта разрабатываемой системы от одного пользователя мобильного приложения другому пользователю.
Если Вы гадаете, для чего нужно так извращаться, я приведу Вам практический пример. Представьте себе, что Вы разрабатываете мобильную часть сложной клиент-серверной системы, в которой пользователь оперирует некими сложными объектами. Пользователь может создавать, редактировать, удалять эти объекты из мобильного приложения. В определенный момент времени перед Вами возникает задача передачи параметров такого сложного объекта от одного пользователя к другому.
Одним из способов решить данную задачу будет реализовать в мобильном приложении поддержку специальной URL-схемы, и дать пользователям возможность посылать из приложения электронные письма со специально сформированной строкой вида appurlscheme://id , где appurlscheme:// представляет собой URL-схему, а id — идентификатор объекта, которым пользователь хочет поделиться с товарищем.
Получатель письма может перейти по этой ссылке (а все это безобразие будет выглядеть как обычная ссылка), только вместо мобильного Safari откроется наше приложение, которое при открытии получит параметр id и запросит у сервера копию объекта (чтобы не попортить объект отправителя). И дело в шляпе! 🙂
Как это сделать?
Ниже я приведу пример построения пары приложений, одно из которых будет использовать URL-схему для вызова другого и передачи в него текстовой строки. Используя данный пример нетрудно построить более сложные и практически полезные приложения.
Для реализации всего нижеперечисленного необходимо устройство с iOS для запуска приложений.
Приложение Sender
Данное приложение будет вызывать другое приложение (которое мы назовем Receiver) и передавать в него данные. Создайте новый проект с названием Sender на базе шаблона Single View Application.
Рис. 1. Создаем приложение Sender
Далее приведите h-файл view controller-а к следующему виду:
Далее идем в Interface Builder и создаем на нашем View 3 кнопки и 1 TextField, располагая их примерно так, как на рисунке ниже.
Рис. 2. Внешний вид приложения Sender
Соединяем необходимые IBAction-ы и IBOutlet (надеюсь, это не составит серьезных затруднений для моих читателей).
После этого необходимо добавить следующий код в m-файл view controller-а:
Ключевыми здесь являются два метода — openURL и canOpenURL .
Метод openURL осуществляет переход непосредственно к контенту, расположенному по передаваемой ссылке.
Метод canOpenURL проверяет, может ли iOS открыть передаваемую ссылку. Если в качестве URL-схемы будет передана схема, не зарегистрированная в iOS (и отличная, например, от http:// , https:// , ftp:// и т.п.), этот метод вернет NO .
В случае методов openYoutube: и openMaps: в результате выполнения метода openURL произойдет запуск соответствующих мобильных приложений iOS — YouTube и Maps. Я не буду подробно останавливаться на этих двух методах, как формировать адресную строку для них прекрасно описано в документации Apple.
Про метод openReceiverApp: поговорим чуть подробнее. В этом методы мы берем введенную пользователем в TextField строку, преобразуем ее к виду валидной строки URL при помощи метода stringByAddingPercentEscapesUsingEncoding: (в результате этого, например, пробелы заменяются на строку вида %20 ), добавляем перед результатом строку receiverapp:// , которая и будет нашей кастомной URL-схемой в данном примере.
После этого мы с помощью метода canOpenURL: проверяем, может ли iOS запустить приложение Receiver с помощью нашей ссылки. Если может, просто запускаем Receiver. Если не может — выдаем соответствующее сообщение пользователю.
Если запустить полученное приложение на мобильном устройстве и попробовать понажимать на кнопки, мы убедимся, что приложение успешно запускает проигрывание видео в YouTube и отображение объекта по указанным координатам в Maps (см. рис. ниже).
Рис. 3. Результат нажатия на кнопку вызова Maps
Рис. 4. Результат нажатия на кнопку вызова YouTube
При этом, если прямо сейчас нажать на кнопку запуска приложения Receiver, то мы получим сообщение об ошибке, как на рис. ниже.
Вашей URL-схемой могут воспользоваться и сторонние разработчики для расширения функциональности своих приложений. Перечень существующих URL-схем, используемых в популярных приложениях можно найти, например, вот тут.
Простое начало
Пожалуй, начнем с простого. Довольно распространенная задача — вызвать браузер Safari из своего приложения, да и мало того что вызвать! Нужно чтобы браузер открыл интересующую нас страницу. Без лишних слов, делается это так:
Что мы сделали в этом примере? Мы «попросили» наше приложение открыть URL. Как система понимает в каким приложением открыть данный URL? Можно подумать, что если мы тут говорим про URL то это обязательно интернет-адрес и система всегда будет вызывать Safari. Убедимся, что это не так. Позвоним по номеру 123-456-789:
Что делает этот код? Я думаю вы уже догадались, что он открывает приложение «Телефон» и набирает номер.
Как же система понимает какое приложение открывать?
Рассмотрим как выглядит URL, который мы отправляем в метод openURL::
Разделим эту строку на две части, разделителем будем считать три знака — ://. Становиться ясно, что первая часть (в наших случаях это http или tel) — это название схемы, а вторая часть — какие-либо данные. В первом случае номер телефона, во втором — адрес.
Итак, система анализирует название схемы и вызывает соответствующее приложение передавая ему данные. Значит, система где-то хранит названия схем и соответствующие им приложения!
Сделаем небольшое отступление. Выше я обещал что вы узнаете как вызывать Google Maps, iTunes, Youtube и SMS приложения. Об этом можно почитать тут. Я не стану это описывать в данное статье т.к. принцип для всего одинаковый.
Это объясняется тем, что запись URL-адресов возможна только определенными символами из разрешенного набора, а символы кириллицы в него не входят. Поэтому адрес, в котором используется кириллица, шифруется, хотя при этом ссылка все равно будет работать.
Постановка задачи
Давайте на простом и типичном примере посмотрим как можно добавить обработку глубоких ссылок в приложение.
Допустим, у нас есть сайт с вакансиями, на котором каждой вакансии соответствует ссылка вида https://awesomejobs.com/jobs/. Мы хотим, чтобы пользователям, у которых установленно наше приложение, при клике на ссылку предлагалось открыть её или через наше приложение, или через браузер.
Реализация
- Начнем с добавления нового intent-filter в Activity , на которую мы хотим направлять пользователя. Это нужно для того, чтобы система понимала какого вида ссылки мы хотим обрабатывать. В AndroidManifest.xml нужно добавить следующие строки:
- action android.intent.action.VIEW говорит о том, что Activity предназначена для отображения контента.
- category android.intent.category.BROWSABLE требуется для того, чтобы мобильный браузер смог выполнить открытие ссылки из результатов поиска Google. Без этого аттрибута при клике по ссылке в мобильном браузере она будет открываться в самом же браузере.
category android.intent.category.DEFAULT требуется если вы хотите чтобы приложение обрабатывало ссылку с любого ссылающегося сайта. Интент, который используется при переходе из результатов поиска Google знает, что должен открыть именно ваше приложение, поэтому явно указывает на него как на получателя. Ссылки же с других сайтов не знают ничего о вашем приложении, поэтому категория DEFAULT говорит о том, что приложение способно принять неявный Intent от них.
2. Наше приложение научилось ловить интенты извне, теперь нам нужно написать код для того, чтобы перехватывать их, доставать id вакансии и с ним уже делать всё, что нам захочется (запрашивать с сервера информацию о вакансии с таким id и отображать её, например).
Для этого в метод onCreate активити, которую мы использовали в манифесте, добавим следующий код:
Активити запускается интентом, содержащем в себе ссылку. data — это и есть не что иное, как наша ссылка. Получив её и выполнив необходимые проверки, мы вырезаем из неё id вакансии, подтягиваем её детали с сервера и отображаем на экране. Всё предельно просто.
Если запустить полученное приложение на мобильном устройстве и попробовать понажимать на кнопки, мы убедимся, что приложение успешно запускает проигрывание видео в YouTube и отображение объекта по указанным координатам в Maps (см. рис. ниже).
Шаг 3: Открытие URL для общения
Для начала откройте файл SenderViewController.m из панели навигатора. Под @implementation добавьте следующую строку, чтобы синтезировать наше свойство:
Давайте также удостоверимся, что мы соблюдаем правильные правила управления памятью и очистим сохранение, которое мы имели в нашем свойстве выше super dealloc; добавлять:
Наконец, в нашем методе viewDidUnload ниже «super viewDidUnload;» добавьте:
Краткое изложение схем URL-адресов заключается в том, что схемы URL-адресов позволяют приложениям регистрировать собственный протокол для передачи данных. Некоторые распространенные примеры протоколов, которые вы можете использовать на регулярной основе: «https: //», «https: //» и «ftp: //». Например, приложение для закладок может захотеть зарегистрировать «bookmark: // «, чтобы другие приложения могли создавать закладки для ссылок, используя схему URL,» bookmark: // www.envato.com « . Приложения не могут зарегистрироваться по протоколу» http: // «, хотя некоторые приложения Apple нарушают это правило и регистрируются как» http : // «для открытия приложений, таких как Карты, iTunes и YouTube. Наше приложение Receiver будет регистрироваться как« readtext: // texthere ». Мы можем открыть эти URL, вызвав метод openURL: Когда мы используем openURL: он запустит указанное приложение и передаст предоставленные вами данные.
Добавьте следующие методы в файл SenderViewController.m:
NSString *URLEncodedText = self.textBox.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding;
UIAlertView *alertView = UIAlertView alloc initWithTitle:@»Receiver Not Found» message:@»The Receiver App is not installed. It must be installed to send text.»
Эти методы используют метод openURL UIApplication для отправки данных в другие приложения. Apple зарегистрировала приложение «Карты» и приложение YouTube по существу с «http: //», поэтому мы просто вызываем openURL для этих URL-адресов. Для создания нашего URL-адреса мы также использовали stringByAddingPercentEscapesUsingEncoding: метод, чтобы убедиться, что строка является действительным URL-адресом при кодировании URL-адреса. строка (мы расшифруем ее в нашем приложении Receiver). Для нашего пользовательского URL «readtext: //» мы сначала проверяем, можно ли открыть ссылку с помощью canOpenURL . По сути, это проверяет, установлено ли приложение, которое зарегистрировано для этой конкретной схемы URL, и если это так, мы можем открыть URL с нашим текстом. Если приложение не установлено, мы отображаем сообщение об ошибке. Помните, что когда вы публикуете свое приложение для общего доступа, схема URL, от которой зависит ваше приложение, может не работать, поскольку другое приложение не установлено. Вы всегда должны выполнять canOpenURL при открытии не-http: // схем URL.
Идите вперед и создайте и запустите приложение. Обратите внимание, что кнопки «Карты» и «YouTube» открывают соответствующие приложения. Кроме того, кнопка «Отправленный текст» возвращает сообщение об ошибке, поскольку нам еще предстоит создать приложение «Приемник».
Шаг 4. Создание приложения Receiver
Создайте новый проект XCode и выберите «Просмотреть приложение на основе». Нажмите «Далее». Назовите проект «Получатель» и введите свой идентификатор компании. В этом проекте будет размещено приложение, которое считывает информацию, отправленную приложением «Отправитель».