原文地址:IOS開發之----遠程推送通知作者:倒計時
玩了一年的iPhone了各種App的遠程通知接收了不少,每次接收到的時候,就在反思,這丫的怎么實現的!?
由于工作方面一直沒有接觸的機會,所以只好自己主動去做做練習試試了.
實踐后發現,一系列的配置非常繁瑣,當然咯,網上的教程已經一大堆了.
在這里還是寫一篇文章來記錄一些自己容易忘記的細節,以備日后所需時能夠有用武之地.
依照自己的習慣,喜歡把參考過的教程列舉出來,真的很感謝這些網上的牛人.
1:?ios本地通知和遠程通知
http://wangjun.easymorse.com/?p=1482
2: 蘋果遠程通知服務申請激活例圖 (外國佬寫的.)
http://mobiforge.com/developing/story/programming-apple-push-notification-services
3:書籍參考:iPhone 開發秘籍 第16章 推送通知.
好了,進入正文:
首先是申請證書的網址
https://developer.apple.com/ios/manage/overview/index.action
登錄成功以后,進入iOS 配置管理的 主頁面.
第一步操作是去創建一個新的App IDs創建成功后,會需要提供安全證書來激動推送服務,如下圖:
?
選擇存儲到磁盤以后,生成一個文件名稱為(簡稱CSR):?CertificateSigningRequest.certSigningRequest
回到Apple頁面 將這個提交并提示激動成功.
激活成功后的App ?IDs?提供下載開發版或是發布版的主動推送證書(aps_development.cer),如果需要做服務器方面的主動推送的話,就必須要下載這個文件來使用推送服務了.
第二步要為App提供接受推送許可的證書,點擊Provisioning進行設置,添加一個新的許可,選擇剛剛新創建的App IDs. 再選擇可以調試的iPhone 設備.
最后,同樣是下載下來:?YsyPushMessageDemo.mobileprovision雙擊該證書,讓其加載一次.
接下來,進入iOS工程,選擇使用該證書來調試.
?
紅圈中,全部設置剛剛加載的許可證書.
那么到這里,關于證書類的準備工作,已經全部準備就緒.
在這里再此強調一次,每個文件的具體作用
1:?CertificateSigningRequest.certSigningRequest : 為生成App IDs 而用
2:?aps_development.cer 為開發主動推送服務而用到的證書
3:?YsyPushMessageDemo.mobileprovision 為App 接受推送通知的許可服務
主動推送的Push 代碼及使用,請參考一開始介紹的第一篇博客
這里只附上下載地址:?https://github.com/stefanhafeneger/PushMeBaby
接下來,說說收到推送通知代碼方面.
1:申請本App需要接受來自服務商提供推送消息,
?
[[UIApplication?sharedApplication]?registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge?|?UIRemoteNotificationTypeSound?|?UIRemoteNotificationTypeAlert)];?? 2:申請發出后,如果成功,委托會自動返回一個設備令牌(toKen),如果失敗,將會進入另外一個失敗的委托 ?
?
//遠程通知注冊成功委托?? -?(void)application:(UIApplication?*)application?didRegisterForRemoteNotificationsWithDeviceToken:(NSData?*)deviceToken?? {?? ????NSLog(@"%@",deviceToken);?? ????self.viewController.toKenValueTextView.text?=?[NSString?stringWithFormat:@"%@",deviceToken];?? ????self.viewController.pushStatusLabel.text?=?@"已經注冊.";?? }?? //遠程通知注冊失敗委托?? -(void)application:(UIApplication?*)application?didFailToRegisterForRemoteNotificationsWithError:(NSError?*)error?? {?? ????self.viewController.toKenValueTextView.text?=?[error?description];?? }?? 3:將設備令牌碼提供給服務商,以供推送到具體的手機上面. 如果遠程推送消息來了,用戶點擊了推送消息,或者應用已經處于打開狀態,系統都會自動調用以下委托: ?
?
//點擊某條遠程通知時調用的委托?如果界面處于打開狀態,那么此委托會直接響應?? -(void)application:(UIApplication?*)application?didReceiveRemoteNotification:(NSDictionary?*)userInfo?? {?? ????NSLog(@"遠程通知");?? ????[self?PMD_uesPushMessage:userInfo];?? }?? 4: 第三點里面的介紹的情況是應用程序已經處于運行狀態,上面的委托才會被執行,如果應用程序處于未啟用狀態,此時又需要響應消息,那么需要以下委托處理. ?
?
-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?? {?? ????//這里處理應用程序如果沒有啟動,但是是通過通知消息打開的,此時可以獲取到消息.?? ????if?(launchOptions?!=?nil)?{?? ????????NSDictionary?*userInfo?=?[launchOptions?objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];?? ????????[self?PMD_uesPushMessage:userInfo];?? ????}?? ????return?YES;?? }?? 5:清空通知中心已有的推送消息,只需要將指定App 的 Badge 設置為 0即可
?
[[UIApplication?sharedApplication?]?setApplicationIconBadgeNumber:0];?? ?
6:主動推送的字符串必須符合如下Json數組的格式,才能正確推送到手機當中. ?
?
????@"{
???????//自定義參數
???????"userinfo":
??????????????{
?????????????????"name":"remote notice"
??????????????},
???????//標準寫法
???????"aps":
??????????????{
?????????????????"alert":
???????????????????????????{
??????????????????????????????"action-loc-key":"Open",//支持多語言
??????????????????????????????"body":"messgae content"//消息正文
???????????????????????????},
?????????????????"badge":1,//為App 的icon ?標記 具體數值
?????????????????"sound":"default"?//播放的音頻文件,default 表示系統默認的選擇列鈴聲
?????????????}?
?????}";
到這里就差不多結束了.
php服務器推送消息
?
<?php?? ?? $deviceToken?=?'38c866dd?bb323b39?ffa73487?5e157ee5?a85e0b7ce90d56e9?fe145bcc?6c2c594b';?//?masked?for?security?reason?? //?Passphrase?for?the?private?key?(ck.pem?file)?? //?$pass?=?'';?? //?Get?the?parameters?from?http?get?or?from?command?line?? $message?=?$_GET['message']?or?$message?=?$argv[1]?or?$message?=?'Message?received?from?javacom';?? $badge?=?(int)$_GET['badge']?or?$badge?=?(int)$argv[2];?? $sound?=?$_GET['sound']?or?$sound?=?$argv[3];?? //?Construct?the?notification?payload?? $body?=?array();?? $body['aps']?=?array('alert'?=>?$message);?? if?($badge)?? $body['aps']['badge']?=?$badge;?? if?($sound)?? $body['aps']['sound']?=?$sound;?? ?? ?? $ctx?=?stream_context_create();?? stream_context_set_option($ctx,?'ssl',?'local_cert',?'ck.pem');?? //?assume?the?private?key?passphase?was?removed.?? //?stream_context_set_option($ctx,?'ssl',?'passphrase',?$pass);?? $fp?=?stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195',?$err,?$errstr,?60,?STREAM_CLIENT_CONNECT,?$ctx);?? if?(!$fp)?{?? print?"Failed?to?connect?$err?$errstrn";?? return;?? }?? else?{?? print?"Connection?OKn";?? }?? $payload?=?json_encode($body);?? $msg?=?chr(0)?.?pack("n",32)?.?pack('H*',?str_replace('?',?'',?$deviceToken))?.?pack("n",strlen($payload))?.?$payload;?? print?"sending?message?:"?.?$payload?.?"n";?? fwrite($fp,?$msg);?? fclose($fp);?? ?> ?這個帖子寫的也不錯
http://blog.csdn.net/bl1988530/article/details/6729369
?
代碼例子下載:
http://ishare.iask.sina.com.cn/f/33789601.html
總結
以上是生活随笔為你收集整理的IOS开发之----远程推送通知的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。