Push Notification總結系列(二)

Push Notification系列歸納:git

1.Push Notification簡介和證書說明及生成配置github

2.Push Notification的iOS處理代碼和Provider詳解數據庫

3.Push Notification的移動客戶端定位服務服務器

 

正文: app

Push NotificationiOS處理代碼和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」的權利字符串"

這個錯誤應該會很廣泛,涉及的疑點比較多。

  1. AppID含有通配符,請參考上一篇內容
  2. 證書生成順序不對,請參考上一篇內容
  3. Target證書配置不正確
  4. 編譯的問題,能夠先將設備上的該應用刪除,而後clean後從新編譯項目

 

到此,Push Notification總結系列就能夠結束了,可是和別人比較,總要有新內容纔算進步嘛,因此在這個總結裏面,加入了第三篇,定位服務的提供。並且這個功能確定和推送服務是一塊兒的,由於推送內容的本地化要求和按區域區分,定位服務就必不可少了。

因此,下一篇就總結一下本身研究定位服務的心得。

相關文章
相關標籤/搜索