Межсвязь приложений

Приложения связываются только косвенно с другими приложениями на устройстве. Можно использовать AirDrop для совместного использования файлов и данных с другими приложениями. Можно также определить пользовательскую схему URL так, чтобы приложения могли отправить информацию в приложение с помощью URLs.

Поддержка AirDrop

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

Отправка файлов и данных к другому приложению

Чтобы отправить файлам и использованию данных AirDrop, используйте a UIActivityViewController возразите для отображения листа действия от использования пользовательского интерфейса. При создании этого контроллера представления Вы указываете объекты данных, которые Вы хотите совместно использовать. Контроллер представления выводит на экран только те действия, поддерживающие указанные данные. Для AirDrop можно указать изображения, строки, URLs и несколько других типов данных. Можно также передать пользовательские объекты, принимающие UIActivityItemSource протокол.

Для отображения действия просматривают контроллер, можно использовать код, подобный показанному в Перечислении 6-1. Контроллер представления действия автоматически использует тип указанного объекта определить, какие действия вывести на экран в действии покрывают. Вы не должны указывать действие AirDrop явно. Однако можно препятствовать тому, чтобы лист вывел на экран определенные типы с помощью контроллера представления excludedActivityTypes свойство. Когда отображение действия просматривает контроллер на iPad, необходимо использовать легкую сдобу.

Перечисление 6-1  , Выводящее на экран действие, покрывает на iPhone

- (void)displayActivityControllerWithDataObject:(id)obj {
   UIActivityViewController* vc = [[UIActivityViewController alloc]
                                initWithActivityItems:@[obj] applicationActivities:nil];
    [self presentViewController:vc animated:YES completion:nil];
}

Для получения дополнительной информации об использовании контроллера представления действия посмотрите Ссылку класса UIActivityViewController. Для полного списка действий и типов данных они поддерживают, видят Ссылку класса UIActivity.

Получение файлов и данных, отправленных в приложение

Для получения файлов, отправленных в использование приложения AirDrop, сделайте следующее:

  • В XCode объявите поддержку типов документов, Ваше приложение способно к открытию.

  • В Вашем делегате приложения реализуйте application:openURL:sourceApplication:annotation: метод. Используйте тот метод для получения данных, отправленных другим приложением.

  • Будьте подготовлены искать файлы в своем приложении Documents/Inbox каталог и перемещает их из того каталога по мере необходимости.

Вкладка Info Вашего проекта XCode содержит раздел Document Types для указания типов документов Ваши поддержки приложений. Как минимум необходимо указать имя для типа документа и одного или более UTIs, представляющих тип данных. Например, для объявления поддержки файлов PNG Вы включали бы public.png как строка UTI. iOS использует указанный UTIs, чтобы определить, приемлемо ли Ваше приложение открывать данный документ.

После передачи приемлемого документа контейнеру Вашего приложения iOS запускает Ваше приложение (в случае необходимости) и вызывает application:openURL:sourceApplication:annotation: метод его делегата приложения. Если Ваше приложение находится на переднем плане, необходимо использовать этот метод, чтобы открыть файл и вывести на экран его пользователю. Если Ваше приложение в фоновом режиме, Вы могли бы решить только отметить, что файл там так, чтобы можно было открыть его позже. Поскольку файлы, переданные через AirDrop, шифруются с помощью защиты данных, Вы не можете открыть файлы, если в настоящее время не разблокировано устройство.

Файлы, переданные Вашему использованию приложения AirDrop, помещаются в Ваше приложение Documents/Inbox каталог. Ваше приложение имеет разрешение считать и удалить файлы в этом каталоге, но это не имеет разрешения записать в файлы. Если Вы планируете изменить файл, необходимо переместить его из Inbox каталог прежде, чем сделать так. Рекомендуется удалить файлы из Inbox каталог, когда Вам больше не нужны они.

Для получения дополнительной информации о типах подтверждающего документа в Вашем приложении, см. Основанное на документе Руководство по программированию Приложения для iOS.

Используя схемы URL связаться с приложениями

