Перемещение вручную в Xamarin.iOSHandoff in Xamarin.iOS

В этой статье рассматривается работа с переходной приложения Xamarin.iOS для передачи действий пользователей между приложениями под управлением пользователя на других устройствах.This article covers working with Handoff in a Xamarin.iOS app to transfer user activities between apps running on the user's other devices.

Apple представила переходной в iOS 8 и OS X Yosemite (10.10) для предоставления общий механизм для пользователя, для передачи действий работы на одном из своих личных устройств, на другое устройство под управлением того же приложения или другого приложения, который поддерживает же действие.Apple introduced Handoff in iOS 8 and OS X Yosemite (10.10) to provide a common mechanism for the user to transfer activities started on one of their devices, to another device running the same app or another app that supports the same activity.

В этой статье посмотрите на пути к предоставлению действия, совместное использование в приложении Xamarin.iOS и рассматриваются framework переходной подробно:This article will take a quick look at enabling activity sharing in a Xamarin.iOS app and cover the Handoff framework in detail:

Об ЭстафетнойAbout Handoff

Перемещение вручную (также известный как непрерывности) был предложен компании Apple в iOS 8 и OS X Yosemite (10.10) позволяет пользователю начать действие на одном из своих устройств (iOS или Mac) и по-прежнему и том же действии на другом устройствах (которые определяются iClou пользователя d учетной записи).Handoff (also known as Continuity) was introduced by Apple in iOS 8 and OS X Yosemite (10.10) as a way for the user to start an activity on one of their devices (either iOS or Mac) and continue that same activity on another of their devices (as identified by the user's iCloud Account).

Переадресуемое был развернут в iOS 9, чтобы также поддерживают новые, улучшенные возможности поиска.Handoff was expanded in iOS 9 to also support new, enhanced Search capabilities. Дополнительные сведения см. в разделе наших улучшенные возможности поиска документации.For more information, please see our Search Enhancements documentation.

Например пользователь может начать сообщение электронной почты на своих устройствах iPhone и автоматически продолжается по электронной почте на их компьютере Mac, все те же сведения сообщения с заполненными полями и курсор в том же расположении, они остался в iOS.For example, the user can start an email on their iPhone and seamlessly continue the email on their Mac, with all of the same message information filled in and the cursor in the same location that they left it in iOS.

Какие-либо приложения, использующих одинаковый идентификатор команды , подходящих для с помощью перемещение вручную для продолжения действий пользователя в приложениях, до тех пор, пока эти приложения могут быть доставлено через iTunes App Store или со знаком с зарегистрированным разработчиком (для Mac, Enterprise или Ad Hoc приложения).Any of your apps that share the same Team ID are eligible for using Handoff to continue user activities across apps as long as these app are either delivered via the iTunes App Store or signed by a registered developer (for Mac, Enterprise or Ad Hoc apps).

Любой NSDocument или UIDocument приложений автоматически получают переходной поддерживает встроенные и требующих минимальных изменений для поддержки передачи.Any NSDocument or UIDocument based apps automatically have Handoff support built-in, and require minimal changes to support Handoff.

Продолжение действия пользователейContinuing User Activities

NSUserActivity Класса (а также небольшие изменения, UIKit и AppKit) обеспечивает поддержку для определения активности пользователя, который потенциально может быть продолжена на другом устройств пользователя.The NSUserActivity class (along with some small changes to UIKit and AppKit) provides support for defining a user's activity that can potentially be continued on another of the user's devices.

Действие может передаваться другой устройств пользователя, он должен быть инкапсулирован в экземпляре NSUserActivity, помеченная как текущего действия, задать его полезные данные (данные, используемые для выполнения продолжения) и действия, затем должен быть передан в это устройство.For an activity to be passed over to another of the user's devices, it must be encapsulated in an instance NSUserActivity, marked as the Current Activity, have it's payload set (the data used to perform the continuation) and the activity must then be transmitted to that device.

Переадресуемое передает минимальные информацию, чтобы определить действие, чтобы продолжить, с более крупные пакеты данных, синхронизируемого с помощью iCloud.Handoff passes the bare minimum of information to define the activity to be continued, with larger data packets being synced via iCloud.

На получающим устройством пользователь получит уведомление, что действие доступно для продолжения.On the receiving device, the user will receive a notification that an activity is available for continuation. Если пользователь выбирает для продолжения действий на новое устройство, указанное приложение запускается (если еще не запущен) и полезных данных из NSUserActivity для перезагрузки действия.If the user chooses to continue the activity on the new device, the specified app is launched (if not already running) and the payload from the NSUserActivity is used to restart the activity.

Только приложения, которые совместно используют один и тот же разработчик идентификатор команды и реагировать на них заданного тип действия пригодны для продолжения.Only apps that share the same developer Team ID and respond to a given Activity Type are eligible for continuation. Приложение определяет типы действий, которую она поддерживает в разделе NSUserActivityTypes ключа из его Info.plist файла.An app defines the Activity Types that it supports under the NSUserActivityTypes key of its Info.plist file. Учитывая это, продолжение устройства выбирает приложению выполнения продолжения, в соответствии с Идентификатором команды, тип действия и при необходимости название действия.Given this, a continuing device chooses the app to perform the continuation based on the Team ID, Activity Type and optionally the Activity Title.

Принимающее приложение использует сведения из NSUserActivityв UserInfo словаря для настройки его пользовательского интерфейса и восстановить состояние определенного действия, чтобы переход происходит незаметно для пользователя.The receiving app uses information from the NSUserActivity's UserInfo dictionary to configure its user interface and restore the state of the given activity so that the transition appears seamless to the end user.

Если продолжение требуется больше информации, чем может быть отправлено эффективно до NSUserActivity, возобновление работы приложения может отправить вызов исходного приложения и установить один или несколько потоков для передачи необходимых данных.If the continuation requires more information than can be sent efficiently through a NSUserActivity, the resuming app can send a call to the originating app and establish one or more streams to transmit the required data. Например если действие было редактирование большого текстового документа с несколькими образами, потоковая передача потребовался бы для передачи информации, необходимой для продолжения действий на получающим устройством.For example, if the activity was editing a large text document with multiple images, streaming would be required to transfer the information needed to continue the activity on the receiving device. Дополнительные сведения см. в разделе вспомогательные потоки продолжения разделе ниже.For more information, see the Supporting Continuation Streams section below.

Как уже говорилось, NSDocument или UIDocument приложений автоматически получают переходной встроенной поддержки.As stated above, NSDocument or UIDocument based apps automatically have Handoff support built-in. Дополнительные сведения см. в разделе поддерживают перемещение вручную в приложениях на основе документов разделе ниже.For more information, see the Supporting Handoff in Document-Based Apps section below.

Класс NSUserActivityThe NSUserActivity Class

NSUserActivity Класс является основным объектом обмена Эстафетной и используется для инкапсуляции состояние активности пользователей, которая доступна для продолжения.The NSUserActivity class is the primary object in a Handoff exchange and is used to encapsulate the state of a User Activity that is available for continuation. Приложение будет создавать копию NSUserActivity для любого действия, он поддерживает и хочет продолжить на другом устройстве.An app will instantiate a copy of NSUserActivity for any activity it supports and wishes to continue on another device. Например редактор документов создать действие для каждого документа открыт.For example, document editor would create an activity for each document currently open. Тем не менее только первый документ, (отображается в первом окне или вкладке) является текущего действия и поэтому доступна для продолжения.However, only the frontmost document (displayed in the frontmost Window or Tab) is the Current Activity and therefor available for continuation.

Экземпляр NSUserActivity идентифицируется по его ActivityType и Title свойства.An instance of NSUserActivity is identified by both its ActivityType and Title properties. UserInfo Свойство словарь используется для переноса информации о состоянии действия.The UserInfo dictionary property is used to carry information about the state of the activity. Задайте NeedsSave свойства true Если отложенного загрузки сведений о состоянии, с помощью NSUserActivityв делегат.Set the NeedsSave property to true if you want to lazy load the state information via the NSUserActivity's delegate. Используйте AddUserInfoEntries метод для слияния новые данные с других клиентов в UserInfo словаря, когда возникает необходимость сохранять состояние действия.Use the AddUserInfoEntries method to merge new data from other clients into the UserInfo dictionary as required to preserve the activity's state.

Класс NSUserActivityDelegateThe NSUserActivityDelegate Class

NSUserActivityDelegate Позволяет хранить сведения о в NSUserActivityв UserInfo словарь синхронизирован с текущим состоянием действия и обновление.The NSUserActivityDelegate is used to keep information in a NSUserActivity's UserInfo dictionary up-to-date and in sync with the current state of the activity. Когда система нужна информация подлежащее обновлению действие (такие как до продолжения на другом устройстве), он вызывает UserActivityWillSave метод делегата.When the system needs the information in the activity to be updated (such as before continuation on another device), it calls the UserActivityWillSave method of the delegate.

Будет необходимо реализовать UserActivityWillSave метод и вносить изменения NSUserActivity (такие как UserInfo, Titleт. д.) чтобы убедиться, что он по-прежнему отражает состояние текущего действия.You will need to implement the UserActivityWillSave method and make any changes to the NSUserActivity (such as UserInfo, Title, etc.) to ensure that it still reflects the state of the Current Activity. Когда система вызывает UserActivityWillSave метода NeedsSave флаг будет очищен.When the system calls the UserActivityWillSave method, the NeedsSave flag will be cleared. При изменении каких-либо свойств данных действия, необходимо задать NeedsSave для true еще раз.If you modify any of the data properties of the activity, you'll need to set NeedsSave to true again.

Вместо использования UserActivityWillSave способом, описанным выше, можно по желанию прикрепить UIKit или AppKit автоматически управлять активности пользователей.Instead of using the UserActivityWillSave method presented above, you can optionally have UIKit or AppKit manage the user activity automatically. Чтобы сделать это, задайте объект респондент UserActivity свойство и реализуйте UpdateUserActivityState метод.To do this, set the responder object's UserActivity property and implement the UpdateUserActivityState method. См. в разделе поддерживают перемещение вручную в ответчики Дополнительные сведения в приведенном ниже разделе.See the Supporting Handoff in Responders section below for more information.

Поддержка инфраструктуры приложенияApp Framework Support

Оба UIKit (iOS) и AppKit (OS X) предоставляют встроенную поддержку для обработки в NSDocument, отвечающее устройство (UIResponder/NSResponder), и AppDelegate классы.Both UIKit (iOS) and AppKit (OS X) provide built-in support for Handoff in the NSDocument, Responder (UIResponder/NSResponder), and AppDelegate classes. Хотя каждая ОС реализует переходной немного по-разному, базовый механизм и API-интерфейсы совпадают.While each OS implements Handoff slightly differently, the basic mechanism and the APIs are the same.

Действия пользователей в приложениях на основе документовUser Activities in Document-Based Apps

OS X приложения для iOS на основе документов и автоматически поддерживать переходной встроенные.Document-based iOS and OS X apps automatically have Handoff support built-in. Чтобы активировать эту поддержку, необходимо добавить NSUbiquitousDocumentUserActivityType ключ и значение для каждого CFBundleDocumentTypes запись в приложении Info.plist файла.To activate this support, you'll need to add an NSUbiquitousDocumentUserActivityType key and value for each CFBundleDocumentTypes entry in the app's Info.plist file.

Если этот ключ присутствует, оба NSDocument и UIDocument автоматически создавать NSUserActivity экземпляров типа, указанного для документов на основе iCloud.If this key is present, both NSDocument and UIDocument automatically create NSUserActivity instances for iCloud-based documents of the type specified. Вам нужно будет предоставлять типом действия для каждого типа документа, который поддерживает приложение, и несколько типов документов можно использовать один и тот же тип действия.You will need to provide an activity type for each type of document that the app supports and multiple document types can use the same activity type. Оба NSDocument и UIDocument автоматически заполнять UserInfo свойство NSUserActivity с их FileURL значение свойства.Both NSDocument and UIDocument automatically populate the UserInfo property of the NSUserActivity with their FileURL property's value.

В OS X NSUserActivity управляет AppKit и связанный с ответчики, автоматически становятся текущее действие, когда окно документа становится главного окна.On OS X, the NSUserActivity managed by AppKit and associated with responders automatically become the Current Activity when the document’s window becomes the main window. В iOS для NSUserActivity объектов, которыми управляет UIKit, должен либо вызвать метод BecomeCurrent метод явным образом или иметь документа UserActivity свойство установлено UIViewController когда приложение отображается на переднем плане.On iOS, for NSUserActivity objects managed by UIKit, you must either call BecomeCurrent method explicitly or have the document’s UserActivity property set on a UIViewController when the app comes to the foreground.

AppKit автоматически восстановить любой UserActivity свойства, созданные таким образом в OS X. Это происходит, если ContinueUserActivity возвращает метод false или если это Нереализованная.AppKit will automatically restore any UserActivity property created in this way on OS X. This occurs if the ContinueUserActivity method returns false or if it is unimplemented. В этом случае документ открыт с помощью OpenDocument метод NSDocumentController и затем получите RestoreUserActivityState вызова метода.In this situation, the document is opened with the OpenDocument method of the NSDocumentController and it will then receive a RestoreUserActivityState method call.

См. в разделе поддерживают перемещение вручную в приложениях на основе документов Дополнительные сведения в приведенном ниже разделе.See the Supporting Handoff in Document-Based Apps section below for more information.

Действия пользователей и ответчиковUser Activities and Responders

Оба UIKit и AppKit может автоматически управлять действием пользователя, если его значение как объект респондент UserActivity свойство.Both UIKit and AppKit can automatically manage a user activity if you set it as a responder object’s UserActivity property. Если состояние было изменено, нужно будет задать NeedsSave свойство отвечающего UserActivity для true.If the state has been modified, you'll need to set the NeedsSave property of the responder's UserActivity to true. Система автоматически сохранит UserActivity при необходимости после временной респондент для обновления состояния путем вызова его UpdateUserActivityState метод.The system will automatically save the UserActivity when required, after giving the responder time to update the state by calling its UpdateUserActivityState method.

Если несколько ответчики совместное использование одного NSUserActivity экземпляр, они получают UpdateUserActivityState обратного вызова, когда система обновляет объект действия пользователя.If multiple responders share a single NSUserActivity instance, they receive an UpdateUserActivityState callback when the system updates the user activity object. Респондент должен вызывать AddUserInfoEntries метод обновления NSUserActivityв UserInfo словаря, чтобы отразить текущее состояние действия на этом этапе.The responder needs to call the AddUserInfoEntries method to update the NSUserActivity's UserInfo dictionary to reflect the current activity state at this point. UserInfo Словарь очищается перед каждым UpdateUserActivityState вызова.The UserInfo dictionary is cleared before each UpdateUserActivityState call.

Для отмены сам связи с действия, отвечающего устройства можно задать его UserActivity свойства null.To disassociate itself from an activity, a responder can set its UserActivity property to null. Когда управляемый платформу приложения NSUserActivity экземпляр не имеет более связанных ответчики или документов, это автоматически, не прошедшего проверку.When an app framework managed NSUserActivity instance has no more associated responders or documents, it is automatically invalidated.

См. в разделе поддерживают перемещение вручную в ответчики Дополнительные сведения в приведенном ниже разделе.See the Supporting Handoff in Responders section below for more information.

Действия пользователей и AppDelegateUser Activities and the AppDelegate

Приложения AppDelegate составляет его основная точка входа, при обработке продолжение перемещение вручную.Your app's AppDelegate is its primary entry point when handling a Handoff continuation. Когда пользователь отвечает на уведомление о переадресации, соответствующее приложение запускается (если она не запущена) и WillContinueUserActivityWithType метод AppDelegate будет вызываться.When the user responds to a Handoff notification, the appropriate app is launched (if not already running) and the WillContinueUserActivityWithType method of the AppDelegate will be called. На этом этапе приложение должно информировать пользователей о том, запускается продолжение.At this point, the app should inform the user that the continuation is starting.

NSUserActivity Экземпляр доставляется AppDelegateв ContinueUserActivity вызывается метод.The NSUserActivity instance is delivered when the AppDelegate's ContinueUserActivity method is called. На этом этапе необходимо настроить пользовательский интерфейс приложения и по-прежнему данное действие.At this point, you should configure the app's user interface and continue the given activity.

См. в разделе реализации переходной Дополнительные сведения в приведенном ниже разделе.See the Implementing Handoff section below for more information.

Включение переадресации в приложении XamarinEnabling Handoff in a Xamarin App

Из-за требований безопасности, налагаемых перемещение вручную приложение Xamarin.iOS, которое использует платформу переходной необходимо правильно настроить оба на портале разработчика Apple и в файле проекта Xamarin.iOS.Because of the security requirements imposed by Handoff, a Xamarin.iOS app that uses the Handoff framework must be properly configured in both the Apple Developer Portal and in the Xamarin.iOS project file.

Выполните следующие действия:Do the following:

  1. Войдите на портал разработчиков Apple.Log into the Apple Developer Portal.

  2. Щелкните сертификаты, идентификаторы и профили.Click on Certificates, Identifiers & Profiles.

  3. Если вы еще не сделали, щелкнуть идентификаторы и создайте код для приложения (например com.company.appname), иначе изменить свой существующий идентификатор.If you haven't already done so, click on Identifiers and create an ID for your app (e.g. com.company.appname), else edit your existing ID.

  4. Убедитесь, что iCloud службы проверки для данного ИД:Ensure that the iCloud service has been checked for the given ID:

  5. Сохраните изменения.Save your changes.

  6. Щелкните профили подготовки > разработки и создание нового профиля подготовки для вас для разработки приложения:Click on Provisioning Profiles > Development and create a new development provisioning profile for you app:

  7. Скачайте и установите новый профиль подготовки или использовать Xcode, чтобы загрузить и установить профиль.Either download and install the new provisioning profile or use Xcode to download and install the profile.

  8. Измените параметры проекта Xamarin.iOS и убедитесь, что вы используете только что созданный профиль подготовки:Edit your Xamarin.iOS project options and ensure that you are using the provisioning profile that you just created:

  9. Далее следует изменить ваш Info.plist файл и убедитесь, что вы используете идентификатор приложения, который использовался для создания профиля подготовки:Next, edit your Info.plist file and ensure that you are using the App ID that was used to create the provisioning profile:

  10. Прокрутите страницу до фоновые режимы и установите следующие элементы:Scroll to the Background Modes section and check the following items:

  11. Сохраните изменения ко всем файлам.Save the changes to all files.

Эти параметры заданы приложение теперь готов для доступа к API Framework перемещение вручную.With these settings in place, the application is now ready to access the Handoff Framework APIs. Подробные сведения о подготовке, см. в разделе наших подготовки устройств и подготовки приложений руководства.For detailed information on provisioning, please see our Device Provisioning and Provisioning Your App guides.

Реализация перемещение вручнуюImplementing Handoff

Действия пользователей может быть продолжен между приложениями, которые должны быть подписаны один и тот же разработчик идентификатор команды и поддерживают один и тот же тип действия.User activities can be continued among apps that are signed with the same developer Team ID and support the same Activity Type. Реализация передачи в приложение Xamarin.iOS требует создания объекта действия пользователя (либо в UIKit или AppKit), обновление состояния объекта для отслеживания действий и продолжая действия получающим устройством.Implementing Handoff in a Xamarin.iOS app requires you to create a User Activity Object (either in UIKit or AppKit), update the object's state to track the activity, and continuing the activity on a receiving device.

Определение действий пользователейIdentifying User Activities

Является первым этапом реализации перемещение вручную для определения типов действий пользователей, которые поддерживает приложение, и видеть, какие из этих действий являются хорошими кандидатами для продолжения на другом устройстве.The first step in implementing Handoff is to identify the types of user activities that your app supports, and seeing which of those activities are good candidates for continuation on another device. Например: приложение со списком задач могут поддерживать редактирования элементов как один _тип действия пользователя_и поддерживают просмотр списка доступных элементов, что и другой.For example: a ToDo app might support editing items as one User Activity Type, and support browsing the available items list as another.

Приложения можно создать столько пользователя типы действий при необходимости, один для любой функции, которая предоставляет приложение.An app can create as many User Activity Types as are required, one for any function that the app provides. Для конкретного типа действия пользователя приложения должны отслеживать время действия типа начинается и заканчивается и должен поддерживать актуальную информацию о состоянии для продолжения этой задачи на другом устройстве.For each User Activity Type, the app will need to track when an activity of the type begins and ends, and need to maintain up-to-date state information to continue that task on another device.

Действия пользователей может быть продолжен в другом приложении, подписанные один и тот же идентификатор группы без любой взаимно-однозначное сопоставление между приложениями и отправки.User Activities can be continued on any app signed with the same Team ID without any one-to-one mapping between the sending and receiving apps. Например определенное приложение можно создать четыре разные типы действий, которые могут использоваться разные, отдельные приложения на другом устройстве.For example, a given app can create four different types of activities, that are consumed by different, individual apps on another device. Это — это обычное дело, между Mac версии приложения (которое может иметь множество функций и функций) и приложениями iOS, где каждое приложение сосредоточиться на определенной задачи, меньшего размера.This is a common occurrence between a Mac version of the app (that might have many features and functions) and iOS apps, where each app is smaller and focused on a specific task.

Создание действия идентификаторы типаCreating Activity Type Identifiers

Идентификатор типа действия добавляется короткую строку NSUserActivityTypes массив приложения Info.plist файл, используемый для идентификации данного типа действий пользователя.The Activity Type Identifier is a short string added to the NSUserActivityTypes array of the app's Info.plist file used to uniquely identify a given User Activity Type. В массиве для каждого действия, которое поддерживает приложения будет существовать одна запись.There will be one entry in the array for each activity that the app supports. Apple предлагает нотации обратного DNS-стиля для идентификатора типа действия для предотвращения конфликтов.Apple suggests using a reverse-DNS-style notation for the Activity Type Identifier to avoid collisions. Например: com.company-name.appname.activity для конкретного приложения на основе действий или com.company-name.activity для действий, которые могут выполняться для нескольких приложений.For example: com.company-name.appname.activity for specific app based activities or com.company-name.activity for activities that can run across multiple apps.

Идентификатор типа действия используется при создании NSUserActivity экземпляр для определения типа действия.The Activity Type Identifier is used when creating a NSUserActivity instance to identify the type of activity. При действие продолжается на другом устройстве, тип действия (а также идентификатор приложения Team) определяет, какие приложения, чтобы запустить продолжить действие.When an activity is continued on another device, the Activity Type (along with the app’s Team ID) determines which app to launch to continue the activity.

Например, мы собираемся создавать пример приложения вызывается MonkeyBrowser (загрузить здесь).As an example, we are going to create a sample app called MonkeyBrowser (download here). Это приложение будет представлять четыре вкладки, на каждой из различных откройте URL-адрес в веб-представление браузера.This app will present four tabs, each with a different URL open in a web browser view. Пользователь будет иметь возможность продолжать одну из вкладок на это устройство iOS, запустив его.The user will be able to continue any tab on a different iOS device running the app.

Чтобы создать необходимые идентификаторы типа действия для поддержки этого поведения, изменение Info.plist файл и переключитесь на источника представления.To create the required Activity Type Identifiers to support this behavior, edit the Info.plist file and switch to the Source view. Добавление NSUserActivityTypes ключа и создайте следующие идентификаторы:Add a NSUserActivityTypes key and create the following identifiers:

Мы создали четыре новых типа идентификаторы действий, одной для каждой из вкладок в примере MonkeyBrowser приложения.We created four new Activity Type Identifiers, one for each of the tabs in the example MonkeyBrowser app. При создании собственных приложений, замените содержимое файла NSUserActivityTypes массива с идентификаторами тип действия, относящиеся к действия приложения поддерживает.When creating your own apps, replace the contents of the NSUserActivityTypes array with the Activity Type Identifiers specific to the activities your app supports.

Отслеживание изменении пользовательского действияTracking User Activity Changes

Когда мы создадим новый экземпляр класса NSUserActivity класс, мы укажем NSUserActivityDelegate экземпляр для отслеживания изменений в состоянии действия.When we create a new instance of the NSUserActivity class, we will specify a NSUserActivityDelegate instance to track changes to the activity's state. Например следующий код может использоваться для отслеживания изменения состояния:For example, the follow code can be used to track state changes:

using System;
using CoreGraphics;
using Foundation;
using UIKit;

namespace MonkeyBrowse
{
    public class UserActivityDelegate : NSUserActivityDelegate
    {
        #region Constructors
        public UserActivityDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void UserActivityReceivedData (NSUserActivity userActivity, NSInputStream inputStream, NSOutputStream outputStream)
        {
            // Log
            Console.WriteLine ("User Activity Received Data: {0}", userActivity.Title);
        }

        public override void UserActivityWasContinued (NSUserActivity userActivity)
        {
            Console.WriteLine ("User Activity Was Continued: {0}", userActivity.Title);
        }

        public override void UserActivityWillSave (NSUserActivity userActivity)
        {
            Console.WriteLine ("User Activity will be Saved: {0}", userActivity.Title);
        }
        #endregion
    }
}

UserActivityReceivedData Метод вызывается, когда Stream продолжения получает данные от отправляющего устройства.The UserActivityReceivedData method is called when a Continuation Stream has received data from a sending device. Дополнительные сведения см. в разделе вспомогательные потоки продолжения разделе ниже.For more information, see the Supporting Continuation Streams section below.

UserActivityWasContinued Метод вызывается в том случае, когда другое устройство взял на себя действия из текущего устройства.The UserActivityWasContinued method is called when another device has taken over an activity from the current device. В зависимости от типа действия, такие как добавление нового элемента в список ToDo приложение может требуется прервать выполнение действий на отправляющим устройством.Depending on the type of activity, like adding a new item to a ToDo list, the app might need abort the activity on the sending device.

UserActivityWillSave Метод вызывается до любого изменения в действие сохраняются и синхронизируются по локально доступных устройств.The UserActivityWillSave method is called before any changes to the activity are saved and synced across locally available devices. Этот метод можно использовать, чтобы внести изменения в последнюю минуту UserInfo свойство NSUserActivity экземпляра перед отправкой.You can use this method to make any last minute changes to the UserInfo property of the NSUserActivity instance before it is sent.

Создание экземпляра NSUserActivityCreating a NSUserActivity Instance

Каждое действие, который приложение хочет предоставить возможность продолжения на другом устройстве должен быть инкапсулирован в NSUserActivity экземпляра.Each activity that your app wishes to provide the possibility of continuing on another device must be encapsulated in a NSUserActivity instance. Приложение можно создать произвольное количество действий при необходимости и характер этих действий зависит от функций и возможностей в приложения.The app can create as many activities as required and the nature of those activities is dependent on the functionality and features of the app in question. Например приложение электронной почты может создать одно действие для создания нового сообщения, а другой для чтения сообщения.For example, an email app might create one activity for creating a new message, and another for reading a message.

Для нашего примера приложения новый NSUserActivity создается каждый раз, когда пользователь вводит новый URL-адрес в одном из представление с вкладками веб-браузера.For our example app, a new NSUserActivity is created every time the user enters a new URL in one of the tabbed web browser view. Следующий код сохраняет состояние заданной вкладки:The following code stores the state of a given tab:

public NSString UserActivityTab1 = new NSString ("com.xamarin.monkeybrowser.tab1");
public NSUserActivity UserActivity { get; set; }
...

UserActivity = new NSUserActivity (UserActivityTab1);
UserActivity.Title = "Weather Tab";
UserActivity.Delegate = new UserActivityDelegate ();

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

// Inform Activity that it has been updated
UserActivity.BecomeCurrent ();

Он создает новый NSUserActivity с помощью одного пользовательского типа действия создали выше и предоставляет понятное название для действия.It creates a new NSUserActivity using one of the User Activity Type created above and provides a human-readable title for the Activity. Он подключается к экземпляру NSUserActivityDelegate созданный выше, чтобы просмотреть состояние изменяется и информирует iOS о том, что это действие пользователя является текущее действие.It attaches to an instance of the NSUserActivityDelegate created above to watch for state changes and informs iOS that this User Activity is the Current Activity.

Заполнение словарь сведений о пользователеPopulating the UserInfo Dictionary

Как мы видели ранее, UserInfo свойство NSUserActivity класс является NSDictionary пар "ключ значение", используемый для определения состояния данного действия.As we have seen above, the UserInfo property of the NSUserActivity class is a NSDictionary of key-value pairs used to define the state of a given activity. Значения, хранящиеся в UserInfo должен быть одним из следующих типов: NSArray, NSData, NSDate, NSDictionary, NSNull, NSNumber, NSSet, NSString, или NSURL.The values stored in UserInfo must be one of the following types: NSArray, NSData, NSDate, NSDictionary, NSNull, NSNumber, NSSet, NSString, or NSURL. NSURL значения данных, ссылающиеся на документы iCloud будет автоматически настроен таким образом, чтобы они указывают один и тот же документ на получающим устройством.NSURL data values that point to iCloud documents will automatically be adjusted so that they point to the same documents on a receiving device.

В приведенном выше примере мы создали NSMutableDictionary объектом и заполняется один ключ, указав URL-адрес, пользователь просматривает в настоящее время на заданной вкладки. AddUserInfoEntries Метод действия пользователя был использован для обновления указанного действия с данными, который будет использоваться для восстановления уровня активности в получающим устройством:In the example above, we created a NSMutableDictionary object and populated it with a single key providing URL that the user was currently viewing on the given tab. The AddUserInfoEntries method of the User Activity was used to update the activity with the data that will be used to restore the activity on the receiving device:

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

Apple предлагает сохранение сведения, передаваемые в самый-самый минимум, чтобы убедиться, что действия отправляется за отведенное время, чтобы получающим устройством.Apple suggest keeping the information sent to the barest minimum to ensure that the activity is sent in a timely fashion to the receiving device. Если больше информации является обязательным, как изменить изображение, прикрепляемые к документу требуется отправить, следует использовать потоки для продолжения.If larger information is required, like an image attached to a document be edited needs to be sent, the you should use Continuation Streams. См. в разделе вспомогательные потоки продолжения Дополнительные сведения в приведенном ниже разделе.See the Supporting Continuation Streams section below for more details.

Продолжение действияContinuing an Activity

Переадресуемое автоматически информировать пользователей локального устройств iOS и OS X в физической близости к исходного устройства, которые вошли в ту же учетную запись iCloud, доступности, продолжение работы действий пользователя.Handoff will automatically inform local iOS and OS X devices that are in physical proximity to the originating device and signed into the same iCloud account, of the availability of continuable User Activities. Если пользователь выбирает для продолжения действия на новое устройство, система запустит соответствующее приложение (на основе идентификатора группы и типа действия) и сведения о его AppDelegate что продолжение должно произойти.If the user chooses to continue an activity on a new device, the system will launch the appropriate app (based on the Team ID and Activity Type) and information its AppDelegate that continuation needs to occur.

Во-первых, WillContinueUserActivityWithType метод вызывается, чтобы приложения могли сообщать пользователю, продолжение является началом.First, the WillContinueUserActivityWithType method is called so the app can inform the user that the continuation is about to begin. Мы используем следующий код в AppDelegate.cs файл нашего примера приложения для обработки начальной продолжения:We use the following code in the AppDelegate.cs file of our example app to handle a continuation starting:

public NSString UserActivityTab1 = new NSString ("com.xamarin.monkeybrowser.tab1");
public NSString UserActivityTab2 = new NSString ("com.xamarin.monkeybrowser.tab2");
public NSString UserActivityTab3 = new NSString ("com.xamarin.monkeybrowser.tab3");
public NSString UserActivityTab4 = new NSString ("com.xamarin.monkeybrowser.tab4");
...

public FirstViewController Tab1 { get; set; }
public SecondViewController Tab2 { get; set;}
public ThirdViewController Tab3 { get; set; }
public FourthViewController Tab4 { get; set; }
...

public override bool WillContinueUserActivity (UIApplication application, string userActivityType)
{
    // Report Activity
    Console.WriteLine ("Will Continue Activity: {0}", userActivityType);

    // Take action based on the user activity type
    switch (userActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Inform view that it's going to be modified
        Tab1.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Inform view that it's going to be modified
        Tab2.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Inform view that it's going to be modified
        Tab3.PreparingToHandoff ();
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Inform view that it's going to be modified
        Tab4.PreparingToHandoff ();
        break;
    }

    // Inform system we handled this
    return true;
}

В приведенном выше примере регистрируется каждый контроллер представления AppDelegate и имеющий открытый PreparingToHandoff метод, который отображает индикатор активности и сообщения, уведомляющего пользователя о, что действие будет передан на текущем устройстве.In the above example, each View Controller registers with the AppDelegate and has a public PreparingToHandoff method that displays an Activity Indicator and a message letting the user know that the activity is about to be handed off to the current device. ПримерExample:

private void ShowBusy(string reason) {

    // Display reason
    BusyText.Text = reason;

    //Define Animation
    UIView.BeginAnimations("Show");
    UIView.SetAnimationDuration(1.0f);

    Handoff.Alpha = 0.5f;

    //Execute Animation
    UIView.CommitAnimations();
}
...

public void PreparingToHandoff() {
    // Inform caller
    ShowBusy ("Continuing Activity...");
}

ContinueUserActivity Из AppDelegate будет вызываться действительности продолжить данное действие.The ContinueUserActivity of the AppDelegate will be called to actually continue the given activity. Опять же из нашего примера приложения:Again, from our example app:

public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Report Activity
    Console.WriteLine ("Continuing User Activity: {0}", userActivity.ToString());

    // Get input and output streams from the Activity
    userActivity.GetContinuationStreams ((NSInputStream arg1, NSOutputStream arg2, NSError arg3) => {
        // Send required data via the streams
        // ...
    });

    // Take action based on the Activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Preform handoff
        Tab1.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab1});
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Preform handoff
        Tab2.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab2});
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Preform handoff
        Tab3.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab3});
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Preform handoff
        Tab4.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab4});
        break;
    }

    // Inform system we handled this
    return true;
}

