Mã thông báo thiết bị APNS có bao giờ thay đổi sau khi được tạo không?


99

Sau khi được tạo, mã thông báo đẩy thiết bị có bao giờ thay đổi không?

Ví dụ khi ứng dụng được cập nhật? hoặc trong trường hợp nào khác nó có thể thay đổi ??


Đảm bảo bạn thấy câu trả lời này vì nó cung cấp tài liệu cho 4 nơi mà mã thông báo thiết bị thay đổi
Honey

Câu trả lời:


71

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.


Các tài liệu hiện tại đã bỏ câu cuối cùng. Có vẻ như (từ một câu hỏi SO khác, stackoverflow.com/questions/2751481/… ) rằng việc khôi phục dữ liệu sẽ giữ lại mã thông báo APN nhưng hệ điều hành cài đặt và "xóa" sẽ đặt lại nó (trừ khi chúng được theo sau bằng cách khôi phục dữ liệu về hệ điều hành mới được cài đặt hệ thống).
Robert Altman

1
@RobertAltman - Tôi không nghĩ đây là toàn bộ câu chuyện. Tôi đã thấy một số đăng ký trong cơ sở dữ liệu của chúng tôi từ các thiết bị hoàn toàn khác nhau với cùng một mã thông báo APNS. Tôi nhìn thấy trước mặt mình một chiếc iPad 2 và một chiếc iPhone 3GS đã gửi cho chúng tôi cùng một mã thông báo. Có ai khác có thể xác nhận hành vi này không?
DougW

@DougW, điều này thật lạ. Bạn vẫn còn bất kỳ vấn đề tương tự? Đã chỉnh sửa liên kết và đăng từ tài liệu mới nhất.
iosCurator

139

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.


Cập nhật (tháng 6 năm 2012):

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ả:

  1. Bắt đầu với iOS4 được cài đặt trên iPhone4; thiết bị sao lưu trong iTunes

  2. 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

  3. 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.

  4. Đặt lại iOS (thiết bị sạch)
    Mã thông báo APN thay đổi

  5. 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".

  6. 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.

  7. 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.


Cập nhật (tháng 8 năm 2012)

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.]


vậy điều này có nghĩa là bạn có thể sử dụng mã thông báo như một cách để xác định duy nhất một người dùng? (điều này rất thực tế trong các ứng dụng mà người ta phải 'bỏ phiếu'?). Tôi có thể tưởng tượng tình huống: Người dùng bình chọn và ứng dụng phản hồi bằng một số ngẫu nhiên thông qua các thông báo. Số đó phải được gửi lại máy chủ để phiếu bầu hợp lệ. Bằng cách này, bầu cử không thể bị gian lận một cách dễ dàng.
Toad

cũng thú vị: mã thông báo có thay đổi khi xóa ứng dụng và cài đặt lại nó không. Hoặc điều này tương tự với tùy chọn 'khôi phục bản sao lưu'
Toad

@Toad Mã thông báo sẽ không thay đổi do xóa và cài đặt lại ứng dụng.
Robert Altman

@Toad Tôi sẽ không nghĩ rằng đây sẽ là một hình thức nhận dạng người dùng tốt; vì mã thông báo là duy nhất cho mỗi thiết bị (cũng như cho mỗi ứng dụng), một người dùng có nhiều thiết bị sẽ có nhiều mã thông báo.
Robert Altman

1
Tôi thắc mắc về mối quan hệ giữa chứng chỉ và mã thông báo thiết bị. nếu chứng chỉ .p12 hết hạn thì cần thay đổi chứng chỉ mới. Tôi đã tìm thấy tham chiếu "Khi cần mã thông báo thiết bị mới, các APN sẽ tạo một mã thông báo bằng thông tin có trong chứng chỉ của thiết bị". Vì vậy, không có khả năng làm mới mã thông báo thiết bị khi thay đổi chứng chỉ?
ảo

50

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.


7
tôi có thể xác nhận điều này
roocell

1
Tôi có thể khẳng định điều này quá
Muhammad Adnan

1
Có, nó đang thay đổi :(
Azik Abdullah

ai có thể cho biết tại sao điều này xảy ra?
Sushobhit

Có, nó sẽ thay đổi
Ved Rauniyar

22

, 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:

  1. Cập nhật bộ nhớ cục bộ của thiết bị, (bao gồm có thể có nil)
  2. Cập nhật bất kỳ thứ gì trên thiết bị sử dụng mã thông báo để biết mã thông báo mới
  3. Cập nhật bất kỳ API nào nhận biết được mã thông báo này thành mã thông báo mới.

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_tokennew_tokendị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 UPDATEtiệ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.


nghe hay đấy, nhưng tôi đã gỡ bỏ và cài đặt lại ứng dụng của mình là gì? trong trường hợp đó, mã thông báo thiết bị tôi đã lưu trong bộ nhớ cục bộ sẽ bị xóa
Kuf

@Kuf, bạn đã có câu trả lời cho câu hỏi đó chưa? Tôi cũng vậy - ngay cả khi ứng dụng được gỡ cài đặt / cài đặt lại, chúng ta sẽ so sánh mã thông báo hệ thống như thế nào?
nkirkes

@nkirkes xem câu hỏi này để biết thêm chi tiết
Kuf 19/01/16

Ba điểm "Cập nhật" mà bạn đã nói đến, chúng là trách nhiệm của iOS, SDK hay chính chúng ta?
somenickname

7

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ị đó.


2
URL đã chết! Hãy sửa chữa nó.
Ramis


4

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 registerForRemoteNotificationslầ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


3

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!).


Bạn đúng: bạn không thể cho rằng mã thông báo là vĩnh viễn; tuân theo các quy tắc tương tác như được xác định trong tài liệu APN. Trên thực tế, các nhà phát triển của Apple đã nói với tôi rằng mã thông báo cuối cùng sẽ thay đổi (sau 2 năm).
Robert Altman

1
Đang phục hồi một cuộc thảo luận cũ, nhưng ai đó có thể thấy nó hữu ích: tôi đã dành một khoảng thời gian trong tuần này để làm việc trên máy chủ Phân tích cú pháp tự lưu trữ và gặp sự cố thử nghiệm - hóa ra mỗi lần tôi làm mới ứng dụng nhà phát triển của mình (khi tôi đang làm số lượng thay đổi UX), mã thông báo id thay đổi với mỗi lần cài đặt phần mềm ... vậy không phải là quá thú vị sao? (thở dài)
ChrisH

3

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.


2

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ề.

Từ hướng dẫn này


0

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.


0

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ị.


0

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.


0

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 NSPAppDelegatemỗi lần khởi chạy ứng dụng, trong phương phápdidRegisterForRemoteNotificationsWithDeviceToken

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.