iOS8下的遠程推送,iOS8遠程推送
昨天做了一下遠程推送,今天寫下來,分享給需要的人。參考了很多篇文章,或許是iOS8的改動,沒有一篇可以完整的看下來,所以打算自己寫一篇。
後台我也寫了,用的是SAE,PHP代碼,很簡單,調用SAE封裝好的一個類就可以向APNS發推送資訊。
首先,來說一下蘋果的推送機制。顧名思義,推送,是指伺服器向用戶端發送訊息,那麼在iOS中,應用是被後台掛起的,並不能一直串連網路,那麼伺服器怎麼才能把訊息發送到用戶端呢?這就用到推送,蘋果的推送機制,是只能由APNS發送推播通知,所以你自己的後台伺服器想給用戶端推播通知,得把要推送的內容發送給APNS。
說到這裡,如果還不瞭解蘋果的推送機制,可以自行查看資料。總之整體的流程就是:APP啟動的時候,擷取本裝置的device_token,然後把這個device_token告訴你自己的伺服器,伺服器拿到這個device_token後,使用認證檔案,向蘋果的APNS伺服器發起一個SSL串連,串連成功後發送一個JSON串,JSON裡麵包含device_token、通知內容以及其他的一些東西。蘋果的APNS得到JSON後,通過device_token尋找裝置推送訊息。
那麼,我們iOS前端的工作量是非常簡單的,只需要擷取device_token和接到通知後做什麼事就可以。那麼,怎麼樣擷取裝置的device_token,iOS8用到了新的方法。在APP啟動的時候就調用,比如在application: didFinishLaunchingWithOptions:這個方法裡,調用APP的註冊遠程推送申請方法。
1 //ios82 3 UIUserNotificationSettings * s =[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];4 5 [[UIApplication sharedApplication] registerUserNotificationSettings:s];6 7 [application registerForRemoteNotifications];
若註冊成功,則會回調一個方法,代碼如下
1 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 2 { 3 NSString *decToken = [NSString stringWithFormat:@"%@", deviceToken]; 4 //擷取到之後要去掉角括弧和中間的空格 5 NSMutableString *st = [NSMutableString stringWithString:decToken]; 6 [st deleteCharactersInRange:NSMakeRange(0, 1)]; 7 [st deleteCharactersInRange:NSMakeRange(st.length-1, 1)]; 8 NSString *string1 = [st stringByReplacingOccurrencesOfString:@" " withString:@""]; 9 //儲存到本地10 NSUserDefaults *u = [NSUserDefaults standardUserDefaults];11 [u setObject:string1 forKey:@"deviceToken"];12 }
相對應的,肯定也有一個註冊失敗的回調。裡面寫錯誤處理的代碼就可以,這裡就不舉例了。
那有沒有想過,正常的推播通知會在我們的通知面板裡,那如果我正在使用這個APP,那麼推送肯定不會到通知面板裡的,我們怎麼找到它呢。在下面這個回調方法裡,當我們正在使用APP,收到了一條通知,那麼APP會直接回調這個方法,不會去彈出通知。
1 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo2 {3 NSLog(@"Receive remote notification : %@",userInfo);4 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"好" otherButtonTitles:nil, nil];5 [alert show];6 7 }
在這個方法裡面,處理我們接收到的訊息即可。
前端的任務就這麼多,別忘了把device_token交給你的服務端。
服務端的代碼本來不用我們寫,但是遇到不會寫的,讓他們去看蘋果的官方文檔就行。要是還看不懂,就找一個現成的代碼研究一下。
程式猿攻城獅都是萬能的,不僅會修電腦,還要會寫後台。那麼,我們就來看看後台是怎麼實現的。
首先,按照上面流程來說,服務端擷取到device_token後,使用認證向APNS發送推送請求,那麼問題來了。挖掘機技術哪家強?
推送認證哪裡來?
需要一個開發人員帳號。沒錯,和我們真機調試的認證一樣,至少需要99刀。有了帳號,我們就可以申請一個認證。下面,跟著一步一步看,比較麻煩。
1.需要在MacOS上產生一個CertificateSigningRequest.certSigningRequest檔案。開啟應用程式中的“鑰匙串訪問”,從菜單中選擇“認證助理”-》“從憑證授權單位請求認證”
1 <?php 2 3 $cert_id = 1686; 4 $device_token = $_REQUEST['device_token']; 5 $message = $_REQUEST['message']; 6 7 //這個是簡單的例子,更複雜的訊息格式請查看蘋果官方文檔 8 $body = array( 9 'aps' => array( 'alert' => $message , 'badge' => 1, 'sound' => 'in.mp3')10 );11 $apns = new SaeAPNS();12 //push訊息到SAE推送伺服器13 $result = $apns->push( $cert_id , $body , $device_token );14 15 if( $result && is_array($result) ){16 $dic = array('success' => '0');17 echo json_encode($dic);18 // var_dump( $result );19 } else {20 $dic = array('success' => '1');21 echo json_encode($dic);22 //var_dump($apns->errno(), $apns->errmsg());23 }24 ?>
這個介面呢,需要兩個參數,一個是裝置的device_token,還有就是你要推送的訊息內容。然後調用SAE的方法就可以。發送成功返回JSON串。複雜的代碼就不說了。
這隻是個測試demo,真正的推送是後台判斷的。不是我們去調介面。
就到這裡吧。