Открытый PerformHandoff метод каждого контроллера представления фактически выполняет передачу и восстанавливает действия на текущем устройстве.The public PerformHandoff method of each View Controller actually preforms the handoff and restores the activity on the current device. В случае примера он отображает же URL-адрес в заданной вкладки, которая вошла пользователь на другом устройстве.In the case of the example, it displays the same URL in a given tab that the user was browsing on a different device. ПримерExample:

private void HideBusy() {

    //Define Animation
    UIView.BeginAnimations("Hide");
    UIView.SetAnimationDuration(1.0f);

    Handoff.Alpha = 0f;

    //Execute Animation
    UIView.CommitAnimations();
}
...

public void PerformHandoff(NSUserActivity activity) {

    // Hide busy indicator
    HideBusy ();

    // Extract URL from dictionary
    var url = activity.UserInfo ["Url"].ToString ();

    // Display value
    URL.Text = url;

    // Display the give webpage
    WebView.LoadRequest(new NSUrlRequest(NSUrl.FromString(url)));

    // Save activity
    UserActivity = activity;
    UserActivity.BecomeCurrent ();

}

ContinueUserActivity Включает метод UIApplicationRestorationHandler , можно вызвать для документа или ответчик на базе возобновление действия.The ContinueUserActivity method includes a UIApplicationRestorationHandler that you can call for document or responder based activity resuming. Вам потребуется передать NSArray или доступных для восстановления объектов в обработчик восстановления при вызове.You'll need to pass a NSArray or restorable objects to the Restoration Handler when called. Пример:For example:

completionHandler (new NSObject[]{Tab4});

Для каждого объекта, переданного его RestoreUserActivityState метод будет вызываться.For each object passed, its RestoreUserActivityState method will be called. Каждый объект можно затем использовать данные в UserInfo словаря для восстановления собственное состояние.Each object can then use the data in the UserInfo dictionary to restore its own state. Пример:For example:

public override void RestoreUserActivityState (NSUserActivity activity)
{
    base.RestoreUserActivityState (activity);

    // Log activity
    Console.WriteLine ("Restoring Activity {0}", activity.Title);
}

Для приложений на базе документа, если не реализовать ContinueUserActivity метод либо false, UIKit или AppKit автоматически можно возобновить действия.For document-based apps, if you do not implement the ContinueUserActivity method or it returns false, UIKit or AppKit can automatically resume the activity. См. в разделе поддерживают перемещение вручную в приложениях на основе документов Дополнительные сведения в приведенном ниже разделе.See the Supporting Handoff in Document-Based Apps section below for more information.

Корректное поведение перемещение вручнуюFailing Handoff Gracefully

Так как перемещение вручную использует передачи сведений между iOS коллекции слабо подключенных устройств и OS X, могут возникать ошибки в процессе передачи.Since Handoff relies on the transmission of information between a collection loosely connected iOS and OS X devices, the transfer process can sometimes fail. Следует разрабатывать приложения, чтобы правильно обрабатывать эти сбои и информирует пользователя о любых возникающих ситуациях.You should design your app to handle these failures gracefully and inform the user of any situations that arise.

