Push Notification系列歸納:git
1.Push Notification簡介和證書說明及生成配置github
2.Push Notification的iOS處理代碼和Provider詳解數據庫
3.Push Notification的移動客戶端定位服務服務器
正文: app
Push Notification的iOS處理代碼和Provider詳解框架
這一篇文檔主要描述代碼實現推送通知,在最後補充一些本身在整個過程當中遇到的一些問題,供之後參考,也給其餘朋友一個提醒。ide
1、應用程序的處理代碼工具
這裏就假定已經建立了一個iOS的App,名稱就暫設爲MyPushNotification吧。。。測試
處理推送通知的代碼,主要在AppDelegate.m裏,故在上述假定的項目中能夠找到MyPushNotificationAppDelegate.m文件。url
示例代碼:
1 //本地服務器地址 2 3 #define provider_server @"http://*******" 4 5 //應用啓動時候註冊推送通知服務,第一次安裝時系統會自動提示用戶 6 7 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 9 //註冊推送通知功能 10 11 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 12 13 //將標記數字置爲0,則不顯示 14 15 application.applicationIconBadgeNumber = 0; 16 17 } 18 19 20 21 //接收從蘋果服務器返回的惟一的DeviceToken,而後發送給本身的服務端 22 23 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 24 25 NSString* device_token = [NSString stringWithFormat:@"%@",deviceToken]; 26 27 NSString* device_name = [[UIDevice currentDevice] name]; 28 29 NSString* device_version = [[UIDevice currentDevice] systemVersion]; 30 31 NSString* device_type = [[UIDevice currentDevice] model]; 32 33 NSString *strUrl = [NSString stringWithFormat:@"%@?action=registerDevices&device_token=%@&device_name=%@&device_version=%@&device_type=%@", 34 35 provider_server,device_token,device_name,device_version,device_type]; 36 37 strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 38 39 NSURL *url = [NSURL URLWithString:strUrl]; 40 41 42 43 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 44 45 //發送URL請求 46 47 NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 48 49 } 50 51 52 53 //程序處於啓動狀態,或者在後臺運行時,會接收到推送消息 54 55 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 56 57 { 58 59 if ([[userInfo objectForKey:@"aps"] objectForKey:@"alert"]!=NULL) { 60 61 if(application.applicationState ==UIApplicationStateActive){ 62 63 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"舒適提示" 64 65 message:[NSString stringWithFormat:@"\n%@", 66 67 [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]] 68 69 delegate:self 70 71 cancelButtonTitle:@"OK" 72 73 otherButtonTitles:nil]; 74 [alertView show]; 75 76 [alertView release]; 77 78 79 80 } 81 82 } 83 84 }
這裏重點列出了幾個值得注意的代理方法,固然,還能夠實現更多的代理來豐富推送通知功能。
爲了測試,我在實現
-(void)application:(UIApplication*)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
方法的時候,直接採用了控制檯NSLog輸出DeviceToken,而後將獲得的字符串複製,以便在Provider中使用,由於暫時尚未搭建好本地服務器,沒法採用發送url請求的方式。
只須要這幾個方法就能夠簡單處理推送通知了。
2、Provider詳解
終於說到Provider了,看了不少資料,對於這一塊的介紹都不是很詳細,大多都是一筆帶過。
確實,目前最有效的辦法是直接採用開源框架來處理,我這裏也不例外,可是仍是想多說一下這方面的心得。
首先,推薦兩個開源框架:
(1) Mac OS X系統下的PushMeBaby
https://github.com/zomfg/PushMeBaby-OneMoreTime-Again
這個框架的優點就是能夠直接在Mac環境裏使用,採用的證書爲apns***.cer,詳情參考上一篇的證書說明。不須要生成p12文件。使用方法簡單快速,添加本身的證書文件到資源目錄下,而後直接替換框架代碼裏面的證書變量和DeviceToken就能夠了。
(2) Windows系統下的PushSharp https://github.com/Redth/PushSharp
這個框架的優點在於可適用於多終端,這意味着,可擴展性更強,不論是向什麼終端設備推送,均可以實現。跟上一個框架相比,須要採用p12文件做爲推送條件,注意該框架要求提供p12文件的密碼,這屬於上一篇證書說明中生成p12文件的內容了。
從公司的長遠考慮,我採用了研究這個框架。
代碼修改說明:在項目PushSharp.Sample的Program.cs中將不用的終端類型代碼註釋,修改「APPLE NOTIFICATIONS」下面的代碼,注意修改變量appleCert的p12證書和push.RegisterAppleService中的證書密碼,最後將push.QueueNotification中的DeviceToken參數改成目標字符串,就大功告成了。
先運行客戶端應用程序,而後運行命令行程序後,就能夠看到推送過程了。
提醒:在編譯PushSharp項目時,可能會出現一堆錯誤提醒,別擔憂,極可能是因爲沒有開啓「NuGet」。在VS中,工具——選項——包管理器——常規,選中「容許NuGet在生成期間下載缺乏的程序包」。再次等待編譯就能夠了。
可是無論採用哪一個框架,實現思路都是同樣的:
(1) 搭建本地服務器,配置環境和數據庫
(2) 接收客戶端發送來的DeviceToken,並對其進行妥善管理
(3) 以證書爲憑據,將目標DeviceToken和消息內容發送給APNS,請求推送通知服務
(4) 可處理當客戶端接收到APNS推送的消息後發來的url請求,並作相應處理。完成整個推送過程。
3、配置或者編譯過程當中遇到的錯誤
看到這裏,無非兩個結果嘛,若是成功了,能夠不用往下看了,可是不成功的話,下面的內容或許能夠幫你找到問題所在。
錯誤:
iOS推送消息證書錯誤-Code=3000 "未找到應用程序的「aps-environment」的權利字符串"
這個錯誤應該會很廣泛,涉及的疑點比較多。
到此,Push Notification總結系列就能夠結束了,可是和別人比較,總要有新內容纔算進步嘛,因此在這個總結裏面,加入了第三篇,定位服務的提供。並且這個功能確定和推送服務是一塊兒的,由於推送內容的本地化要求和按區域區分,定位服務就必不可少了。
因此,下一篇就總結一下本身研究定位服務的心得。