Push-уведомления в iOSPush Notifications in iOS

Важно!

Сведения в этом разделе относятся к iOS 9 и более ранним версиям, поэтому она оставлена для поддержки более старых версий iOS.The information in this section pertains to iOS 9 and prior, it has been left here to support older iOS versions. Для iOS 10 и более поздних версий ознакомьтесь с руководством по платформе пользовательских уведомлений для поддержки локальных и удаленных уведомлений на устройстве iOS.For iOS 10 and later, please see the User Notification Framework guide for supporting both Local and Remote Notification on an iOS device.

Push-уведомления должны храниться в кратком виде и содержать достаточно данных, чтобы уведомить мобильное приложение о том, что оно должно связаться с серверным приложением для обновления.Push notifications should be kept brief and only contain enough data to notify the mobile application that it should contact the server application for an update. Например, когда приходит новое сообщение электронной почты, серверное приложение уведомляет только мобильное приложение о поступлении нового сообщения.For example, when new email arrives, the server application would only notify the mobile application that new email has arrived. Уведомление не будет содержать новое электронное сообщение.The notification would not contain the new email itself. Затем мобильное приложение будет получать новые сообщения с сервера, когда это было уместноThe mobile application would then retrieve the new emails from the server when it was appropriate

В центре push-уведомлений в iOS используется Служба шлюза push-уведомлений Apple (APNs) .At the center of push notifications in iOS is the Apple Push Notification Gateway Service (APNS). Это служба, предоставляемая компанией Apple, которая отвечает за маршрутизацию уведомлений с сервера приложений на устройства iOS.This is a service provided by Apple that is responsible for routing notifications from an application server to iOS devices. На следующем рисунке показана топология push-уведомлений для iOS. The following image illustrates the push notification topology for iOS:

Удаленные уведомления — это строки в формате JSON, которые соответствуют формату и протоколам, указанным в разделе полезные данные уведомления руководства по программированию локальных и push-уведомлений в документации разработчика iOS. .Remote notifications themselves are JSON formatted strings that adhere to the format and protocols specified in The Notification Payload section of the Local and Push Notification Programming Guide in the iOS developer documentation.

Apple поддерживает две среды APNS: "песочницу" и " Рабочая среда".Apple maintains two environments of APNS: a Sandbox and a Production environment. Среда "песочницы" предназначена для тестирования на этапе разработки и доступна gateway.sandbox.push.apple.com на TCP-порте 2195.The Sandbox environment is meant for testing during the development phase and can be found at gateway.sandbox.push.apple.com on TCP port 2195. Рабочая среда предназначена для использования в развернутых приложениях, и ее можно найти по gateway.push.apple.com TCP-порту 2195.The Production environment is meant to be used in applications that have been deployed and can be found at gateway.push.apple.com on TCP port 2195.

ТребованияRequirements

Push-уведомление должно соблюдать следующие правила, определяемые архитектурой APNS:Push notification must observe the following rules that are dictated by the architecture of APNS:

  • 256 байт сообщений — размер всего сообщения в уведомлении не должен превышать 256 байт.256 byte Message Limit - The entire message size of the notification must not exceed 256 bytes.
  • Без подтверждения поступления — APNs не предоставляет отправителю уведомление о том, что сообщение было отправлено предполагаемому получателю.No Receipt Confirmation - APNS does not provide the sender with any notification that a message made it to the intended recipient. Если устройство недоступно и отправлено несколько последовательных уведомлений, все уведомления, кроме самого последнего, будут потеряны.If the device is unreachable and multiple sequential notifications are sent, all notifications except the most recent will be lost. На устройство будет доставлено только самое последнее уведомление.Only the most recent notification will be delivered to the device.
  • Для каждого приложения требуется защищенный сертификат . связь с APNs должна выполняться по протоколу SSL.Each application requires a secure certificate - Communication with APNS must be done over SSL.

Создание и использование сертификатовCreating and Using Certificates