В случае сбоя DidFailToContinueUserActivitiy метод AppDelegate будет вызываться.In the event of a failure, the DidFailToContinueUserActivitiy method of the AppDelegate will be called. Пример:For example:

public override void DidFailToContinueUserActivitiy (UIApplication application, string userActivityType, NSError error)
{
    // Log information about the failure
    Console.WriteLine ("User Activity {0} failed to continue. Error: {1}", userActivityType, error.LocalizedDescription);
}

Следует использовать предоставленный NSError для предоставления сведений о сбое.You should use the supplied NSError to provide information to the user about the failure.

Собственное приложение для переадресации браузера WebNative App to Web Browser Handoff

Пользователь может потребоваться продолжить действие без необходимости соответствующие собственное приложение, установлены на устройство.A user may want to continue an activity without having an appropriate native app installed on the desired device. В некоторых случаях веб-интерфейс может предоставлять требуемую функциональность, и действия по-прежнему может быть продолжен.In some situations, a web based interface may provide the required functionality and the activity can still be continued. Например учетная запись электронной почты пользователя может предоставлять пользовательский Интерфейс веб базы для составления и чтение сообщений.For example, the user's email account may provide a web-base UI for composing and reading messages.

Если исходный собственных приложений знает URL-адрес для веб-интерфейс (и синтаксис, необходимый для идентификации данного элемента продолжение), его можно закодировать эту информацию в WebpageURL свойство NSUserActivity экземпляра.If the originating, native app knows the URL for the web interface (and the required syntax for identifying the given item being continued), it can encode this information in the WebpageURL property of the NSUserActivity instance. Если получающим устройством нет соответствующего собственное приложение, установить для продолжения обработки, могут вызываться предоставленный веб-интерфейса.If the receiving device doesn't have an appropriate native app installed to handle the continuation, the provided web interface can be called.