Схема URL позволяет Вам связаться с другими приложениями через протокол, который Вы определяете. Для передачи с приложением, реализующим такую схему необходимо создать соответственно отформатированный URL и попросить, чтобы система открыла ее. Для реализации поддержки пользовательской схемы необходимо объявить поддержку схемы и дескриптора, поступающего URLs, использующий схему.

Отправка URL к другому приложению

Когда Вы хотите отправить данные в приложение, реализующее пользовательскую схему URL, создайте соответственно отформатированный URL и вызовите openURL: метод объекта приложения. openURL: метод запускает приложение с зарегистрированной схемой и передает Ваш URL ему. В той точке управление передает новому приложению.

Следующий фрагмент кода иллюстрирует, как одно приложение может запросить службы другого приложения («todolist» в этом примере, гипотетическая пользовательская схема, зарегистрированная приложением):

NSURL *myURL = [NSURL URLWithString:@"todolist://www.acme.com?Quarterly%20Report#200806231300"];
[[UIApplication sharedApplication] openURL:myURL];

Если Ваше приложение определяет пользовательскую схему URL, оно должно реализовать обработчик для той схемы, как описано в Реализации Пользовательских Схем URL. Для получения дополнительной информации о поддерживаемых системой схемах URL, включая информацию о том, как отформатировать URLs, посмотрите Apple Ссылка Схемы URL.

Реализация пользовательских схем URL

Если Ваше приложение может получить, особенно отформатировал URLs, необходимо зарегистрировать соответствующие схемы URL в системе. Приложения часто используют пользовательские схемы URL продать службы к другим приложениям. Например, поддержки приложений Карт URLs для отображения определенных расположений карты.

Регистрация пользовательских схем URL

Для регистрации типа URL для приложения включайте CFBundleURLTypes введите свое приложение Info.plist файл. CFBundleURLTypes ключ содержит массив словарей, каждый из которых определяет схему URL поддержки приложений. Таблица 6-1 описывает ключи и значения для включения в каждый словарь.

Табличные 6-1  Ключи и значения CFBundleURLTypes свойство

Ключ

Значение

CFBundleURLName

Строка, содержащая абстрактное имя схемы URL. Для обеспечения уникальности рекомендуется указать стиль обратного DNS идентификатора, например, com.acme.myscheme.

Строка, которую Вы указываете, также используется в качестве ключа в Вашем приложении InfoPlist.strings файл. Значение ключа является человекочитаемым именем схемы.

CFBundleURLSchemes

Массив строк, содержащих имена схемы URL — например, http, mailto, tel, и sms.

Обработка URL-запросов

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

Если Ваше приложение не работает, когда URL-запрос наступает, это запущено и перемещено в передний план так, чтобы это могло открыть URL. Реализация Вашего application:willFinishLaunchingWithOptions: или application:didFinishLaunchingWithOptions: метод должен получить URL из своего словаря опций и определить, может ли приложение открыть его. Если это может, возвратиться YES и позвольте Вашему application:openURL:sourceApplication:annotation: (или application:handleOpenURL:) дескриптор метода фактическое открытие URL. (Если Вы реализуете оба метода, оба должны возвратиться YES прежде чем URL может быть открыт.) Рисунок 6-1 показывает измененную последовательность запуска для приложения, которое просят открыть URL.

Рисунок 6-1  , Запускающий приложение для открытия URL

Если Ваше приложение работает, но в фоновом режиме или приостановлено, когда URL-запрос наступает, это перемещено в передний план для открытия URL. Вскоре после того, системные вызовы делегат application:openURL:sourceApplication:annotation: проверить URL и открыть его. Рисунок 6-2 показывает измененный процесс для перемещения приложения к переднему плану для открытия URL.

Рисунок 6-2  , Будящий фоновое приложение для открытия URL

Весь URLs передается Вашему приложению в NSURL объект. Вам решать определить формат URL, но NSURL класс соответствует спецификации RFC 1808 года и поэтому поддерживает большинство соглашений форматирования URL. В частности класс включает методы, возвращающие различные части URL, как определено RFC 1808, включая пользователя, пароль, запрос, фрагмент и строки параметров. «Протокол» для Вашей пользовательской схемы может использовать эти части URL для передачи различных видов информации.

