답변:
이 토큰 신뢰 단계의 형식은 APN만이 나중에 존중할 토큰을 생성하도록 보장하며, 장치가 전달한 토큰이 이전에 특정 장치에 대해 프로비저닝 된 것과 동일한 토큰임을 스스로 보장 할 수 있습니다. 그 장치를 위해.
사용자가 백업 데이터를 새 장치로 복원하거나 운영 체제를 다시 설치하면 장치 토큰이 변경됩니다.
이 점에 대한 Apple의 공식 문서는 명확하지 않습니다. 내가 관찰 한 것은 이것이다 : 토큰은 주어진 장치, 응용 프로그램 및 도메인 (프로덕션 대 샌드 박스)에 대해 변하지 않습니다. 시스템이 안정적으로 작동하려면 이것이 사실로 유지되어야한다고 생각합니다. 애플리케이션 업데이트가 새 APN 토큰을 트리거하는 상황을 고려하십시오. 알림이 활성화 된 트위터와 유사한 가장 멋진 앱을 사용하고 있다면 iTunes에서 앱을 업데이트하면 어떻게됩니까? 업데이트를 장치에 "동기화"한 후 응용 프로그램을 실행하지 않은 경우에도 알림이 계속 전송 될 것으로 예상해야합니까? 업데이트 된 앱을 실행하지 않은 경우에도 OS가 사용자를 대신하여 알림을받을 수 있으므로 애플리케이션을 변경하는 행위는 APN 시스템에 영향을 미치지 않습니다.
분명히 애플은 "애플리케이션은 시작할 때마다 [APN 서버에] 등록해야하며 공급자에게 현재 토큰을 제공해야합니다."라고 말합니다. 전적으로 동의합니다. 이렇게하면 잘못된 가정이나 비정상적인 상황으로부터 애플리케이션을 보호 할 수 있습니다.
푸시 알림 토큰은 단일 장치의 모든 앱에서 고유합니까? 에 대한 답변 중 하나입니다 . 장치 토큰이 "운영 체제 설치"별로 고유함을 나타냅니다. 백업에서 장치로 복원하면 토큰이 유지되지만 장치를 지우면 새 토큰을 얻게됩니다. 이는 원활한 작동 및 개인 정보 보호에 대한 Apple의 의도와 전적으로 일치합니다. 장치를 지우는 것은 새로운 연결이 필요할 수있을만큼 심각하지만 OS 업데이트 후 이미지를 복원하는 사용자는 기존 알림을 보존하기를 원할 것입니다. iPad에서 최근 iOS5 업데이트를 기억하면 업그레이드 후 가장 최근 백업을 복원했기 때문에 알림 토큰의 일관성이 유지되었을 것입니다. [편집 : 백업을 다른 위치로 복원 장치는 토큰을 복제하지 않습니다.]
주의 사항 :이 주제에 대한 명확한 지식이 없으며 APN (타사 개발자)으로 작업 한 합리적인 경험이 있습니다. 항상 그렇듯이 가정을 확인하는 것이 가장 좋습니다.
저는 최근에 a> Apple 엔지니어와 이야기하고 b> 실제 테스트를 실행할 수있는 기회가 있었고 결과를 발표하고 싶었습니다.
완료하기 위해 APN 토큰 반환에 대해 이야기 할 때 단일 번들 식별자 / 애플리케이션의 컨텍스트를 가정합니다.
첫째, Apple 엔지니어는 두 장치가 동일한 APN을 반환하는 것이 가능하지 않아야한다고 말했습니다. 아래의 설명에도 불구하고 이것이 실패하는 상황을 식별 할 수 없었습니다.
둘째, 다음은 업그레이드 테스트 순서 및 결과입니다.
iPhone4에 설치된 iOS4로 시작하십시오. iTunes의 백업 장치
iOS5로 업그레이드
이전 테스트에서 APN 토큰이 이제 다르다는 것을 알고 있습니다.
장치에 백업 복원
APN 토큰은 이제 1 단계와 동일합니다.
iOS 재설정 (깨끗한 장치)
APN 토큰 변경
다른 전화를 iTunes에 백업하고 해당 백업을 테스트 장치로 복원하십시오. 기본적으로 전화를 바꾸는 것처럼 "잘못된"백업을 복원하고 있습니다.
APN 토큰이 다시 변경됩니다. 또한 그것은 고유하고 원래 토큰 또는 "복제 된"토큰과 일치하지 않습니다.
장치에 "올바른"백업을 복원하십시오.
APN 토큰은 이제 1 단계와 동일합니다.
마지막으로 휴대 전화를 iOS6 (베타 2)로 업그레이드하고 백업을 복원하고 다시 테스트했습니다. 예상대로 토큰은 1 단계의 토큰과 계속 일치했습니다.
이 시점에서 저는 APN 토큰을 다른 장치간에 복제 할 수 없다고 확신합니다. 아마도 이것은 이전 버전의 iOS에서 버그로 발생했을 수 있지만 iOS5 (그리고 아마도 iOS6)가 APN 토큰을 올바르게 처리하고 있다고 확신합니다.
나는 이것을 추가하지 않았다는 것을 깨달았습니다. 장치 토큰 이 변경됩니다. Apple 개발자 중 한 명이 토큰이 실제로 만료된다는 사실을 공유했습니다 (2 년 후). 많은 목적을 위해 이것은 불변으로 생각할 수있을만큼 충분히 길다.
[특히 매년 휴대폰을 교체하기 때문에 2 년마다 새로운 토큰으로 테스트 스크립트를 업데이트해야하는지 걱정하지 않습니다.]
앱을 다시 설치 하면 iOS9 및 APN 푸시 토큰 변경 사항으로 방금 테스트했습니다 .
예 , 기기 토큰이 변경 될 수 있습니다.
앱은 토큰을받을 때마다이를 저장해야합니다. 새로운 토큰이 수신 될 때마다 그런 다음, (이 것입니다 서로 다른 경우에 발생, 결국), 저장된 토큰에 새 토큰을 비교 :
nil
).실제적으로 마지막 단계는 사소하지 않을 가능성이 가장 높습니다. 당신이 장치에 가입했다고 우편 번호 내용에 따라 토큰 장치에 날씨 경고를 보내는 서비스가있는 경우 예를 들어, 당신은 통과해야 old_token
하고,을 new_token
은 납기를 업데이트 할 수 있도록했다 서비스.
Ergo는 일반적으로 "장치 토큰"을 수락하는 API의 100 %도 UPDATE
해당 토큰을위한 일종의 기능을 가지고 있어야합니다 . 이를 위해 빌드 하지 않는다는 것은 잘못 전달되거나 전달되지 않은 알림 을 빌드하는 것입니다.
iOS 8 이상에서 기기 토큰이 변경됨
Apple 웹 사이트에서 아래 텍스트를 참조하십시오. 사용자 알림 등록, 예약 및 처리
기기 토큰은 특정 기기의 앱에 푸시 알림을 보내는 데 핵심적인 역할을합니다. 기기 토큰은 변경 될 수 있으므로 앱이 시작될 때마다 다시 등록하고 수신 된 토큰을 서버로 다시 전달해야합니다. 장치 토큰 업데이트에 실패하면 원격 알림이 사용자의 장치에 전달되지 않을 수 있습니다. 장치 토큰은 사용자가 백업 데이터를 새 장치 또는 컴퓨터로 복원하거나 운영 체제를 다시 설치할 때 항상 변경됩니다. 데이터를 새 장치 또는 컴퓨터로 마이그레이션 할 때 사용자는 해당 장치에 원격 알림을 전달하기 전에 앱을 한 번 실행해야합니다.
나는 당신이을 호출 한 후에 토큰이 변경된다는 것을 아무도하지 않았기 때문에 언급 할 가치가 있다고 생각합니다 unregisterForRemoteNotifications
. registerForRemoteNotifications
다음에 호출 하면 토큰이 다릅니다. Apple 문서에서 이에 대한 확인을 찾지 못했지만 그러한 행동을 직접 목격했습니다. 이것을 명심하십시오
앱이 새 기기로 복원되지 않는 한 변경해서는 안됩니다 (이 시점에서 푸시 알림을 다시 수락하라는 요청을받지 않고 새 토큰을 수락해야하는 시점에 등록 된 호출을 전송합니다).
그러나 Apple은 절대 변경되지 않는다고 보장하지 않습니다 (따라서 문서에 언급되지 않음). 최악의 경우 더 나은 프로그램을 만들고 언젠가는 바뀔 수 있다고 가정합니다. 또한 서버에 토큰을 정기적으로 보내면 한동안 등록되지 않았고 앱을 제거했거나 얼마 전에 관심을 잃었을 가능성이있는 토큰을 제거 할 수 있습니다 (문서에서는이를 원하는 동작으로 지정합니다!).
출처 -Apple Docs
APN은 다양한 이유로 새 장치 토큰을 발급 할 수 있습니다.
사용자가 새 기기에 앱을 설치합니다.
사용자가 백업에서 장치를 복원합니다.
사용자가 운영 체제를 다시 설치합니다.
기타 시스템 정의 이벤트
따라서 앱은 시작시 기기 토큰을 요청해야합니다.
추가적으로 :
중대한
APN 장치 토큰은 가변 길이입니다. 크기를 하드 코딩하지 마십시오.
링크는 애플과 함께 금방 쓸모 없게됩니다! 그래서 나는 지금 아주 분명해 보이는 것을 인용하고 있습니다.
앱에서 장치 토큰을 캐시하지 마십시오. 대신 필요할 때 시스템에서 가져옵니다. APN은 특정 이벤트가 발생하면 앱에 새 장치 토큰을 발급합니다. 기기 토큰은 사용자가 백업에서 기기를 복원 할 때, 사용자가 새 기기에 앱을 설치할 때, 사용자가 운영 체제를 다시 설치할 때와 같이 다를 수 있습니다. 캐시에 의존하지 않고 토큰을 가져 오면 공급자가 APN과 통신하는 데 필요한 현재 장치 토큰을 확보 할 수 있습니다. 기기 토큰을 가져 오려고했지만 변경되지 않은 경우 가져 오기 메서드가 빠르게 반환됩니다.
참조로 애플 푸시 알림 물건
기기 토큰은 특정 기기의 앱에 푸시 알림을 보내는 데 핵심적인 역할을합니다. 기기 토큰은 변경 될 수 있으므로 앱이 시작될 때마다 다시 등록하고 수신 된 토큰을 서버로 다시 전달해야합니다. 장치 토큰 업데이트에 실패하면 원격 알림이 사용자의 장치에 전달되지 않을 수 있습니다. 장치 토큰은 사용자가 백업 데이터를 새 장치 또는 컴퓨터로 복원하거나 운영 체제를 다시 설치할 때 항상 변경됩니다. 데이터를 새 장치 또는 컴퓨터로 마이그레이션 할 때 사용자는 해당 장치에 원격 알림을 전달하기 전에 앱을 한 번 실행해야합니다.
장치 토큰을 캐시하지 마십시오. 필요할 때마다 항상 시스템에서 토큰을 가져옵니다. 앱이 이전에 원격 알림에 등록 된 경우 registerForRemoteNotifications 메서드를 다시 호출해도 추가 오버 헤드가 발생하지 않으며 iOS는 즉시 앱 대리자에게 기존 장치 토큰을 반환합니다. 또한 iOS는 앱 등록 또는 재 등록에 대한 응답뿐만 아니라 장치 토큰이 변경 될 때마다 위임 메서드를 호출합니다.
이 링크 에 따르면 장치 토큰
각 요청에 포함 된 장치 토큰은 알림을 수신하는 장치의 ID를 나타냅니다. APN은 장치 토큰을 사용하여 각각의 고유 한 앱 및 장치 조합을 식별합니다. 또한이를 사용하여 장치로 전송되는 원격 알림의 라우팅을 인증합니다. 앱이 기기에서 실행될 때마다 APN에서이 토큰을 가져와 공급자에게 전달합니다. 공급자는 토큰을 저장하고 특정 앱 및 장치에 알림을 보낼 때 사용합니다. 토큰 자체는 불투명하고 영구적이며 기기의 데이터와 설정이 지워질 때만 변경됩니다. APN 만 장치 토큰을 디코딩하고 읽을 수 있습니다.
예 , 변경할 수 있습니다. 이상적으로는 콜백 메서드를 통해 토큰을받을 때
- (void) application : (UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken : (NSData *) deviceToken
앱은 원격 서버에서 토큰을 등록 / 새로 고침해야합니다. 이렇게하면 APNS와 서버의 토큰이 동기화 상태로 유지됩니다.
당으로 애플의 문서 ,
앱별 장치 토큰을 얻고 처리하는 작업은 다음과 같습니다.
앱이 원격 알림을 위해 APN에 등록됩니다. 새 장치 토큰이 필요한 경우 APN은 장치 인증서에 포함 된 정보를 사용하여 토큰을 생성합니다. 토큰 키를 사용하여 토큰을 암호화하고 오른쪽을 가리키는 가운데 화살표에 표시된 것처럼 장치로 반환합니다. 시스템은 application : didRegisterForRemoteNotificationsWithDeviceToken : delegate 메소드를 호출하여 기기 토큰을 앱에 다시 전달합니다. 토큰을 받으면 앱 (대리자 메서드 내)에서이 토큰을 바이너리 또는 16 진수 형식으로 제공 업체에 전달해야합니다. 공급자는이 토큰없이 장치에 알림을 보낼 수 없습니다. 자세한 내용은 원격 알림 지원 구성의 원격 알림 수신 등록을 참조하십시오.
앱 설치시 장치 토큰 릴레이입니다.
즉 , 응용 프로그램을 다시 설치하면 변경됩니다 . 백업, iOS 업그레이드 ecc에서 수행하면 충족되지 않습니다.
이를 사용하는 올바른 방법은 문제를 방지하기 위해 NSPAppDelegate
각 응용 프로그램을 시작할 때 메서드에서 제공하는 것입니다.didRegisterForRemoteNotificationsWithDeviceToken