Переадресуемое собственного приложения в веб-браузереWeb Browser to Native App Handoff

Если пользователь использует веб-интерфейс на исходном устройстве и собственное приложение на получающим устройством утверждений доменной части WebpageURL свойство, то система будет использовать это приложение маркер продолжения.If the user was using a web-based interface on the originating device, and a native app on the receiving device claims the domain portion of the WebpageURL property, then the system will use that app the handle the continuation. Новое устройство получит NSUserActivity экземпляр, который помечает тип действия, как BrowsingWeb и WebpageURL будет содержать URL-адрес, который пользователь посетил, UserInfo словарь будет пустым.The new device will receive a NSUserActivity instance that marks the Activity Type as BrowsingWeb and the WebpageURL will contain the URL the user was visiting, the UserInfo dictionary will be empty.

Для приложения для участия в этом типе перемещение вручную, необходимо claim домена в com.apple.developer.associated-domains прав с форматом <service>:<fully qualified domain name> (например: activity continuation:company.com).For an app to participate in this type of Handoff, it must claim the domain in a com.apple.developer.associated-domains entitlement with the format <service>:<fully qualified domain name> (for example: activity continuation:company.com).

Если совпадает с указанным доменом WebpageURL значение свойства, переходной загружает список утвержденных идентификаторы приложений с веб-сайта в этот домен.If the specified domain matches a WebpageURL property's value, Handoff downloads a list of approved app IDs from the website at that domain. Веб-сайта необходимо указать список утвержденных идентификаторов в файле JSON со знаком, с именем apple-app--связь с сайтом (например, https://company.com/apple-app-site-association).The website must provide a list of approved IDs in a signed JSON file named apple-app-site-association (for example, https://company.com/apple-app-site-association).

