О Хэндофф

Хэндофф является возможностью, представленной в iOS 8 и OS X v10.10, который передает пользовательские действия среди многократных устройств, связанных с тем же пользователем.

Хэндофф позволяет пользователю переключиться от одного устройства до другого и продолжать продолжающееся действие беспрепятственно, не реконфигурировав каждого независимо от устройств. Например, пользователь, просматривающий длинную статью в Safari на Mac, может переместиться в соседнее устройство на iOS, это подписывается в iCloud с тем же Apple ID, и откройте ту же веб-страницу автоматически в Safari на iOS в той же позиции прокрутки как на исходном устройстве.

../Art/continuation_2x.png

Приложения Apple, такие как Safari, Почта, Карты, Контакты, Примечания, Календарь и Напоминания используют общедоступный APIs для реализации Хэндофф для iOS 8 и OS X v10.10. Сторонний разработчик может использовать тот же APIs для реализации Хэндофф в приложениях, совместно использующих Команду разработчика ID. Такие приложения должны или быть распределены через App Store или подписаны зарегистрированным разработчиком.

Взаимодействия Хэндофф

Передача пользовательского действия включает три фазы:

Основанные на документе приложения (т.е. приложения на основе подкласса NSDocument или UIDocument), предоставьте встроенную поддержку для всех трех фаз handoff сценария. Респондент возражает (подклассы NSResponder и UIResponder) предоставьте встроенную поддержку для обновления пользовательских действий и управления их текущим статусом. Ваше приложение может также создать, обновить и продолжать пользовательские действия непосредственно, работая особенно с делегатом приложения.

Механизм Хэндофф зависит прежде всего от объектов единого класса в Основе, NSUserActivity, с поддержкой дополнительного маленького APIs в UIKit и AppKit. Приложения инкапсулируют информацию о действиях пользователя в NSUserActivity объекты и те действия становятся кандидатами на продолжение на других устройствах. Хэндофф данного пользовательского действия требует, чтобы исходное приложение определяло что действие NSUserActivity возразите как текущее действие, сохраните подходящие данные для продолжения на другом устройстве и отправьте данные в возобновляющееся устройство. В то время как синхронизация данных более широкого масштаба обрабатывается через iCloud, Хэндофф передает только достаточно информации между устройствами для описания самого действия.

На продолжающемся устройстве пользователь уведомляется, что действие доступно для продолжения. Если пользователь принимает решение продолжать действие, надлежащее приложение запускается и предоставлено данными полезной нагрузки действия. Пользовательское действие может продолжаться только в приложении, имеющем ту же Команду разработчика ID как исходное приложение действия, и это поддерживает тип действия. Поддерживаемые типы действия указаны в приложении Info.plist под NSUserActivityTypes ключ. Так, продолжающееся устройство выбирает надлежащее приложение на основе целевой Команды ID, свойство типа действия возникновения NSUserActivity объект, и дополнительно свойство заголовка объекта действия. От информации в пользовательском объекте действия userInfo словарь, продолжающееся приложение может тогда сконфигурировать свой пользовательский интерфейс и утвердить соответственно для бесшовного продолжения действия пользователя.

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

Основанные на документе приложения на iOS и OS X автоматически поддерживают Хэндофф, как описано в Поддержке Пользовательского Действия в Основанных на документе Приложениях.

Пользовательский объект действия

NSUserActivity объект инкапсулирует состояние пользовательского действия в приложении на определенном устройстве. Это - основной объект в механизме Хэндофф. Исходное приложение создает пользовательский объект действия для каждого пользовательского действия, которое оно поддерживает для возможного handoff к другому устройству. Например, веб-браузер создал бы пользовательский объект действия для каждой открытой вкладки или окна, в котором пользователь просматривает URLs. Однако только соответствие объекта действия вкладке frontmost или окну является текущим в установленный срок, и только текущее действие доступно для продолжения.

NSUserActivity объект идентифицируется activityType и title свойства. Это имеет a userInfo словарь для содержания его данных состояния и грязного названного флага needsSave поддерживать ленивое обновление его состояния его делегатом. NSUserActivity метод addUserInfoEntriesFromDictionary: позволяет делегату и другим клиентам объединить данные состояния в userInfo словарь.

Для получения дополнительной информации посмотрите Ссылку класса NSUserActivity.

Пользовательский делегат действия

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

Пользовательский делегат действия представлен delegate свойство NSUserActivity и ответственно за удержание данных NSUserActivity пользовательский информационный словарь объекта, актуальный так, чтобы это могло быть передано к другому устройству. Когда системе нужно действие, которое будет обновлено, такой как, прежде чем действие будет продолжаться на другом устройстве, это вызывает делегата userActivityWillSave: метод. Можно реализовать этот обратный вызов для создания обновлений к переносящим данные свойствам объекта таким как userInfo, title, и т.д. Один раз системные вызовы этот метод, это сбрасывает needsSave к NO. Измените это значение на YES если что-то происходит, который изменяется userInfo или другие переносящие данные свойства снова.

Также вместо того, чтобы реализовать делегата userActivityWillSave: метод, как описано в предыдущем абзаце, у Вас может быть UIKit, или AppKit управляют пользовательским действием автоматически. Приложение выбирает в это поведение путем установки объекта респондента userActivity свойство и реализация респондента updateUserActivityState: обратный вызов, как описано в Управлении Пользовательским Действием С Респондентами. Это расположение предпочтено, если оно работает на Ваше пользовательское действие.

