5

Tôi đang tìm nạp thành công dữ liệu phản hồi của Apple APNS thông qua PHP. Cấu trúc mà tôi đang nhận được (sau khi một số chế biến) trông giống như sau:HOWTO loại bỏ mã thông báo thiết bị nhận được bởi phản hồi của Apple APNS

timestamp

thiết bị thẻ

Câu hỏi của tôi là làm thế nào để biết được trong số các thẻ điện thoại tôi nên loại bỏ khỏi cơ sở dữ liệu của tôi và dừng lại gửi thông báo cho họ.

Regardz,

Mladjo

Trả lời

10

Tất cả các thiết bị do thông tin phản hồi được 'thất bại' và cần được loại bỏ. Không có phản hồi nghĩa là không có thiết bị nào bị xóa. Nó bao phủ trên Tài liệu của Apple:

Apple APN Documentation

+1

Phản hồi APNS trả về mã thông báo thiết bị nếu gửi thông báo không thành công. Điều này không có nghĩa là ứng dụng đã được gỡ cài đặt khỏi thiết bị, nó có thể chỉ là người dùng không có kết nối wifi liên tục tại thời điểm này. – Mladen

+1

Đó không phải là những gì tài liệu nói. "Nếu nhà cung cấp cố gắng gửi thông báo đẩy tới ứng dụng, nhưng ứng dụng không còn tồn tại trên thiết bị nữa, thiết bị sẽ báo cáo thực tế đó với Dịch vụ thông báo của Apple Push. Tình huống này thường xảy ra khi người dùng đã gỡ cài đặt ứng dụng. một thiết bị báo cáo các lần gửi không thành công cho một ứng dụng, APN cần một số cách để thông báo cho nhà cung cấp để nó có thể không gửi thông báo tới thiết bị đó. " – Lee

+5

@Mladen. Sai. Nếu thiết bị không có kết nối wifi hoặc kết nối 3/4G thì Apple sẽ gửi Thông báo đẩy sau khi có kết nối. – midspace

-1

Bạn nên lưu trữ các thiết bị với dữ liệu thẻ thiết bị của họ, và sau đó bạn có thể tìm thấy những thiết bị này theo thẻ thiết bị của họ. Bạn có thể sử dụng mã thông báo thiết bị để nhận dạng từng thiết bị. Than sẽ dễ tìm và thay đổi trạng thái của chúng thành db của bạn.

11

Dấu thời gian là yếu tố quan trọng ở đây. Dấu thời gian được gửi bởi Apple cho biết lần cuối dịch vụ đẩy đã cố gắng gửi tin nhắn tới thiết bị và tìm thấy ứng dụng sẽ được gỡ cài đặt. Nếu thiết bị đã đăng ký lại với dịch vụ của bạn kể từ đó, bạn không cần xóa thiết bị đó.

Do đó, mỗi lần ứng dụng của bạn tải và gửi mã thông báo đến dịch vụ của bạn, bạn nên ghi lại thời gian trong kho dữ liệu của mình. Khi bạn chạy phản hồi, bạn nên kiểm tra thời gian từ Apple và so sánh với thời gian bạn nhận được bản cập nhật mới nhất từ ​​ứng dụng trên thiết bị. Nếu thời gian Apple gửi là mới hơn thì thời gian bạn nhận được cập nhật thì bạn nên xóa (hoặc tắt) thiết bị. Nếu thời gian từ Apple là trước đó thì bạn không cần phải xóa nó vì người dùng đã cài đặt lại thiết bị kể từ lần cuối Apple cố gắng phân phối.

0

giải thích gọn gàng @argon, tuy nhiên tôi có một câu hỏi khác về dấu thời gian.