Этот JSON-файл содержит словарь, который определяет список идентификаторы приложений в виде <team identifier>.<bundle identifier>.This JSON file contains a dictionary that specifies a list of app IDs in the form <team identifier>.<bundle identifier>. Пример:For example:

{
    "activitycontinuation": {
        "apps": [    "YWBN8XTPBJ.com.company.FirstApp",
            "YWBN8XTPBJ.com.company.SecondApp" ]
    }
}

Для подписания файла JSON (таким образом, чтобы он содержал правильный Content-Type из application/pkcs7-mime), используйте терминалов приложения и openssl с сертификат и ключ, выданный центром сертификации, доверенным для iOS (см. в разделе https://support.apple.com/kb/ht5012 список).To sign the JSON file (so that it has the correct Content-Type of application/pkcs7-mime), use the Terminal app and a openssl command with a certificate and key issued by a certificate authority trusted by iOS (see https://support.apple.com/kb/ht5012 for a list). Пример:For example:

echo '{"activitycontinuation":{"apps":["YWBN8XTPBJ.com.company.FirstApp",
"YWBN8XTPBJ.com.company.SecondApp"]}}' > json.txt

cat json.txt | openssl smime -sign -inkey company.com.key
-signer company.com.pem
-certfile intermediate.pem
-noattr -nodetach
-outform DER > apple-app-site-association

