日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

APNS 那些事!

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 APNS 那些事! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 之前在消息推送中間件APush里實現了對APNS的橋接。并利用業余時間閱讀了官方指南Local and Push?Notification?Programming Guide。蠻有心得的。稍作總結。分享給大家,希望可以喜歡。歡迎留言討論!

1. ?APNS 通道環境

? ? ? 作為一個黑盒的消息推送服務。APNS為我們提供了開發和產品兩套環境。這兩套環境除了Host name不同外,授權證書也不近同樣(證書里面會包括APP相關信息。如application bundle ID,在你創建不同的profile的時候,這些信息會自己主動加入進去)。當然Device Token也不同。以下的英文或許能更好地描寫敘述這兩套環境的不同:

Development: Use the development environment for initial development and testing of the provider?application. It provides the same set of services as the production environment, although with a smaller?number of server units. The development environment also acts as a virtual device, enabling simulated?end-to-end testing.You access the development environment atgateway.sandbox.push.apple.com , outbound TCP port?2195.


Production: Use the production environment when building the production version of the provider?application. Applications using the production environment must meet Apple’s reliability requirements.You access the production environment atgateway.push.apple.com , outbound TCP port 2195.

2. ?APNS 消息格式

? ? ?APNS 採用二進制消息協議,例如以下:



? ? ?看官方的解釋,蠻清晰的:


? ? ?



? ? ?注意:

? ? ? ?假設APNS成功接收到你的消息,它將什么也不返回;

? ? ? ?假設你send a notification that is malformed or otherwise unintelligible, APNs returns an error-response packet and closes the connection. Any notifications that you sent after the malformed notification using the same connection are discarded, and must be resent. 這點要格外重要,所以非常多開源工具包,例如說pushy提供了一個FailedConnectionListener,你能夠通過實現該接口,方便的實現resent,代碼片段例如以下:

private class MyFailedConnectionListener implements FailedConnectionListener<SimpleApnsPushNotification> {public void handleFailedConnection(final PushManager<? extends SimpleApnsPushNotification> pushManager,final Throwable cause) {if (cause instanceof SSLHandshakeException) {// This is probably a permanent failure, and we should shut down// the PushManager.}} }// ...pushManager.registerFailedConnectionListener(new MyFailedConnectionListener());
? ? ? ? ?error-response packet 結構例如以下:


? ? ? ? ?Status code 解釋例如以下:

? ???

? ? ? A status code of 10 indicates that the APNs server closed the connection (for example, to perform maintenance).The notification identifier in the error response indicates the last notification that was successfully sent. Any?notifications you sent after it have been discarded and must be resent. When you receive this status code, stop?using this connection and open a new connection.

3. ?APNS 消息接收

? ? ?An application must register with Apple Push Notification service for the operating systems on a device and?on a computer to receive remote notifications sent by the application’s provider. Registration has three stages:

?3.1 The app registers for remote notifications.

?3.2 The system sets up remote notifications for the app and, if registration is successful, passes a device token to the app delegate.

?3.3 The app sends its device token to the push provider.

?3.4 Device tokens can change. Your app needs to reregister every time it is launched—in iOS by calling the registerForRemoteNotificationTypes: method of UIApplication, and in OS X by calling the registerForRemoteNotificationTypes: method of NSApplication.

?3.5 Because the only notification type supported for non-running applications is icon-badging,pass NSRemoteNotificationTypeBadge as the parameter of registerForRemoteNotificationTypes:.

?3.6 If registration is successful, APNs returns a device token to the device and iOS passes the token to the app delegate in the application:didRegisterForRemoteNotificationsWithDeviceToken: method. If there is a problem in obtaining the token, the operating system informs the delegate by calling the application:didFailToRegisterForRemoteNotificationsWithError: method.

? ? ? 用一幅圖來說明這個流程。例如以下:



4. ?APNS Qos

? ? Apple Push Notification service includes a default Quality of Service (QoS) component that performs a?store-and-forward function.
? ? If APNs attempts to deliver a notification but the device is offline, the notification is stored for a limited period?of time, and delivered to the device when it becomes available.
? ? Only one recent notification for a particular application is stored. If multiple notifications are sent while the?device is offline, each new notification causes the prior notification to be discarded. This behavior of keeping?only the newest notification is referred to as coalescing notifications.
? ? If the device remains offline for a long time, any notifications that were being stored for it are discarded.

? ? 注意我字體標黑的這個APNS的特性!

5. ?APNS ?FAQ

? ? a. APNS feedback 服務是用來做什么的?

? ? ? The Apple Push Notification Service includes a feedback service to give you information about failed push notifications. When a push notification cannot be delivered because the intended app does not exist on the device, the feedback service adds that device’s token to its list. Push notifications that expire before being delivered are not considered a failed delivery and don’t impact the feedback service. By using this information to stop sending push notifications that will fail to be delivered, you reduce unnecessary message overhead and improve overall system performance.
? ? ? Query the feedback service daily to get the list of device tokens. Use the timestamp to verify that the device tokens haven’t been reregistered since the feedback entry was generated. For each device that has not been reregistered, stop sending notifications. APNs monitors providers for their diligence in checking the feedback service and refraining from sending push notifications to nonexistent applications on devices. ? ?
? ? ? The feedback service maintains a separate list for each push topic. If you have multiple apps, you must connect to the feedback service once for each app, using the corresponding certificate, in order to receive all feedback.
? ? ? The feedback service has a binary interface similar to the interface used for sending push notifications. You access the production feedback service via feedback.push.apple.com on port 2196 and the development feedback service via feedback.sandbox.push.apple.com on port 2196. As with the binary interface for?push notifications, use TLS (or SSL) to establish a secured communications channel. You use the same SSL certificate for connecting to the feedback service as you use for sending notifications. To establish a trusted provider identity, present this certificate to APNs at connection time using peer-to-peer authentication.

? ? ? Once you are connected, transmission begins immediately; you do not need to send any command to APNs.Read the stream from the feedback service until there is no more data to read.

? ? ? The feedback service’s list is cleared after you read it. Each time you connect to the feedback service, the information it returns lists only the failures that have happened since you last connected.

? ? b. Best Practices for Managing Connections

? ? ? ?You may establish multiple connections to the same gateway or to multiple gateway instances. If you need to?send a large number of push notifications, spread them out over connections to several different gateways.This improves performance compared to using a single connection: it lets you send the push notifications?faster, and it lets APNs deliver them faster.
? ? ? ?Keep your connections with APNs open across multiple notifications; don’t repeatedly open and close?connections. APNs treats rapid connection and disconnection as a denial-of-service attack. You should leave?a connection open unless you know it will be idle for an extended period of time—for example, if you only?send notifications to your users once a day it is ok to use a new connection each day.

? ?c. 接收到APNS消息后。我一般怎么處理呢?

? ??If your app is frontmost, the application:didReceiveRemoteNotification: or?application:didReceiveLocalNotification:method is called on its app delegate;
? ? If your app is not frontmost or not running, you handle the notifications by checking the options dictionary passed to the?application:didFinishLaunchingWithOptions: of your app delegate for either the?UIApplicationLaunchOptionsLocalNotificationKey or?UIApplicationLaunchOptionsRemoteNotificationKey key.

? ? 實例代碼例如以下:

(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {// 取得 APNs 標準信息內容NSDictionary *aps = [userInfo valueForKey:@"aps"];NSString *content = [aps valueForKey:@"alert"]; //推送顯示的內容NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge數量NSString *sound = [aps valueForKey:@"sound"]; //播放的聲音// 取得自己定義字段內容NSString *customizeField1 = [userInfo valueForKey:@"customizeField1"]; //自己定義參數,key是自己定義的NSLog(@"content =[%@], badge=[%d], sound=[%@], customize field =[%@]",content,badge,sound,customizeField1);// Required[APService handleRemoteNotification:userInfo]; }//iOS 7 Remote Notification - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {NSLog(@"this is iOS7 Remote Notification");// Required[APService handleRemoteNotification:userInfo];completionHandler(UIBackgroundFetchResultNoData); }


d. ?消息發送過程中,突然出現Write failed: Broken pipe

? ?可能由于某種原因,如發送了錯誤的token,導致Apple強行關閉了SSL連接。

跳過最后一次發送的信息,又一次連接,繼續發送錯誤信息之后的信息。

e. ?由于APNS發送成功沒有不論什么返回,會不會出現是異常可是異常信息還沒返回的現象

? ?有可能,這個時候能夠採取批量發送,等候一段時間。例如說1秒。通過Feedback來檢查發送狀態。

f. ? 一些你可能會忽視的細節:

? ? ? Each application on a device is limited to 64 scheduled local notifications. The system discards scheduled notifications in excess of this limit, keeping only the 64 notifications that will fire the soonest. Recurring notifications are treated as a single notification.

? ? ? Custom sounds must be under 30 seconds when played. If a custom sound is over that limit, the default system sound is played instead.

參考文獻:

? ? ?1.?Local and Push?Notification?Programming Guide

? ? ?2.?http://www.easyapns.com/apple-delegate

? ? ?3.?http://blog.csdn.net/tlq1988/article/details/9612237

? ? ?4.?http://www.cocoachina.com/bbs/read.php?tid=98797


總結

以上是生活随笔為你收集整理的APNS 那些事!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。