遠程推送IOS

一,IOS遠程通知服務APNsios

蘋果的APNs(蘋果推送通知服務Apple Push Notification server)容許設備和蘋果的推送通知服務器保持連接,支持開發者推送消息到給用戶設備對應的應用程序。git

蘋果的APNs基本原理是:github

首先由應用註冊遠程通知。註冊成功以後APNs會返回一個惟一標示的設備令牌碼deviceToken,應用拿到分配的設備令牌碼以後,須要將該設備令牌碼連同其餘設備以及賬戶相關信息(若是有必要的話)傳遞給該應用對應的後臺服務器。當後臺服務器須要推送消息時,就將消息以及須要推送設備對應的deviceToken傳遞給APNs,由APNs完成推送工做.web

不只如此,應用對應的後臺服務器還須要常常和APNs進行反饋通訊,以便後臺服務器能夠知道那些deviceToken已經不存在(可能的緣由是用戶卸載了本應用),這種狀況下咱們不該該再向deviceToken對應的設備發送消息,不然會增長系統負荷。事實上,作蘋果的APNs大量的工做都在後臺,在前臺的app開發中須要作的就是獲取deviceToken並傳遞給後臺服務器。服務器

若是以前咱們建立App ID時配置了開啓推送服務,那麼咱們使用的開發和發佈版的Provisioning文件已經可以知足咱們的操做,這種狀況下須要作的就是製做後臺服務器使用的證書文件。app

1,建立請求證書ide

使用該證書請求來申請一個用於開發的SSL證書。學習

1. 打開「鑰匙串訪問」應用程序。測試

2. 選擇「KeychainAccess[鑰匙串訪問]->Certificate Assistant[證書助理]->Request a Certificate From CertificateAuthority[從證書辦法機構請求證書]」this

輸入帳戶等信息後以默認的文件名保存到本地。名稱通常爲CertificateSigningRequest.certSigningRequest。

2,申請開發的SSL證書

(1)建立App ID

使用APNs服務的IOS應用必須有一個惟一的App ID。首先咱們須要建立App ID。

進入apple開發者中心

https://developer.apple.com/devcenter/ios/index.action

進入"Certificates,Identifiers & Profiles"。

進入"ios Apps",點擊"Identifiers"。

點擊右上角的加號添加一個App ID.

App ID Description中name能夠隨便取一個名字.

App Services中Enable Services字段須要勾選Push Notifications。[當前這些內容均可以在App ID建立好以後從新再配置]

Explicit App ID中的Bundle ID填入咱們應用的Bundle ID便可。其餘默認。

(2)配置App ID

建立好App ID以後,進入該App ID詳情頁面。進入setting。

選擇"Create an additional certificate to use for this App ID."進入"Create Certificate"頁面以後根據提示嚮導選擇第1步生成的請求證書上傳。

再根據操做嚮導下載生成好的開發版的SSL證書。下載以後[名稱爲aps_development.cer],雙擊將證書安裝到鑰匙串中。這個證書會容許你的程序接收APNs發送來的推送通知。

3,建立Provisioning Profile

進入https://developer.apple.com/account/ios/profile/profileList.action

Provisioning Profiles

點擊右上角加號添加Provisioning Profile, 選擇iOS App Development,選擇你剛纔建立的App ID。

過程當中會讓你選擇你須要包含的設備(我是勾選全部設備)。再隨便輸入你取的證書的名字便可生成該證書。下載到本地安裝該文件。名稱通常爲XXXX.mobileprovision

將XXXX.mobileprovision導出p12格式的私鑰文件,這裏名稱爲Certificates.p12文件