В реализации application:openURL:sourceApplication:annotation: показанный в Перечислении 6-2, переданный - в объекте URL передает специфичную для приложения информацию в своем запросе и частях фрагмента. Делегат извлекает эту информацию — в этом случае, имя к - действительно определяют задачу, и дата, задача должна — и с ним, создает объект модели приложения. Этот пример предполагает, что пользователь использует Григорианский календарь. Если Ваши негригорианские календари поддержек приложений, Вы должны разработать свою схему URL соответственно и подготовлены обработать те другие типы календаря в Вашем коде.

Перечисление 6-2  , Обрабатывающее URL-запрос на основе пользовательской схемы

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([[url scheme] isEqualToString:@"todolist"]) {
        ToDoItem *item = [[ToDoItem alloc] init];
        NSString *taskName = [url query];
        if (!taskName || ![self isValidTaskString:taskName]) { // must have a task name
            return NO;
        }
        taskName = [taskName stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 
        item.toDoTask = taskName;
        NSString *dateString = [url fragment];
        if (!dateString || [dateString isEqualToString:@"today"]) {
            item.dateDue = [NSDate date];
        } else {
            if (![self isValidDateString:dateString]) {
                return NO;
            }
            // format: yyyymmddhhmm (24-hour clock)
            NSString *curStr = [dateString substringWithRange:NSMakeRange(0, 4)];
            NSInteger yeardigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(4, 2)];
            NSInteger monthdigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(6, 2)];
            NSInteger daydigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(8, 2)];
            NSInteger hourdigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(10, 2)];
            NSInteger minutedigit = [curStr integerValue];
 
            NSDateComponents *dateComps = [[NSDateComponents alloc] init];
            [dateComps setYear:yeardigit];
            [dateComps setMonth:monthdigit];
            [dateComps setDay:daydigit];
            [dateComps setHour:hourdigit];
            [dateComps setMinute:minutedigit];
            NSCalendar *calendar = [s[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
            NSDate *itemDate = [calendar dateFromComponents:dateComps];
            if (!itemDate) {
                return NO;
            }
            item.dateDue = itemDate;
        }
 
        [(NSMutableArray *)self.list addObject:item];
        return YES;
    }
    return NO;
}

Обязательно проверьте ввод, который Вы получаете от URLs, переданного Вашему приложению; посмотрите Ввод Проверки и Межпроцессное взаимодействие в Безопасном Руководстве по Кодированию, чтобы узнать, как избежать проблем, связанных с обработкой URL. Для приобретения знаний о схемах URL, определенных Apple, посмотрите Apple Ссылка Схемы URL.

Отображение Пользовательского Изображения Запуска, Когда Открыт URL

Приложения, поддерживающие пользовательские схемы URL, могут обеспечить пользовательское изображение запуска для каждой схемы. Когда система запускает Ваше приложение для обработки URL, и никакой соответствующий снимок не доступен, это выводит на экран изображение запуска, которое Вы указываете. Для указания изображения запуска обеспечьте изображение PNG, имя которого использует следующие соглашения о присвоении имен:

<базовое имя>-<url_scheme> <other_modifiers>.png

В этом соглашении о присвоении имен базовое имя представляет имя базового изображения, указанное UILaunchImageFile введите свое приложение Info.plist файл. Если Вы не указываете пользовательское базовое имя, используйте строку Default. <url_scheme> часть имени является Вашим именем схемы URL. Для указания универсального запуска отображают для myapp Схема URL, Вы включали бы файл образа с именем Default-myapp@2x.png в пакете приложения. (@2x модификатор показывает, что изображение предназначается для дисплеев Сетчатки. Если бы Ваше приложение также поддерживает дисплеи стандартного разрешения, Вы также обеспечили бы a Default-myapp.png изображение.)

Для получения информации о других модификаторах можно включать в названия картинки запуска, видеть описание UILaunchImageFile назовите ключ в информационной Ключевой Ссылке Списка свойств.