Câu trả lời:
Từ [Tài liệu Apple ApplePushService] 2
Hình thức của giai đoạn ủy thác mã thông báo này đảm bảo rằng chỉ các APN tạo ra mã thông báo mà nó sẽ tôn vinh sau này và nó có thể tự đảm bảo rằng mã thông báo được một thiết bị trao cho nó giống như mã thông báo mà nó đã cấp trước đó cho thiết bị cụ thể đó — và duy nhất cho thiết bị đó.
Nếu người dùng khôi phục dữ liệu sao lưu vào thiết bị mới hoặc cài đặt lại hệ điều hành, mã thông báo thiết bị sẽ thay đổi.
Tài liệu chính thức của Apple không rõ ràng về điểm này. Những gì tôi quan sát được là: mã thông báo là bất biến đối với một thiết bị, ứng dụng và miền nhất định (sản xuất so với hộp cát). Tôi tin rằng điều này phải đúng để hệ thống hoạt động đáng tin cậy. Xem xét tình huống mà bản cập nhật ứng dụng kích hoạt mã thông báo APN mới; nếu tôi đang sử dụng ứng dụng giống Twitter mới nhất, có bật thông báo, thì điều gì sẽ xảy ra khi tôi cập nhật ứng dụng của mình từ iTunes? Tôi có nên mong đợi rằng nó sẽ tiếp tục được gửi thông báo ngay cả khi tôi không chạy ứng dụng kể từ khi tôi "đồng bộ hóa" bản cập nhật vào thiết bị của mình không? Hành động thay đổi ứng dụng không thể ảnh hưởng đến hệ thống APN vì Hệ điều hành có thể nhận thông báo thay mặt bạn ngay cả khi bạn chưa chạy ứng dụng được cập nhật.
Để rõ ràng hơn, Apple tuyên bố "Một ứng dụng nên đăng ký [với máy chủ APN] mỗi khi nó khởi chạy và cung cấp cho nhà cung cấp mã thông báo hiện tại". Tôi hết lòng đồng ý; làm như vậy sẽ bảo vệ ứng dụng của bạn khỏi các giả định xấu hoặc các tình huống bất thường.
Một trong những câu trả lời cho Mã thông báo đẩy có phải là duy nhất trên tất cả các ứng dụng cho một thiết bị không? cho biết rằng mã thông báo thiết bị là duy nhất cho mỗi "cài đặt hệ điều hành"; và việc khôi phục từ bản sao lưu vào thiết bị sẽ duy trì mã thông báo nhưng xóa thiết bị sẽ khiến thiết bị nhận được mã thông báo mới. Điều này hoàn toàn phù hợp với ý định của Apple về hoạt động liền mạch và quyền riêng tư: xóa thiết bị đủ nghiêm trọng để có lẽ nó đảm bảo một liên kết mới, nhưng người dùng khôi phục hình ảnh sau khi cập nhật hệ điều hành sẽ muốn giữ lại các thông báo hiện có của họ. Nếu tôi nhớ lại bản cập nhật iOS5 gần đây trên iPad của mình, tôi đã khôi phục bản sao lưu gần đây nhất sau khi nâng cấp, vì vậy điều này sẽ duy trì tính nhất quán của mã thông báo của tôi. [Chỉnh sửa: khôi phục một bản sao lưu thành một bản sao lưu khác thiết bị sẽ KHÔNG nhân bản mã thông báo.]
cảnh báo: Tôi không có kiến thức chắc chắn về chủ đề này, chỉ có một số kinh nghiệm hợp lý khi làm việc với APN (với tư cách là nhà phát triển bên thứ ba). Như mọi khi, tốt nhất là bạn nên xác minh các giả định của mình.
Gần đây tôi đã có cơ hội a> nói chuyện với các kỹ sư của Apple và b> chạy một số thử nghiệm trong thế giới thực và tôi muốn trình bày kết quả:
Để hoàn chỉnh, khi tôi nói về việc trả lại mã thông báo APN, tôi đang giả định bối cảnh của một ứng dụng / định danh gói duy nhất.
Đầu tiên, các kỹ sư của Apple nói rằng không thể có chuyện hai thiết bị trả về cùng một APN. Mặc dù có những nhận xét bên dưới, tôi vẫn chưa thể xác định được trường hợp nào khiến việc này không thành công.
Thứ hai, đây là trình tự kiểm tra nâng cấp và kết quả:
Bắt đầu với iOS4 được cài đặt trên iPhone4; thiết bị sao lưu trong iTunes
Nâng cấp lên iOS5
Từ một thử nghiệm trước, tôi biết rằng mã thông báo APN hiện đã khác
Khôi phục bản sao lưu vào thiết bị
Mã thông báo APN bây giờ giống như bước 1.
Đặt lại iOS (thiết bị sạch)
Mã thông báo APN thay đổi
Sao lưu một điện thoại khác vào iTunes và khôi phục bản sao lưu đó vào thiết bị thử nghiệm; về cơ bản, tôi đang khôi phục bản sao lưu "sai", như thể tôi đang chuyển đổi điện thoại.
Mã thông báo APN lại thay đổi; hơn nữa, nó khác biệt và không khớp với các mã thông báo hoặc mã thông báo gốc hoặc mã thông báo "nhân bản".
Khôi phục bản sao lưu "đúng" vào thiết bị.
Mã thông báo APN hiện giống như bước 1.
Cuối cùng, tôi đã nâng cấp điện thoại lên iOS6 (beta2), khôi phục bản sao lưu của mình và kiểm tra lại. Như mong đợi, mã thông báo tiếp tục khớp với mã thông báo ở bước 1.
Tại thời điểm này, tôi khá tự tin rằng mã thông báo APN không thể bị trùng lặp giữa các thiết bị khác nhau; có lẽ điều này có thể đã xảy ra như một lỗi trong các phiên bản iOS trước đó, nhưng tôi tin rằng iOS5 (và có lẽ là iOS6) đang xử lý mã thông báo APN một cách chính xác.
Tôi chỉ nhận ra rằng tôi đã không thêm điều này: mã thông báo thiết bị sẽ thay đổi. Một trong những nhà phát triển của Apple đã chia sẻ với tôi rằng các token thực sự sẽ hết hạn (tôi nghĩ là sau 2 năm). Đối với nhiều mục đích, điều này đủ dài để có thể được coi là bất biến.
[Tôi không lo lắng nếu tôi phải cập nhật các tập lệnh thử nghiệm của mình bằng các mã thông báo mới mỗi hai năm, đặc biệt là vì tôi thay đổi điện thoại mỗi năm.]
Tôi vừa thử nghiệm nó với iOS9 và các thay đổi mã thông báo APN Push nếu tôi cài đặt lại một ứng dụng.
CÓ , mã thông báo thiết bị có thể thay đổi.
Bất cứ khi nào ứng dụng của bạn nhận được mã thông báo, nó sẽ lưu trữ nó. Sau đó, bất cứ khi nào nhận được mã thông báo mới ( cuối cùng sẽ xảy ra), hãy so sánh mã thông báo mới với mã thông báo đã lưu trữ và nếu chúng khác nhau:
nil
)Như một vấn đề thực tế, bước cuối cùng có nhiều khả năng là không tầm thường. Ví dụ: nếu bạn có một dịch vụ đang gửi cảnh báo thời tiết tới mã thông báo thiết bị dựa trên mã zip mà thiết bị đó đã đăng ký, thì bạn cần chuyển đến old_token
và new_token
dịch vụ đó để nó có thể cập nhật việc phân phối.
Ergo, nói chung 100% API chấp nhận "mã thông báo thiết bị" cũng phải có một số loại UPDATE
tiện ích cho mã thông báo đó. Để không xây dựng cho điều này là để xây dựng cho các thông báo mis-giao và không chuyển giao.
Mã thông báo thiết bị không thay đổi từ iOS 8 trở lên
Vui lòng xem văn bản bên dưới từ trang web của Apple. Đăng ký, lên lịch và xử lý thông báo của người dùng
Mã thông báo thiết bị là chìa khóa của bạn để gửi thông báo đẩy đến ứng dụng của bạn trên một thiết bị cụ thể. Mã thông báo thiết bị có thể thay đổi, vì vậy ứng dụng của bạn cần đăng ký lại mỗi khi khởi chạy và chuyển mã thông báo nhận được trở lại máy chủ của bạn. Nếu bạn không cập nhật được mã thiết bị, thông báo từ xa có thể không đến được thiết bị của người dùng. Mã thông báo thiết bị luôn thay đổi khi người dùng khôi phục dữ liệu sao lưu vào thiết bị hoặc máy tính mới hoặc cài đặt lại hệ điều hành. Khi di chuyển dữ liệu sang thiết bị hoặc máy tính mới, người dùng phải khởi chạy ứng dụng của bạn một lần trước khi thông báo từ xa có thể được gửi đến thiết bị đó.
Tôi nghĩ điều đáng nói là không ai làm điều đó là mã thông báo thay đổi sau khi bạn gọi unregisterForRemoteNotifications
. Khi bạn gọi registerForRemoteNotifications
lần sau, mã thông báo sẽ khác. Tôi không tìm thấy bất kỳ xác nhận nào về điều này trong tài liệu của Apple nhưng tôi đã tự mình chứng kiến một hành vi như vậy. Hãy ghi nhớ điều này
Nó sẽ không thay đổi, trừ khi ứng dụng của bạn được khôi phục trên một thiết bị mới (tại thời điểm đó, ứng dụng sẽ không được yêu cầu chấp nhận lại thông báo đẩy và sẽ chỉ gửi cho bạn cuộc gọi đã đăng ký mà tại thời điểm đó bạn nên chấp nhận mã thông báo mới).
Nhưng Apple không đảm bảo rằng nó không bao giờ thay đổi (do đó tài liệu không bao giờ đề cập đến nó). Bạn nên lập trình tốt hơn cho điều tồi tệ nhất và cho rằng nó có thể thay đổi vào một ngày nào đó. Ngoài ra, việc gửi mã thông báo đến máy chủ của bạn thường xuyên cho phép bạn xóa các mã thông báo chưa đăng ký trong một thời gian và có thể đã cài đặt ứng dụng của bạn hoặc mất hứng thú một thời gian trước (và tài liệu chỉ rõ đây là hành vi mong muốn!).
Từ - Apple Docs
APN có thể phát hành mã thông báo thiết bị mới vì nhiều lý do:
Người dùng cài đặt ứng dụng của bạn trên một thiết bị mới
Người dùng khôi phục thiết bị từ bản sao lưu
Người dùng cài đặt lại hệ điều hành
Các sự kiện khác do hệ thống xác định
Do đó, các ứng dụng phải yêu cầu mã thông báo thiết bị tại thời điểm khởi chạy.
Ngoài ra:
QUAN TRỌNG
Mã thông báo thiết bị APN có độ dài thay đổi. Đừng mã hóa kích thước của chúng.
Liên kết nhanh chóng trở nên lỗi thời với apple! vì vậy tôi đang trích dẫn những gì có vẻ khá rõ ràng bây giờ:
Không bao giờ lưu mã thông báo thiết bị vào bộ nhớ cache trong ứng dụng của bạn; thay vào đó, hãy lấy chúng từ hệ thống khi bạn cần. APN cấp mã thiết bị mới cho ứng dụng của bạn khi một số sự kiện nhất định xảy ra. Mã thông báo thiết bị được đảm bảo sẽ khác nhau, ví dụ: khi người dùng khôi phục thiết bị từ bản sao lưu, khi người dùng cài đặt ứng dụng của bạn trên thiết bị mới và khi người dùng cài đặt lại hệ điều hành. Tìm nạp mã thông báo, thay vì dựa vào bộ nhớ cache, đảm bảo rằng bạn có mã thông báo thiết bị hiện tại cần thiết để nhà cung cấp của bạn giao tiếp với APN. Khi bạn cố gắng tìm nạp mã thông báo thiết bị nhưng nó không thay đổi, phương thức tìm nạp sẽ nhanh chóng trả về.
Tham khảo nội dung thông báo đẩy của Apple
Mã thông báo thiết bị là chìa khóa của bạn để gửi thông báo đẩy đến ứng dụng của bạn trên một thiết bị cụ thể. Mã thông báo thiết bị có thể thay đổi, vì vậy ứng dụng của bạn cần đăng ký lại mỗi khi khởi chạy và chuyển mã thông báo nhận được trở lại máy chủ của bạn. Nếu bạn không cập nhật được mã thiết bị, thông báo từ xa có thể không đến được thiết bị của người dùng. Mã thông báo thiết bị luôn thay đổi khi người dùng khôi phục dữ liệu sao lưu vào thiết bị hoặc máy tính mới hoặc cài đặt lại hệ điều hành. Khi di chuyển dữ liệu sang thiết bị hoặc máy tính mới, người dùng phải khởi chạy ứng dụng của bạn một lần trước khi thông báo từ xa có thể được gửi đến thiết bị đó.
Không bao giờ lưu vào bộ nhớ cache mã thiết bị; luôn nhận được mã thông báo từ hệ thống bất cứ khi nào bạn cần. Nếu ứng dụng của bạn trước đây đã đăng ký thông báo từ xa, việc gọi lại phương thức registerForRemoteNotifications sẽ không phát sinh thêm bất kỳ chi phí nào và iOS trả lại mã thông báo thiết bị hiện có cho đại biểu ứng dụng của bạn ngay lập tức. Ngoài ra, iOS gọi phương thức ủy quyền của bạn bất cứ khi nào mã thông báo thiết bị thay đổi, không chỉ để phản hồi lại ứng dụng của bạn đăng ký hoặc đăng ký lại.
Theo liên kết này mã thông báo thiết bị
Mã thông báo thiết bị được bao gồm trong mỗi yêu cầu đại diện cho danh tính của thiết bị nhận thông báo. APN sử dụng mã thông báo thiết bị để xác định từng kết hợp thiết bị và ứng dụng duy nhất. Nó cũng sử dụng chúng để xác thực việc định tuyến các thông báo từ xa được gửi đến một thiết bị. Mỗi khi ứng dụng của bạn chạy trên một thiết bị, nó sẽ tìm nạp mã thông báo này từ các APN và chuyển tiếp đến nhà cung cấp của bạn. Nhà cung cấp của bạn lưu trữ mã thông báo và sử dụng mã khi gửi thông báo đến ứng dụng và thiết bị cụ thể đó. Bản thân mã thông báo này không rõ ràng và liên tục, chỉ thay đổi khi dữ liệu và cài đặt của thiết bị bị xóa. Chỉ APN mới có thể giải mã và đọc mã thông báo thiết bị.
Có nó có thể thay đổi. Lý tưởng nhất là khi nào chúng tôi nhận được mã thông báo qua phương thức gọi lại
- (void) application: (UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken
Ứng dụng phải đăng ký / làm mới mã thông báo trên máy chủ từ xa. Điều này sẽ đảm bảo rằng mã thông báo trên APNS và máy chủ của bạn được giữ đồng bộ.
Theo tài liệu của Apple ,
Việc lấy và xử lý mã thông báo thiết bị dành riêng cho ứng dụng hoạt động như sau:
Ứng dụng của bạn đăng ký với APN để nhận thông báo từ xa Khi cần mã thông báo thiết bị mới, APN sẽ tạo một mã thông báo bằng cách sử dụng thông tin có trong chứng chỉ của thiết bị. Nó mã hóa mã thông báo bằng cách sử dụng khóa mã thông báo và trả nó vào thiết bị, như được hiển thị ở giữa, mũi tên trỏ sang phải. Hệ thống gửi lại mã thông báo thiết bị cho ứng dụng của bạn bằng cách gọi ứng dụng của bạn: didRegisterForRemoteNotificationsWithDeviceToken: phương thức ủy quyền. Khi nhận được mã thông báo, ứng dụng của bạn (trong phương thức ủy quyền) phải chuyển tiếp nó đến nhà cung cấp của bạn ở định dạng nhị phân hoặc thập lục phân. Nhà cung cấp của bạn không thể gửi thông báo đến thiết bị mà không có mã thông báo này. Để biết chi tiết, hãy xem Đăng ký nhận thông báo từ xa trong cấu hình hỗ trợ thông báo từ xa.
Mã thông báo thiết bị chuyển tiếp khi cài đặt ứng dụng.
Có nghĩa là nếu bạn cài đặt lại ứng dụng, nó sẽ thay đổi ; nó không đo được nếu bạn thực hiện từ bản sao lưu, bản nâng cấp iOS ..
Cách đúng đắn để sử dụng nó, để tránh bất kỳ vấn đề nào, là lấy cái được cung cấp vào NSPAppDelegate
mỗi lần khởi chạy ứng dụng, trong phương phápdidRegisterForRemoteNotificationsWithDeviceToken