О Хэндофф
Хэндофф является возможностью, представленной в iOS 8 и OS X v10.10, который передает пользовательские действия среди многократных устройств, связанных с тем же пользователем.
Хэндофф позволяет пользователю переключиться от одного устройства до другого и продолжать продолжающееся действие беспрепятственно, не реконфигурировав каждого независимо от устройств. Например, пользователь, просматривающий длинную статью в Safari на Mac, может переместиться в соседнее устройство на iOS, это подписывается в iCloud с тем же Apple ID, и откройте ту же веб-страницу автоматически в Safari на iOS в той же позиции прокрутки как на исходном устройстве.
Приложения 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 может автоматически возобновить действие, как описано в Поддержке Пользовательского Действия в Основанных на документе Приложениях. Для получения дополнительной информации посмотрите Продолжение Действия.