iOS의 푸시 알림

Important

이 섹션의 정보는 iOS 9 이전 버전과 관련이 있으며 이전 iOS 버전을 지원하기 위해 여기에 남아 있습니다. iOS 10 이상의 경우 iOS 디바이스에서 로컬 및 원격 알림을 모두 지원하는 사용자 알림 프레임워크 가이드 를 참조하세요.

푸시 알림은 간략하게 유지되어야 하며, 업데이트를 위해 서버 애플리케이션에 문의해야 함을 모바일 애플리케이션에 알리기에 충분한 데이터만 포함해야 합니다. 예를 들어 새 전자 메일이 도착하면 서버 애플리케이션은 모바일 애플리케이션에 새 전자 메일이 도착했음을 알립니다. 알림에는 새 전자 메일 자체가 포함되지 않습니다. 그러면 모바일 애플리케이션이 적절한 경우 서버에서 새 전자 메일을 검색합니다.

iOS에서 푸시 알림의 중심에는 APNS(Apple Push Notification Gateway Service)가 있습니다. 애플리케이션 서버에서 iOS 디바이스로 알림을 라우팅하는 작업을 담당하는 Apple에서 제공하는 서비스입니다. 다음 이미지는 iOS에 대한 푸시 알림 토폴로지를 보여 줍니다. 이 이미지는 iOS에 대한 푸시 알림 토폴로지를 보여 줍니다.

원격 알림 자체는 iOS 개발자 설명서의 로컬 및 푸시 알림 프로그래밍 가이드의 알림 페이로드 섹션에 지정된 형식 및 프로토콜을 준수하는 JSON 형식 문자열입니다.

Apple은 apNS의 두 환경인 샌드박스프로덕션 환경을 기본. 샌드박스 환경은 개발 단계에서 테스트하기 위한 것이며 TCP 포트 2195에서 gateway.sandbox.push.apple.com 찾을 수 있습니다. 프로덕션 환경은 배포된 애플리케이션에서 사용되며 TCP 포트 2195에서 gateway.push.apple.com 찾을 수 있습니다.

요구 사항

푸시 알림은 APNS 아키텍처에 의해 결정되는 다음 규칙을 준수해야 합니다.

  • 256바이트 메시지 제한 - 알림의 전체 메시지 크기는 256바이트를 초과하지 않아야 합니다.
  • 영수증 확인 없음 - APNS는 보낸 사람에게 메시지가 의도한 받는 사람에게 전달되었다는 알림을 제공하지 않습니다. 디바이스에 연결할 수 없고 여러 순차 알림이 전송되면 가장 최근 알림을 제외한 모든 알림이 손실됩니다. 최신 알림만 디바이스에 전달됩니다.
  • 각 애플리케이션에는 보안 인증서 가 필요합니다. APNS와의 통신은 SSL을 통해 수행해야 합니다.

인증서 만들기 및 사용