openssl Команда выводит файл JSON со знаком, размещенный на веб-сайте в apple-app--связь с сайтом URL-адрес.The openssl command outputs a signed JSON file that you place on your website at the apple-app-site-association URL. Пример:For example:

https://example.com/apple-app-site-association.

Приложение будет получать любое действие, WebpageURL домен находится в его com.apple.developer.associated-domains прав.The app will receive any activity whose WebpageURL domain is in its com.apple.developer.associated-domains entitlement. Только http и https поддерживаются протоколы, другого протокола приведет к появлению исключения.Only the http and https protocols are support, any other protocol will raise an exception.

Поддержка переадресации в приложения на основе документаSupporting Handoff in Document-Based Apps

Как уже говорилось, в iOS и OS X, приложения на основе документа автоматически будет поддерживать получения документов на основе iCloud, если приложения Info.plist файл содержит CFBundleDocumentTypes ключ NSUbiquitousDocumentUserActivityType.As stated above, on iOS and OS X, document-based apps will automatically support Handoff of iCloud-based documents if the app’s Info.plist file contains a CFBundleDocumentTypes key of NSUbiquitousDocumentUserActivityType. Пример:For example:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>NSRTFDPboardType</string>
        . . .
        <key>LSItemContentTypes</key>
        <array>
        <string>com.myCompany.rtfd</string>
        </array>
        . . .
        <key>NSUbiquitousDocumentUserActivityType</key>
        <string>com.myCompany.myEditor.editing</string>
    </dict>
</array>

В этом примере строка имеет обозначение приложения обратного запроса DNS с именем добавляются действия.In this example the string is a reverse-DNS app designator with the name of the activity appended. Если введено таким образом, тип записи действий не обязательно должны повторяться в NSUserActivityTypes массив Info.plist файла.If entered this way, the activity type entries do not need to be repeated in the NSUserActivityTypes array of the Info.plist file.

Автоматически создается объект действия пользователя (через документа UserActivity свойства) можно ссылаться на другие объекты в приложении и использовать для восстановления состояния на продолжение.The automatically-created User Activity object (available through the document’s UserActivity property) can be referenced by other objects in the app and used to restore state on continuation. Например, для отслеживания элементов выбора и документа позицию.For example, to track item selection and document position. Необходимо задать этот действия NeedsSave свойства true каждый раз, когда изменяется состояние и обновить UserInfo словарь в UpdateUserActivityState метод.You need to set this activities NeedsSave property to true whenever the state changes and update the UserInfo dictionary in the UpdateUserActivityState method.

UserActivity Свойство можно использовать из любого потока и соответствует протоколу ключ значение наблюдения (KVO), чтобы его можно использовать для синхронизации документ при его перемещении из iCloud и выхода из системы.The UserActivity property can be used from any thread and conforms to the key-value observing (KVO) protocol, so it can be used to keep a document in sync as it moves in and out of iCloud. UserActivity Свойство станут недействительными при закрытии документа.The UserActivity property will be invalidated when the document is closed.

Дополнительные сведения см. в разделе Apple поддержка действия пользователя в приложениях на основе документов документации.For more information, please see Apple’s User Activity Support in Document-Based Apps documentation.

Поддержка переадресации в ответчикиSupporting Handoff in Responders

Можно связать ответчики (наследуется от либо UIResponder в iOS или NSResponder в OS X) для действий, задав их UserActivity свойства.You can associate responders (inherited from either UIResponder on iOS or NSResponder on OS X) to activities by setting their UserActivity properties. Система автоматически сохраняет UserActivity свойство в соответствующее время, вызвав отвечающего UpdateUserActivityState метод для добавления текущие данные в объект активности пользователей с помощью AddUserInfoEntriesFromDictionary метод.The system automatically saves the UserActivity property at the appropriate times, calling the responder’s UpdateUserActivityState method to add current data to the User Activity object using the AddUserInfoEntriesFromDictionary method.

Поддержка продолжения потоковSupporting Continuation Streams

Может возникнуть ситуация, где объем сведений, необходимых для продолжения действия не могут передаваться эффективно с начальной передачи полезных данных.The might be situations where the amount of information required to continue an activity cannot be efficiently transferred by the initial Handoff payload. В таких ситуациях принимающее приложение может установить один или несколько поток между собой и исходного приложения для передачи данных.In these situations, the receiving app can establish one or more stream between itself and the originating app to transfer the data.

В исходном приложении настроен SupportsContinuationStreams свойство NSUserActivity экземпляр true.The originating app will set the SupportsContinuationStreams property of the NSUserActivity instance to true. Пример:For example:

// Create a new user Activity to support this tab
UserActivity = new NSUserActivity (ThisApp.UserActivityTab1){
    Title = "Weather Tab",
    SupportsContinuationStreams = true
};
UserActivity.Delegate = new UserActivityDelegate ();

// Update the activity when the tab's URL changes
var userInfo = new NSMutableDictionary ();
userInfo.Add (new NSString ("Url"), new NSString (url));
UserActivity.AddUserInfoEntries (userInfo);

// Inform Activity that it has been updated
UserActivity.BecomeCurrent ();

Принимающее приложение может затем вызвать GetContinuationStreams метод NSUserActivity в его AppDelegate для установления потока.The receiving app can then call the GetContinuationStreams method of the NSUserActivity in its AppDelegate to establish the stream. Пример:For example:

public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Report Activity
    Console.WriteLine ("Continuing User Activity: {0}", userActivity.ToString());

    // Get input and output streams from the Activity
    userActivity.GetContinuationStreams ((NSInputStream arg1, NSOutputStream arg2, NSError arg3) => {
        // Send required data via the streams
        // ...
    });

    // Take action based on the Activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.monkeybrowser.tab1":
        // Preform handoff
        Tab1.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab1});
        break;
    case "com.xamarin.monkeybrowser.tab2":
        // Preform handoff
        Tab2.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab2});
        break;
    case "com.xamarin.monkeybrowser.tab3":
        // Preform handoff
        Tab3.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab3});
        break;
    case "com.xamarin.monkeybrowser.tab4":
        // Preform handoff
        Tab4.PerformHandoff (userActivity);
        completionHandler (new NSObject[]{Tab4});
        break;
    }

    // Inform system we handled this
    return true;
}