Mỗi khi ứng dụng bật thông báo đẩy, mã thông báo thiết bị sẽ được gửi đến máy chủ. Tôi có nên lấy dấu thời gian từ máy chủ của tôi để được tiếp tục cùng với mã thông báo thiết bị như didRegisterForRemoteNotificationsWithDeviceToken chỉ cung cấp cho deviceToken chứ không phải thời gian. Nếu máy chủ của tôi chạy trong múi giờ khác nhau và APNS đang chạy ở múi giờ khác, thì thời gian đăng ký được lưu trữ (cùng với mã thông báo thiết bị) không thể so sánh được với dấu thời gian nhận được từ phản hồi APNS để kiểm tra chuỗi đăng ký -> uninstall -> reregister.

Tôi cho rằng dấu thời gian phản hồi APNS ở UTC và dấu thời gian máy chủ lưu trữ cùng với mã thông báo thiết bị phải được chuyển đổi sang UTC trước khi lưu dấu thời gian ISO. Bằng cách này, cả dấu thời gian sẽ ở cùng một múi giờ và kiểm tra khác sẽ nhất quán.

xin vui lòng làm rõ

+0

Đó là chính xác, đó là Dấu thời gian UTC, do đó bạn nên lưu trữ giá trị UTC trong cửa hàng của mình. Tham khảo: [Bảng cuối cùng trong "Dịch vụ phản hồi"] (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/ TP40008194-CH101-SW3) – argon

0

@fyasar,

Vì vậy, đề nghị của bạn là để lưu trữ các thiết bị thẻ chống lại id thiết bị (hoặc một số key). Khi nhận được phản hồi cho mã thông báo thiết bị, hãy xóa hàng mã thông báo thiết bị khỏi DB, phải không? Nếu đã hiểu đúng, điều đó sẽ không hoạt động trong kịch bản là ứng dụng cài đặt người dùng, gỡ cài đặt ứng dụng và sau đó cài đặt lại tất cả trong một thời gian ngắn và dịch vụ phản hồi chỉ được truy vấn sau khi tất cả điều này xảy ra.Trong trường hợp này, nếu không xem xét dấu thời gian trong phản hồi, mã thông báo thiết bị sẽ bị xóa không chính xác khi người dùng đã cài đặt lại ứng dụng và đăng ký lại để thông báo đẩy.

Câu hỏi của tôi là điều này, như được đề xuất trong tài liệu của apple và nhiều blog, khi đăng ký, khi mã thông báo thiết bị được duy trì, dấu thời gian phải được duy trì cùng với nó. Thời gian ISO của múi giờ nào nên được duy trì hoặc múi giờ trên dịch vụ phản hồi nào trả về dấu thời gian.

0

Dấu thời gian (dưới dạng giá trị time_t 4 byte) cho biết khi nào APNs xác định rằng ứng dụng không còn tồn tại trên thiết bị nữa. Giá trị này, theo thứ tự mạng, thể hiện số giây kể từ 12:00 nửa đêm vào ngày 1 tháng 1 năm 1970 theo giờ UTC.

bạn có thể so sánh nó với thời gian chèn ngoái bảng của bạn và sau đó loại bỏ các dấu hiệu không hợp lệ từ db, Trong trường hợp của tôi tôi đang sử dụng mysql và php cho sever bên

$sql="SELECT insert_time from device_tokens ORDER BY insert_time DESC LIMIT 1"; 

nó sẽ trở lại cập nhật lần cuối thời gian từ db và sau đó tôi chỉ cần chuyển đổi nó vào kỷ nguyên dấu thời gian bằng cách sử dụng

$sql1="SELECT UNIX_TIMESTAMP(' $timestamp')"; 

và cuối cùng tôi chỉ cần so sánh nó với APNS timestamp phản hồi như

này
if($inactive_Timestamp>$dbTime_stamp) 
    { 
foreach ($apnsfeedback_tokens as $key => $value) { 
    # code... 

    $inactive_Token=$value['devtoken']; 

$sql= "DELETE FROM device_tokens WHERE device_token='$inactive_Token'"; 


if ($conn->query($sql) === TRUE) { 
    echo "Record deleted successfully"; 
} else { 
    echo "Error deleting record: " . $conn->error; 
} 
Các vấn đề liên quan