이전 섹션에서 멘션 각 환경에는 자체 인증서가 필요합니다. 이 섹션에서는 인증서를 만들고 프로비저닝 프로필과 연결한 다음 PushSharp에서 사용할 개인 정보 교환 인증서를 가져오는 방법을 설명합니다.

  1. 인증서를 만들려면 다음 스크린샷과 같이 Apple 웹 사이트의 iOS 프로비저닝 포털로 이동합니다(왼쪽의 앱 ID 메뉴 항목 참조).

    Apples 웹 사이트의 iOS 프로비저닝 포털

  2. 다음으로, 다음 스크린샷과 같이 앱 ID 섹션으로 이동하여 새 앱 ID를 만듭니다.

    앱 ID 섹션으로 이동하여 새 앱 ID 만들기

  3. 단추를 클릭하면 + 다음 스크린샷과 같이 앱 ID에 대한 설명과 번들 식별자를 입력할 수 있습니다.

    앱 ID에 대한 설명 및 번들 식별자 입력

  4. 명시적 앱 ID를 선택하고 번들 식별자가 .로 * 끝나지 않는지 확인합니다. 이렇게 하면 여러 애플리케이션에 적합한 식별자가 생성되고 푸시 알림 인증서는 단일 애플리케이션에 대해 있어야 합니다.

  5. App Services에서 푸시 알림을 선택합니다.

    푸시 알림 선택

  6. 또한 Submit 키를 눌러 새 앱 ID 등록을 확인합니다.

    새 앱 ID 등록 확인

  7. 다음으로 앱 ID에 대한 인증서를 만들어야 합니다. 왼쪽 탐색 창에서 인증서 모두로 이동하고 > 다음 스크린샷과 같이 단추를 선택합니다+.

    앱 ID에 대한 인증서 만들기

  8. 개발 또는 프로덕션 인증서를 사용할지 여부를 선택합니다.

    개발 또는 프로덕션 인증서 선택

  9. 그런 다음 방금 만든 새 앱 ID를 선택합니다.

    방금 만든 새 앱 ID 선택

  10. 그러면 Mac에서 키 집합 액세스 애플리케이션을 사용하여 인증서 서명 요청을 만드는 과정을 안내하는 지침이 표시됩니다.

  11. 이제 인증서가 만들어졌으므로 APN에 등록할 수 있도록 애플리케이션에 서명하는 빌드 프로세스의 일부로 사용해야 합니다. 이렇게 하려면 인증서를 사용하는 프로비저닝 프로필을 만들고 설치해야 합니다.

  12. 개발 프로비저닝 프로필을 만들려면 프로비전 프로필 섹션으로 이동하여 방금 만든 앱 ID를 사용하여 프로비전 프로필을 만드는 단계를 수행합니다.

  13. 프로비저닝 프로필을 만든 후 Xcode 구성 도우미를 열고 새로 고칩니다. 만든 프로비저닝 프로필이 표시되지 않으면 iOS 프로비저닝 포털에서 프로필을 다운로드하고 수동으로 가져와야 할 수 있습니다. 다음 스크린샷은 프로비저닝 프로필이 추가된 이끌이의 예를 보여 제공합니다.
    이 스크린샷은 프로비전 프로필이 추가된 이끌이의 예를 보여줍니다.

  14. 이 시점에서 새로 만든 프로비저닝 프로필을 사용하도록 Xamarin.iOS 프로젝트를 구성해야 합니다. 이 작업은 다음 스크린샷과 같이 iOS 번들 서명 탭의 프로젝트 옵션 대화 상자에서 수행됩니다.
    새로 만든 이 프로비저닝 프로필을 사용하도록 Xamarin.iOS 프로젝트 구성

이 시점에서 애플리케이션은 푸시 알림으로 작동하도록 구성됩니다. 그러나 인증서에 필요한 몇 가지 단계가 더 있습니다. 이 인증서는 PKCS12(개인 정보 교환) 인증서가 필요한 PushSharp와 호환되지 않는 DER 형식입니다. PushSharp에서 사용할 수 있도록 인증서를 변환하려면 다음 최종 단계를 수행합니다.

  1. 인증서 파일 다운로드 - iOS 프로비전 포털에 로그인하고, 인증서 탭을 선택하고, 올바른 프로비전 프로필과 연결된 인증서를 선택하고, 다운로드를 선택합니다.
  2. Open Keychain Access - 애플리케이션은 OS X의 암호 관리 시스템에 대한 GUI 인터페이스입니다.
  3. 인증서 가져오기 - 인증서가 아직 설치되지 않은 경우 파일... 키 집합 액세스 메뉴에서 항목을 가져옵니다. 위에서 내보낸 인증서로 이동하여 선택합니다.
  4. 인증서 내보내기 - 연결된 프라이빗 키가 표시되도록 인증서를 확장하고 키를 마우스 오른쪽 단추로 클릭하고 내보내기를 선택합니다. 내보낸 파일의 파일 이름 및 암호를 묻는 메시지가 표시됩니다.

이 시점에서 인증서를 사용하여 완료됩니다. iOS 애플리케이션에 서명하는 데 사용할 인증서를 만들고 해당 인증서를 서버 애플리케이션에서 PushSharp와 함께 사용할 수 있는 형식으로 변환했습니다. 다음으로 iOS 애플리케이션이 APNS와 상호 작용하는 방법을 살펴보겠습니다.

