iOS 推送整理

征途LN發表於2015-03-04


1、客戶端通過下面程式碼像APNS註冊push,表明push的型別,iOS8之後對註冊推送有了新的API

#if !TARGET_IPHONE_SIMULATOR
    if (iOS8) {
        UIUserNotificationType notifyType = UIUserNotificationTypeAlert|UIUserNotificationTypeSound|UIUserNotificationTypeBadge;
        UIUserNotificationSettings *notifySet = [UIUserNotificationSettings settingsForTypes:notifyType categories:nil];
        [[UIApplication sharedApplication]registerForRemoteNotifications];
        [[UIApplication sharedApplication]registerUserNotificationSettings:notifySet];
    }
    else {
        UIRemoteNotificationType notifyType = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert;
        [[UIApplication sharedApplication]registerForRemoteNotificationTypes:notifyType];
    }
#endif

2、app註冊後會呼叫application delegate中的代理方法

-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{    //然後app會把這個deviceToken以及一些其他的資訊發給後臺或者第三方推送平臺,當需要傳送push的時候後臺就會取出要傳送的裝置的deviceToken,組合特定格式的字串,然後將其傳送到APNS,APNS可以根據與之建立連結的後臺所使用證書判斷是那個app請求傳送的推送,繼而把推送傳送到deviceToken的裝置上
    [[EaseMob sharedInstance]application:application didReceiveRemoteNotification:deviceToken];
    [_modelMessage getuiReceiveRemoteNotification:deviceToken];
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    [MessageModel application:application didFailToRegisterForRemoteNotificationsWithError:error];
    [[EaseMob sharedInstance] application:application didFailToRegisterForRemoteNotificationsWithError:error];
 }


3、對於APNS來說,device Token是裝置的標示符,與裝置的唯一標示符不同,處於安全與隱私的原因,當裝置被擦除的時候,Token值必須變化。

4、同一臺裝置在development 和 distribution情況下,收到的device Token 是不同的,而token是與app無關的。

5、device Token的生成:每臺正常的iPhone有一個唯一的裝置證書和祕鑰,通過這兩者獲得的,如果經過某種手段使得裝置上證書是一樣的,那麼就有很大的概率使不同裝置具有相同的device Token值,就會出現彼此間puch串發的現象

6、iOS5之後uniqueIdentifier會逐步被廢除,取而代之使用裝置的Mac地址MD5計算後的結果作為作為裝置的唯一標識,這個對推送不影響

相關文章