IOS의 푸시 알림Push 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 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

IOS의 푸시 알림 중심에는 APNS (Apple Push Notification Gateway Service) 가 있습니다.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. 다음 이미지는 iOS에 대 한 푸시 알림 토폴로지를 보여 줍니다.The following image illustrates the push notification topology for iOS:

원격 알림 자체는 IOS 개발자 설명서로컬 및 푸시 알림 프로그래밍 가이드알림 페이로드 섹션에 지정 된 형식 및 프로토콜을 준수 하는 JSON 형식 문자열입니다.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은 Sandbox프로덕션 환경 이라는 두 가지 APNS 환경을 유지 관리 합니다.Apple maintains two environments of APNS: a Sandbox and a Production environment. 샌드박스 환경은 개발 단계 중에 테스트를 위한 것 이며 TCP 포트 2195의 gateway.sandbox.push.apple.com에서 찾을 수 있습니다.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

푸시 알림은 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. 이 섹션에서는 인증서를 만들고, 프로 비전 프로필과 연결한 다음, PushSharp에서 사용할 개인 정보 교환 인증서를 가져오는 방법을 다룹니다.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. 인증서를 만들려면 다음 스크린샷에 표시 된 것 처럼 Apple 웹 사이트의 iOS 프로 비전 포털로 이동 합니다 (왼쪽의 앱 Id 메뉴 항목 확인).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. 그런 다음 앱 ID의 섹션으로 이동 하 고 다음 스크린샷에 표시 된 것 처럼 새 앱 ID를 만듭니다.Next, navigate to the App ID's section and create a new app ID as shown in the following screenshot:

  3. + 단추를 클릭 하면 다음 스크린샷에 표시 된 것 처럼 앱 ID에 대 한 설명 및 번들 식별자를 입력할 수 있습니다.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. 명시적 앱 ID 를 선택 하 고 번들 식별자가 *로 끝나지 않는지 확인 합니다.Make sure to select Explicit App ID and that the Bundle Identifier doesn't end with a * . 이렇게 하면 여러 응용 프로그램에 적합 한 식별자가 생성 되 고 단일 응용 프로그램에 대 한 푸시 알림 인증서가 필요 합니다.This will create an identifier that is good for multiple applications, and push notification certificates must be for a single application.

  5. App Services에서 푸시 알림을 선택 합니다.Under App Services, select Push Notifications:

  6. 제출을 눌러 새 앱 ID의 등록을 확인 합니다.And press Submit to confirm registration of the new App ID:

  7. 다음으로, 앱 ID에 대 한 인증서를 만들어야 합니다.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. 그런 다음 방금 만든 새 앱 ID를 선택 합니다.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. 개발 프로 비전 프로필을 만들려면 프로 비전 프로필 섹션으로 이동 하 고 단계에 따라 방금 만든 앱 Id를 사용 합니다.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 Organizer 를 열고 새로 고칩니다.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:

이 시점에서 응용 프로그램은 푸시 알림과 함께 작동 하도록 구성 됩니다.At this point the application is configured to work with push notifications. 그러나 인증서에는 여전히 몇 가지 단계가 필요 합니다.However, there are still a few more steps required with the certificate. 이 인증서는 PKCS12 (개인 정보 교환) 인증서가 필요한 PushSharp와 호환 되지 않는 DER 형식입니다.This certificate is in DER format that is not compatible with PushSharp, which requires a Personal Information Exchange (PKCS12) certificate. PushSharp에서 사용할 수 있도록 인증서를 변환 하려면 다음 최종 단계를 수행 합니다.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. 집합 액세스 열기 -응용 프로그램은 OS X의 암호 관리 시스템에 대 한 GUI 인터페이스입니다.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 응용 프로그램에 서명 하 고 해당 인증서를 서버 응용 프로그램의 PushSharp에서 사용할 수 있는 형식으로 변환 하는 데 사용 되는 인증서를 만들었습니다.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.

APNS에 등록Registering 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를 사용 하 여 등록은 현재 UIApplication 개체에서 RegisterForRemoteNotificationTypes를 호출 하 여 응용 프로그램 대리자 클래스의 FinishedLaunching 메서드에서 처리 됩니다.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는 AppDelegate 클래스에서 RegisteredForRemoteNotifications 메서드를 호출 하 고 등록 된 장치 토큰을 전달 합니다.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. 응용 프로그램이 만료 된 토큰이 있는 장치에 푸시 알림을 보내면 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 끝점입니다.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

이 섹션에서는 iOS의 푸시 알림을 둘러싼 주요 개념을 소개 합니다.This section introduce the key concepts surrounding push notifications in iOS. APNS (Apple Push Notification Gateway) 서비스의 역할에 대해 설명 했습니다.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.