Каждая из сред, упомянутых в предыдущем разделе, требует собственного сертификата.Each of the environments mentioned in the previous section require their own certificate. В этом разделе рассматривается создание сертификата, связывание его с профилем подготовки, а затем получение сертификата обмена личной информацией для использования с Пушшарп.This section will cover how to create a certificate, associate it with a provisioning profile, and then get a Personal Information Exchange certificate for use with PushSharp.

  1. Чтобы создать сертификаты, перейдите на портал подготовки iOS на веб-сайте Apple, как показано на следующем снимке экрана (Обратите внимание на пункт меню идентификаторы приложений слева):To create a certificates go to the iOS Provisioning Portal on Apple's website, as shown in the following screenshot (notice the App IDs menu item on the left):

  2. Затем перейдите к разделу идентификатор приложения и создайте новый идентификатор приложения, как показано на следующем снимке экрана:Next, navigate to the App ID's section and create a new app ID as shown in the following screenshot:

  3. Нажав + кнопку, вы сможете ввести описание и идентификатор пакета для идентификатора приложения, как показано на следующем снимке экрана:When you click on the + button, you will be able to enter the description and a Bundle Identifier for the app ID, as shown in the next screenshot:

  4. Обязательно выберите ЯВНЫЙ идентификатор приложения и убедитесь, что идентификатор пакета не заканчивается на * .Make sure to select Explicit App ID and that the Bundle Identifier doesn't end with a * . При этом будет создан идентификатор, который подходит для нескольких приложений, а для одного приложения должны быть созданы сертификаты push-уведомлений.This will create an identifier that is good for multiple applications, and push notification certificates must be for a single application.

  5. В разделе службы приложений выберите Push-уведомления.Under App Services, select Push Notifications:

  6. И нажмите кнопку Отправить , чтобы подтвердить регистрацию нового идентификатора приложения:And press Submit to confirm registration of the new App ID:

  7. Затем необходимо создать сертификат для идентификатора приложения.Next, you must create the certificate for the app ID. В левой области навигации перейдите к пункту Сертификаты > все и нажмите + кнопку, как показано на следующем снимке экрана:In the left hand navigation, browse to Certificates > All and select the + button, as shown in the following screenshot:

  8. Укажите, хотите ли вы использовать сертификат разработки или рабочей среды:Select whether you would like to use a Development or Production certificate:

  9. Затем выберите новый идентификатор приложения, который мы только что создали:And then select the new App ID that we have just created:

  10. При этом будут отображены инструкции по созданию запроса подписи сертификата с помощью приложения для доступа к цепочке ключей на компьютере Mac.This will display instructions that will take you through the process of creating a Certificate Signing Request using the Keychain Access application on your Mac.

  11. Теперь, когда сертификат создан, он должен быть использован в рамках процесса сборки для подписи приложения, чтобы его можно было зарегистрировать с помощью APNs.Now that the certificate has been created, it must be used as part of the build process to sign the application so that it may register with APNs. Для этого требуется создать и установить профиль подготовки, использующий сертификат.This requires creating and installing a provisioning profile that uses the certificate.

  12. Чтобы создать профиль подготовки для разработки, перейдите к разделу профили подготовки и выполните действия по его созданию, используя только что созданный идентификатор приложения.To create a development provisioning profile, navigate to the Provisioning Profiles section and follow the steps to create it, using the App Id we have just created.

  13. Создав профиль подготовки, откройте Организатор Xcode и обновите его.Once you've created the provisioning profile, open up Xcode Organizer and refresh it. Если созданный профиль подготовки не отображается, может потребоваться Скачать профиль на портале подготовки iOS и импортировать его вручную.If the provisioning profile you created does not appear it may be necessary to download the profile from the iOS Provisioning Portal and manually import it. На следующем снимке экрана показан пример организатора с добавленным профилем инициализации:The following screen shot shows an example of the Organizer with the provision profile added:

  14. На этом этапе необходимо настроить проект Xamarin. iOS для использования только что созданного профиля подготовки.At this point we need to configure the Xamarin.iOS project to use this newly created provisioning profile. Это делается в диалоговом окне " Параметры проекта " на вкладке " Подписывание пакета iOS ", как показано на следующем снимке экрана:This is done from Project Options dialog, under iOS Bundle Signing tab, as showing in the following screenshot:

На этом этапе приложение настроено для работы с Push-уведомлениями.At this point the application is configured to work with push notifications. Однако с сертификатом по-прежнему требуется еще несколько шагов.However, there are still a few more steps required with the certificate. Этот сертификат имеет формат DER, несовместимый с Пушшарп, для которого требуется сертификат обмена личной информацией (PKCS12).This certificate is in DER format that is not compatible with PushSharp, which requires a Personal Information Exchange (PKCS12) certificate. Чтобы преобразовать сертификат, чтобы он можно было использовать с помощью Пушшарп, выполните следующие заключительные действия.To convert the certificate so that it is usable by PushSharp, perform these final steps:

  1. Скачайте файл сертификата — вход на портал подготовки iOS, перейдите на вкладку Сертификаты, выберите сертификат, связанный с правильным профилем подготовки, и щелкните скачать .Download the certificate file - Login to the iOS Provisioning Portal, chose the Certificates tab, select the certificate associated with the correct provisioning profile and chose Download .
  2. Открыть доступ к цепочке ключей — это приложение является интерфейсом GUI для системы управления паролями в OS X.Open Keychain Access - This is application is a GUI interface to the password management system in OS X.
  3. Импортируйте сертификат — если сертификат еще не установлен, файл... Импорт элементов из меню доступа к цепочке ключей.Import the Certificate - If the certificated isn't already installed, File...Import Items from the Keychain Access menu. Перейдите к сертификату, экспортированному ранее, и выберите его.Navigate to the certificate that exported above, and select it.
  4. Экспорт сертификата . Разверните сертификат, чтобы был виден связанный закрытый ключ, щелкните его правой кнопкой мыши и выберите пункт Экспорт.Export the Certificate - Expand the certificate so the associated private key is visible, right-click on the key and chose Export. Вам будет предложено ввести имя файла и пароль для экспортированного файла.You will be prompted for a filename and a password for the exported file.

На этом этапе мы закончили работу с сертификатами.At this point we are done with certificates. Мы создали сертификат, который будет использоваться для подписывания приложений iOS и преобразования этого сертификата в формат, который можно использовать с Пушшарп в серверном приложении.We have created a certificate that will be used to sign iOS applications and converted that certificate to a format that can be used with PushSharp in a server application. Теперь давайте посмотрим, как приложения iOS взаимодействуют с APNS.Next let's look at how iOS applications interact with APNS.

Регистрация с помощью APNSRegistering with APNS

Прежде чем приложение iOS сможет получить удаленное уведомление, оно должно быть зарегистрировано в APNS.Before an iOS application can receive remote notification it must register with APNS. APNS создаст уникальный маркер устройства и вернет его в приложение iOS.APNS will generate a unique device token and return that to the iOS application. Затем приложение iOS выберет маркер устройства, а затем зарегистрирует его на сервере приложений.The iOS application will then take the device token and then register itself with the application server. После того как все это случится, регистрация завершается, и сервер приложений может отправлять уведомления на мобильное устройство.Once all this happens, registration is complete, and the application server may push notifications to the mobile device.

Теоретически маркер устройства может изменяться каждый раз, когда приложение iOS регистрируется в APNS, однако на практике это не случается часто.In theory, the device token may change each time an iOS application registers itself with APNS, however in practice this does not happen that often. В качестве оптимизации приложение может кэшировать самый последний маркер устройства и обновлять сервер приложений только при его изменении.As an optimization an application may cache the most recent device token and only update the application server when it does change. На следующей схеме показан процесс регистрации и получения маркера устройства.The following diagram illustrates the process of registration and obtaining a device token:

Регистрация с помощью APNs обрабатывается в FinishedLaunching методе класса делегата приложения путем вызова RegisterForRemoteNotificationTypes к текущему UIApplication объекту.Registration with APNS is handled in the FinishedLaunching method of the application delegate class by calling RegisterForRemoteNotificationTypes on the current UIApplication object. Когда приложение iOS регистрируется с помощью APNS, оно также должно указывать типы удаленных уведомлений, которые требуется получать.When an iOS application registers with APNS, it must also specify what types of remote notifications it would like to receive. Эти удаленные типы уведомлений объявляются в перечислении UIRemoteNotificationType.These remote notification types are declared in the enumeration UIRemoteNotificationType. В следующем фрагменте кода приведен пример того, как приложение iOS может зарегистрироваться для получения уведомлений об удаленных оповещениях и индикаторах.The following code snippet is an example of how an iOS application can register to receive remote alert and badge notifications:

if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
    var pushSettings = UIUserNotificationSettings.GetSettingsForTypes (
                       UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
                       new NSSet ());

    UIApplication.SharedApplication.RegisterUserNotificationSettings (pushSettings);
    UIApplication.SharedApplication.RegisterForRemoteNotifications ();
} else {
    UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
    UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes);
}