APNS에 등록

iOS 애플리케이션이 원격 알림을 받으려면 먼저 APNS에 등록해야 합니다. APNS는 고유한 디바이스 토큰을 생성하고 iOS 애플리케이션에 반환합니다. 그러면 iOS 애플리케이션이 디바이스 토큰을 가져와서 애플리케이션 서버에 등록합니다. 이 모든 작업이 완료되면 등록이 완료되고 애플리케이션 서버가 모바일 디바이스에 알림을 푸시할 수 있습니다.

이론적으로는 iOS 애플리케이션이 APNS에 등록할 때마다 디바이스 토큰이 변경되어도 실제로는 그렇지 않습니다. 최적화로 애플리케이션은 최신 디바이스 토큰을 캐시하고 변경되는 경우에만 애플리케이션 서버를 업데이트할 수 있습니다. 다음 다이어그램에서는 디바이스 토큰을 등록하고 가져오는 프로세스를 보여 줍니다.

이 다이어그램은 등록 및 디바이스 토큰 가져오기 프로세스를 보여 줍니다.

APNS를 사용한 등록은 현재 UIApplication 개체를 FinishedLaunching 호출 RegisterForRemoteNotificationTypes 하여 애플리케이션 대리자 클래스의 메서드에서 처리됩니다. iOS 애플리케이션이 APNS에 등록하는 경우 수신하려는 원격 알림 유형도 지정해야 합니다. 이러한 원격 알림 유형은 열거형에서 선언됩니다 UIRemoteNotificationType. 다음 코드 조각은 iOS 애플리케이션이 원격 경고 및 배지 알림을 수신하도록 등록할 수 있는 방법의 예입니다.

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는 클래스의 메서드 RegisteredForRemoteNotificationsAppDelegate 호출하고 등록된 디바이스 토큰을 전달합니다. 토큰은 개체에 NSData 포함됩니다. 다음 코드 조각은 APNS가 제공한 디바이스 토큰을 검색하는 방법을 보여 줍니다.

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 합니다. 다음 코드 조각은 등록에 실패했음을 알리는 경고를 사용자에게 표시하는 방법을 보여줍니다.

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

디바이스 토큰 하우스키핑

디바이스 토큰은 시간이 지남에 따라 만료되거나 변경됩니다. 이 때문에 서버 애플리케이션은 일부 하우스 클린 수행하고 만료되거나 변경된 토큰을 제거해야 합니다. 애플리케이션이 만료된 토큰이 있는 디바이스에 푸시 알림으로 보내면 APNS는 만료된 토큰을 기록하고 저장합니다. 서버는 APNS를 쿼리하여 만료된 토큰을 확인할 수 있습니다.

피드백 서비스를 제공하는 데 사용되는 APNS - 푸시 알림을 보내기 위해 만든 인증서를 통해 인증하고 만료된 토큰에 대한 데이터를 다시 보내는 HTTPS 엔드포인트입니다. 이것은 애플에 의해 더 이상 사용되지 않으며 제거되었습니다.

대신 피드백 서비스에서 이전에 보고한 사례에 대한 새 HTTP 상태 코드가 있습니다.

410 - 디바이스 토큰이 더 이상 토픽에 대해 활성화되지 않습니다.

또한 새 timestamp JSON 데이터 키는 응답 본문에 포함됩니다.

:상태 헤더의 값이 410인 경우 이 키의 값은 APN에서 디바이스 토큰이 항목에 더 이상 유효하지 않음을 확인한 마지막 시간입니다.

디바이스가 나중에 타임스탬프에 토큰을 공급자에 등록할 때까지 알림 푸시를 중지합니다.

요약

이 섹션에서는 iOS의 푸시 알림을 둘러싼 주요 개념을 소개합니다. APNS(Apple Push Notification Gateway Service)의 역할을 설명했습니다. 그런 다음 APNS에 필수적인 보안 인증서를 만들고 사용하는 방법을 설명했습니다. 마지막으로 이 문서는 애플리케이션 서버가 Feedback Services를 사용하여 만료된 디바이스 토큰 추적을 중지하는 방법에 대한 논의를 완료했습니다.