На исходном устройстве делегата действия пользователя получает потоки путем вызова его DidReceiveInputStream метод для предоставления данных указано продолжать активности пользователей на устройстве возобновления.On the originating device, the User Activity Delegate receives the streams by calling its DidReceiveInputStream method to provide the data requested to continue the user activity on the resuming device.

Вы воспользуетесь NSInputStream для предоставления доступа только для чтения для потоковой передачи данных и NSOutputStream предоставляют доступ только для записи.You will use a NSInputStream to provide read-only access to stream data, and a NSOutputStream provide write-only access. В режиме запросов и ответов, где принимающее приложение запрашивает больше данных и предоставляет исходного приложения, его следует использовать потоки.The streams should be used in a request and response fashion, where the receiving app requests more data and the originating app provides it. Таким образом, чтобы данные, записанные в поток вывода для исходного устройства считываются из входного потока на продолжение устройстве и наоборот.So that, data written to the output stream on the originating device is read from the input stream on the continuing device, and vice versa.

Даже в ситуациях, где необходимы продолжения Stream должна существовать минимальным назад и вперед взаимодействие между двумя приложениями.Even in situations where Continuation Stream are required, there should be a minimal of back and forth communication between the two apps.

Дополнительные сведения см. в разделе Apple Using продолжения потоков документации.For more information, see Apple’s Using Continuation Streams documentation.

Переадресуемое советы и рекомендацииHandoff Best Practices

Из-за всех различных компонентов, вовлеченных успешную реализацию простого продолжение действий пользователей с помощью переходной процесс требует тщательного проектирования.The successful implementation of the seamless continuation of a User Activity via Handoff requires careful design because of all the various components involved. Apple рекомендует придерживаться указанных внедрение выполните рекомендации для приложений включено перемещение вручную:Apple suggests adopting the follow best practices for your Handoff enabled apps:

  • Проектирование действия пользователя, чтобы требовать наименьшее полезных данных, можно связать состояние действия, чтобы продолжить.Design your User Activities to require the smallest payload possible to relate the state of the activity to be continued. Чем больше полезных данных, тем больше времени занимает продолжение для запуска.The larger the payload, the longer it takes the continuation to start.
  • Если необходимо передавать большие объемы данных для продолжения успешной, учитывайте затраты на конфигурации и сети.If you must transfer large amounts of data for successful continuation, take into account the costs involved in configuration and network overhead.
  • Довольно часто крупное приложение Mac для создания действий пользователя, которые обрабатываются несколько из них, меньшего размера, приложения для конкретных задач на устройствах iOS.It is common for a large Mac app to create User Activities that are handled by several, smaller, task-specific apps on iOS devices. Версии ОС и различных приложений должны разрабатываться эффективной совместной работы или сбой корректно.The different app and OS versions should be designed to work well together or fail gracefully.
  • При указании типов действий, используется нотация обратного запроса DNS для предотвращения конфликтов.When specifying your Activity Types, use reverse-DNS notation to avoid collisions. Если действие является специфичным для заданного приложения, имени должна быть включена в определение типа (например com.myCompany.myEditor.editing).If an activity is specific to a given app, its name should be included in the type definition (for example com.myCompany.myEditor.editing). Если действие можно будет работать для нескольких приложений, удалите имя приложения из определения (например com.myCompany.editing).If the activity can work across multiple apps, drop the app name from the definition (for example com.myCompany.editing).
  • Если приложению требуется обновить состояние активности пользователей (NSUserActivity) задайте NeedsSave свойства true.If your app needs to update the state of a User Activity (NSUserActivity) set the NeedsSave property to true. В соответствующее время переходной вызовет делегата UserActivityWillSave метод, чтобы вы могли добавить UserInfo словарь при необходимости.At appropriate times, Handoff will call the delegate's UserActivityWillSave method so you can update the UserInfo dictionary as required.
  • Так как процесс передачи может не инициализировать мгновенно на получающим устройством, следует реализовать AppDelegate WillContinueUserActivity и уведомить пользователя, запускается продолжение.Because the Handoff process might not initialize instantly on the receiving device, you should implement the AppDelegate's WillContinueUserActivity and inform the user that a continuation is about to start.

Переадресуемое примера приложенияExample Handoff App

Как пример использования переходной приложения Xamarin.iOS, мы включили MonkeyBrowser пример приложения с помощью этого руководства.As an example of using Handoff in a Xamarin.iOS app, we have included the MonkeyBrowser sample app with this guide. Приложение имеет четыре вкладки, которые пользователь может использовать для просмотра веб-приложений, каждый с указанием типа данного действия: О погоде, избранного, кофе и работы.The app has four tabs that the user can use to browse the web, each with a given activity type: Weather, Favorite, Coffee Break and Work.

На вкладках, когда пользователь вводит новый URL-адрес и касания Go кнопку, новый NSUserActivity создается для этого вкладку, содержащую URL-адрес, который в настоящее время обзора:On any tab, when the user enters a new URL and taps the Go button, a new NSUserActivity is created for that tab that contains the URL that the user is currently browsing:

Если другой устройств пользователя — MonkeyBrowser установлено, приложение осуществил вход в iCloud, с помощью той же учетной записью, на той же сети и в непосредственной близости к устройству выше переходной действие будет отображаться на домашней странице экран (в левом нижнем углу):If another of the user’s devices has the MonkeyBrowser app installed, is signed into iCloud using the same user account, is on the same network and in close proximity to the above device, the Handoff Activity will be displayed on the home screen (in the lower left hand corner):

Если пользователь перетаскивает вверх на значке переходной, запускается приложение, и действие пользователя, заданное в NSUserActivity будет продолжаться на новое устройство:If the user drags upward on the Handoff icon, the app will be launched and the User Activity specified in the NSUserActivity will be continued on the new device:

Когда действие пользователя было успешно отправлено для другого Apple устройства, отправляющего устройства NSUserActivity получит вызов UserActivityWasContinued метод его NSUserActivityDelegate для знали, что активности пользователей были успешно переданы в другой устройство.When the User Activity has been successfully sent to another Apple device, the sending device’s NSUserActivity will receive a call to the UserActivityWasContinued method on its NSUserActivityDelegate to let it know that the User Activity has been successfully transferred to another device.

СводкаSummary

Эта статья дала введение в переходной инфраструктурой, использованной для продолжения действий пользователей между несколькими устройствами Apple пользователя.This article has given an introduction to the Handoff framework used to continue a User Activity between multiple of the user's Apple devices. Далее показано, как включить и внедрить перемещение вручную в приложении Xamarin.iOS.Next, it showed how to enable and implement Handoff in a Xamarin.iOS app. Наконец это обсуждалось различные типы переходной продолжений доступны и переходной рекомендации.Finally, it discussed the different types of Handoff continuations available and the Handoff best practices.