Запрос регистрации APNs выполняется в фоновом режиме. при получении ответа iOS будет вызывать метод RegisteredForRemoteNotifications AppDelegate в классе и передать зарегистрированный маркер устройства.The APNS registration request happens in the background - when the response is received, iOS will call the method RegisteredForRemoteNotifications in the AppDelegate class and pass the registered device token. Маркер будет содержаться в NSData объекте.The token will be contained in an NSData object. В следующем фрагменте кода показано, как получить маркер устройства, предоставленный APNS:The following code snippet shows how to retrieve the device token that APNS provided:

public override void RegisteredForRemoteNotifications (
UIApplication application, NSData deviceToken)
{
    // Get current device token
    var DeviceToken = deviceToken.Description;
    if (!string.IsNullOrWhiteSpace(DeviceToken)) {
        DeviceToken = DeviceToken.Trim('<').Trim('>');
    }

    // Get previous device token
    var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken");

    // Has the token changed?
    if (string.IsNullOrEmpty(oldDeviceToken) || !oldDeviceToken.Equals(DeviceToken))
    {
        //TODO: Put your own logic here to notify your server that the device token has changed/been created!
    }

    // Save new device token
    NSUserDefaults.StandardUserDefaults.SetString(DeviceToken, "PushDeviceToken");
}

В случае сбоя регистрации по какой-либо причине (например, если устройство не подключено к Интернету), iOS выполнит вызов FailedToRegisterForRemoteNotifications класса делегата приложения.If the registration fails for some reason (such as the device is not connected to the Internet), iOS will call FailedToRegisterForRemoteNotifications on the application delegate class. В следующем фрагменте кода показано, как отобразить предупреждение, информирующее пользователя о том, что произошел сбой регистрации:The following code snippet shows how to display an alert to the user informing them that the registration failed:

public override void FailedToRegisterForRemoteNotifications (UIApplication application , NSError error)
{
    new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null).Show();
}

Служебная заметка устройстваDevice Token Housekeeping

Срок действия маркеров устройства истекает или изменяется с течением времени.Device tokens will expire or change over time. По этой причине серверные приложения должны выполнить некоторую очистку и очистить срок действия или изменения маркеров.Because of this fact, server applications will need to do some house cleaning and purge these expired or changed tokens. Когда приложение отправляет в виде push-уведомления на устройство с просроченным токеном, APNS записывает и сохраняет этот токен с истекшим сроком действия.When an application sends as push notification to a device that has an expired token, APNS will record and save that expired token. Затем серверы могут запросить APNS, чтобы узнать, какие токены устарели.Servers may then query APNS to find out what tokens have expired.

APNS используется для предоставления службы обратной связи — конечная точка HTTPS, которая проходит проверку подлинности через сертификат, созданный для отправки push-уведомлений, и отправляет обратно данные о сроках действия маркеров.APNS used to provide a Feedback Service - an HTTPS endpoint that authenticates via the certificate that was created to send push notifications and sends back data about what tokens have expired. Она устарела Apple и удалена.This has been deprecated by Apple and removed.

Вместо этого существует новый код состояния HTTP для варианта, который ранее был передан службой обратной связи:Instead, there is a new HTTP status code for the case that was previously reported by the Feedback Service:

410-маркер устройства больше не активен для раздела.410 - The device token is no longer active for the topic.

Кроме того, новый timestamp ключ данных JSON будет находиться в тексте ответа:Additionally, a new timestamp JSON data key will be in the response body:

Если значение в заголовке: Status равно 410, значение этого параметра является последним моментом, когда APNs подтвердил, что маркер устройства стал недействительным для раздела.If the value in the :status header is 410, the value of this key is the last time at which APNs confirmed that the device token was no longer valid for the topic.

Отключите отправку уведомлений, пока устройство не зарегистрирует маркер с последующей меткой времени в поставщике.Stop pushing notifications until the device registers a token with a later timestamp with your provider.

СводкаSummary

В этом разделе представлены основные понятия, связанные с Push-уведомлениями в iOS.This section introduce the key concepts surrounding push notifications in iOS. В нем объяснена роль службы шлюза push-уведомлений Apple (APNS).It explained the role of the Apple Push Notification Gateway Service (APNS). Затем мы рассмотрели создание и использование сертификатов безопасности, необходимых для APNS.It then covered the creation and use of the security certificates that are essential to APNS. Наконец, этот документ завершился с обсуждением того, как серверы приложений могут использовать службы отзывов для прекращения отслеживания токенов устройств с истекшим сроком действия.Finally this document finished up with a discussion on how application servers can use the Feedback Services to stop tracking expired device tokens.