Для получения дополнительной информации посмотрите Ссылку на протокол NSUserActivityDelegate.

Поддержка платформы приложения

UIKit и AppKit предоставляют поддержку для Хэндофф в документе, респондента, и делегата приложения классы. Несмотря на то, что существуют незначительные поведенческие различия между платформами, основной механизм, позволяющий приложениям сохранить и восстановить пользовательские действия, является тем же, и APIs является тем же.

Поддержка пользовательского действия в основанных на документе приложениях

Если Вы добавляете, основанное на документе приложение на iOS и OS X автоматически поддерживает Хэндофф NSUbiquitousDocumentUserActivityType ключ и значение для каждого CFBundleDocumentTypes запись в Вашем приложении Info.plist файл списка свойств. Если этот ключ присутствует, NSDocument и UIDocument автоматически создайте NSUserActivity объекты для основанных на iCloud документов данного типа документа. Значение NSUbiquitousDocumentUserActivityType строка, представляющая NSUserActivity тип действия объекта. Т.е. Вы обеспечиваете тип действия для каждого типа документа, поддерживаемого Вашим основанным на документе приложением. Многократные типы документов могут иметь тот же тип действия. NSDocument и UIDocument автоматически поместите значение их fileURL свойство в объект действия userInfo словарь с NSUserActivityDocumentURLKey.

В OS X AppKit может автоматически восстановить NSUserActivity объекты, создаваемые таким образом. Это делает так если метод делегата приложения application:continueUserActivity:restorationHandler: возвраты NO или не реализован. В этой ситуации документ открыт с NSDocumentController метод openDocumentWithContentsOfURL:display:completionHandler: и получает a restoreUserActivityState: сообщение.

Для получения дополнительной информации посмотрите Принятие Хэндофф в Основанных на документе Приложениях. Также см. Ссылку класса NSDocument и Ссылку класса UIDocument.

Управление пользовательским действием с респондентами

UIKit и AppKit могут управлять пользовательским действием при установке его как объекта респондента userActivity свойство. Когда респондент знает, что состояние действия грязно, оно должно установить объект needsSave свойство к YES. Система автоматически сохраняет NSUserActivity объект в подходящее время, сначала давая респонденту возможность обновить состояние действия через updateUserActivityState: обратный вызов. Ваш подкласс респондента должен переопределить updateUserActivityState: метод для добавления данных состояния к пользовательскому объекту действия. Если многократные респонденты совместно используют сингл NSUserActivity объект, они все получают updateUserActivityState: обратный вызов, когда система обновляет пользовательский объект действия. Прежде чем обратные вызовы обновления отправляются, объект действия userInfo словарь очищен.

На OS X, NSUserActivity когда окно документа становится главным окном т.е. объекты, которыми управляет AppKit и связанные с респондентами автоматически, становятся текущими на основе главного окна и цепочки респондента. На iOS, однако, для NSUserActivity объекты, которыми управляет UIKit, необходимо или вызвать becomeCurrent явно или имейте документ NSUserActivity объектный набор на a UIViewController объект, который находится в иерархии представления, когда приложение прибывает в передний план.

Респондент может установить userActivity свойство к nil разъединять себя с действием. Когда NSUserActivity объект, которым управляет платформа приложения, больше не связал респондентов или документы, это автоматически лишено законной силы.

Для получения дополнительной информации посмотрите Принятие Хэндофф в Респондентах. Также см. Ссылку класса NSResponder или Ссылку класса UIResponder.

Продолжение действия Используя делегата приложения

Делегат приложения является основной точкой входа для продолжения пользовательского действия в базируемом приложении не документа. Как только пользователь реагирует на уведомление путем желания продолжать действие, Хэндофф запускает надлежащее приложение и отправляет делегата приложения application:willContinueUserActivityWithType: сообщение. Приложение позволяет пользователю знать, что действие будет продолжаться вскоре. Между тем, NSUserActivity когда делегат получает, объект поставлен application:continueUserActivity:restorationHandler: сообщение. Необходимо реализовать этот метод для конфигурирования приложения таким способом, которым это может возобновить действие, представленное пользовательским объектом действия.

application:continueUserActivity:restorationHandler: сообщение включает блок, обработчик восстановления, который можно дополнительно вызвать, если приложение использует вспомогательного респондента или объекты документа для выполнения возобновляющегося пользовательского действия. Создайте эти объекты (или выберите их, если кэшируется), и передайте их обработчику восстановления в NSArray параметр. Система тогда отправляет каждый объект a restoreUserActivityState: сообщение, передавая пользовательский объект действия. Каждый объект может использовать действие userInfo данные для возобновления действия. Для получения дополнительной информации об использовании этого обработчика восстановления см. описание application:continueUserActivity:restorationHandler: метод в Ссылке на протокол NSApplicationDelegate.

Если Вы не реализуете application:continueUserActivity:restorationHandler: или возвратитесь NO от него, и Ваше приложение основано на документе, AppKit может автоматически возобновить действие, как описано в Поддержке Пользовательского Действия в Основанных на документе Приложениях. Для получения дополнительной информации посмотрите Продолжение Действия.