4,製做後臺服務器(C#爲例)使用的p12文件

服務器後臺是用C#寫的,須要建立C#用的證書文件,具體制做過程以下:

製做p12文件,咱們須要使用OpenSSL

咱們須要上面幾步中獲得的三個文件:

一、CertificateSigningRequest.certSigningRequest

二、Certificates.p12//本地導出的私鑰文件

三、aps_development.cer

操做以下,在終端中執行;

一、將aps_development.cer轉換成aps_development.pem格式。

openssl x509 -in aps_development.cer -inform DER -out aps_development.pem -outform PEM

二、將p12格式的私鑰轉換成pem,須要設置幾回密碼。

openssl pkcs12 -nocerts -out Certificates.pem -in Certificates.p12

三、用CertificateSigningRequest.certSigningRequest, Certificates.pem和aps_development.pem建立P12格式的文件。

openssl pkcs12 -export -in aps_development.pem -inkey Certificates.pem -certfile CertificateSigningRequest.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12

這樣咱們就獲得了在.net應用程序中使用的證書文件:aps_developer_identity.p12。

基於C#,JAVA等程序的開源的庫也比較多,如:https://github.com/Redth/APNS-Sharp提供了一個C#的版本。在該測試程序中,須要給出這裏的aps_developer_identity.p12文件以及密碼。

此外,爲了方便IOS開發者測試APNs,已經有不少作好的線程的服務器端的demo,好比:PushMeBaby[下載地址:https://github.com/stefanhafeneger/PushMeBaby].

下載完成後打開工程,將aps.developer.cer文件加入到工程中,修改工程中對應代碼:

self.deviceToken = /*填入第4步中didRegisterForRemoteNotificationsWithDeviceToken獲取到的deviceToken*/;

self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_developer" ofType:@"cer"]; 

運行PushMeBaby工程,點擊push便可給app終端發送消息。

5,本地app代碼參考

1,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中註冊遠程通知

//註冊遠程通知

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];

2,實現幾個代理方法:

摺疊C/C++ Code複製內容到剪貼板

  1. //獲取deviceToken令牌  

  2. -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken  

  3. {  

  4.     //獲取設備的deviceToken惟一編號  

  5.     NSLog(@"deviceToken=%@",deviceToken);  

  6.     NSString *realDeviceToken=[NSString stringWithFormat:@"%@",deviceToken];  

  7.     //去除<>  

  8.     realDeviceToken = [realDeviceToken stringByReplacingOccurrencesOfString:@"<" withString:@""];  

  9.     realDeviceToken = [realDeviceToken stringByReplacingOccurrencesOfString:@">" withString:@""];  

  10.     NSLog(@"realDeviceToken=%@",realDeviceToken);  

  11.     [[NSUserDefaults standardUserDefaults] setValue:realDeviceToken forKey:@"DeviceToken"];  

  12. }  

  13.   

  14. //獲取令牌出錯  

  15. -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error  

  16. {  

  17.     //註冊遠程通知設備出錯  

  18.     NSLog(@"RegisterForRemoteNotification error=%@",error);  

  19. }  

  20. //在應用在前臺時受到消息調用  

  21. -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo  

  22. {  

  23.    //打印推送的消息  

  24.   NSLog(@"%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]):  

  25. }  

另外:

在進行IOS遠程推送的過程當中,首先須要建立帶有「Enable for Apple Push Notification service」的App ID。若是以前的建立的App ID開啓了推送功能,則能夠直接使用以前開發和發佈須要的Provisioning。若是以前的App ID沒有配置開啓遠程推送功能,則應該首先建立開啓了遠程推送功能的App ID,並根據該App ID生成對應的開發和發佈版本的Provisioning。

還須要製做服務器端的證書,若是app使用的是開發者證書,則須要使用此開發者證書製做服務器端的開發者證書,等到發佈版的時候,還須要製做發佈版本的證書。

使用開發者證書的測試地址

gateway.sandbox.push.apple.com:2195 

發佈版本的地址

gateway.push.apple.com:2195

另一個值得注意的問題是:通常咱們是使用開發版本的Provisioning作推送測試,若是沒有問題,再使用發佈版本證書的時候通常也應該是沒有問題的。爲了以防萬一,咱們能夠在越獄的手機上安裝咱們的使用發佈版證書的ipa文件(最好使用debug版本,並打印出獲取到的deviceToken),安裝成功後在;XCode->Window->Organizer-找到對應的設備查看console找到打印的deviceToken。

在後臺的推送程序中使用發佈版製做的證書並使用該deviceToken作推送服務.

使用開發和發佈證書獲取到的deviceToken是不同的

二,本地通知服務

IOS的本地通知服務須要使用NSLocalNotification,處理基於時間行爲的通知。好比定時通知用戶該學習了。

使用NSLocalNotification通常須要考慮三個方面:

scheduled time:時間週期,用來指定iOS系統發送通知的日期和時間;

notification type:通知類型(包括警告信息,動做按鈕的標題,應用圖標上的badge(數字標記)和播放的聲音);

自定義數據,本地通知能夠包含一個dictionary類型的本地數據。

對本地通知的數量限制,iOS最多容許最近本地通知數量是64個,超過限制的本地通知將被iOS忽略。

使用示例:

UILocalNotification *notification=[[UILocalNotification alloc] init]; 

NSDate *now=[NSDate new]; 

notification.fireDate=[now addTimeInterval:100]; 

notification.timeZone=[NSTimeZone defaultTimeZone]; 

notification.alertBody=@"學習IOS了"; 

[[UIApplication sharedApplication]   scheduleLocalNotification:notification];

補充:

若是以前App ID已經配置了推送功能,則客戶端作得工做很簡單:只須要生成開發版和發佈版的推送證書例如:aps_production.cer,而後下載安裝。以後從新生成開發版本和發佈版本的provisioning profiles受權文件便可(provisioning profiles受權必定要在生成安裝了推送證書以後從新下載安裝)。

而服務器端則須要aps_production.cer等生成服務器端的證書。

相關文章
相關標籤/搜索