小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

IOS 本地和遠(yuǎn)程推送通知詳解

 最初九月雪 2015-02-02

 特酷吧[]采用"署名-非商業(yè)用途-保持一致"的創(chuàng)作共用協(xié)議,使用本文請(qǐng)遵循該協(xié)議

這里主要詳細(xì)介紹蘋果的遠(yuǎn)程推送服務(wù),在本文后會(huì)有本地通知的簡(jiǎn)單示例。
一,IOS遠(yuǎn)程通知服務(wù)APNs
蘋果的APNs(蘋果推送通知服務(wù)Apple Push Notification server)允許設(shè)備和蘋果的推送通知服務(wù)器保持鏈接,支持開(kāi)發(fā)者推送消息到給用戶設(shè)備對(duì)應(yīng)的應(yīng)用程序。
蘋果的APNs基本原理是:
首先由應(yīng)用注冊(cè)遠(yuǎn)程通知。注冊(cè)成功之后APNs會(huì)返回一個(gè)唯一標(biāo)示的設(shè)備令牌碼deviceToken,應(yīng)用拿到分配的設(shè)備令牌碼之后,需要將該設(shè)備令牌碼連同其他設(shè)備以及帳戶相關(guān)信息(如果有必要的話)傳遞給該應(yīng)用對(duì)應(yīng)的后臺(tái)服務(wù)器。當(dāng)后臺(tái)服務(wù)器需要推送消息時(shí),就將消息以及需要推送設(shè)備對(duì)應(yīng)的deviceToken傳遞給APNs,由APNs完成推送工作.
不僅如此,應(yīng)用對(duì)應(yīng)的后臺(tái)服務(wù)器還需要經(jīng)常和APNs進(jìn)行反饋通信,以便后臺(tái)服務(wù)器可以知道那些deviceToken已經(jīng)不存在(可能的原因是用戶卸載了本應(yīng)用),這種情況下我們不應(yīng)該再向deviceToken對(duì)應(yīng)的設(shè)備發(fā)送消息,否則會(huì)增加系統(tǒng)負(fù)荷。事實(shí)上,做蘋果的APNs大量的工作都在后臺(tái),在前臺(tái)的app開(kāi)發(fā)中需要做的就是獲取deviceToken并傳遞給后臺(tái)服務(wù)器。
下面特酷吧根據(jù)自己的實(shí)踐介紹下整個(gè)操作流程。
如果之前我們創(chuàng)建App ID時(shí)配置了開(kāi)啟推送服務(wù),那么我們使用的開(kāi)發(fā)和發(fā)布版的Provisioning文件已經(jīng)能夠滿足我們的操作,這種情況下需要做的就是制作后臺(tái)服務(wù)器使用的證書文件。
1,創(chuàng)建請(qǐng)求證書
使用該證書請(qǐng)求來(lái)申請(qǐng)一個(gè)用于開(kāi)發(fā)的SSL證書。
1. 打開(kāi)“鑰匙串訪問(wèn)”應(yīng)用程序。
2. 選擇“KeychainAccess[鑰匙串訪問(wèn)]->Certificate Assistant[證書助理]->Request a Certificate From CertificateAuthority[從證書辦法機(jī)構(gòu)請(qǐng)求證書]”
輸入賬戶等信息后以默認(rèn)的文件名保存到本地。名稱一般為CertificateSigningRequest.certSigningRequest。
2,申請(qǐng)開(kāi)發(fā)的SSL證書
(1)創(chuàng)建App ID
使用APNs服務(wù)的IOS應(yīng)用必須有一個(gè)唯一的App ID。首先我們需要?jiǎng)?chuàng)建App ID。
進(jìn)入apple開(kāi)發(fā)者中心
https://developer.apple.com/devcenter/ios/index.action
進(jìn)入"Certificates,Identifiers & Profiles"。
[特酷吧寫這篇文章的時(shí)候是2013年5月,apple開(kāi)發(fā)者中心的網(wǎng)站似乎改版過(guò),和之前有些不一樣了]。
進(jìn)入"ios Apps",點(diǎn)擊"Identifiers"。
點(diǎn)擊右上角的加號(hào)添加一個(gè)App ID.
App ID Description中name可以隨便取一個(gè)名字.
App Services中Enable Services字段需要勾選Push Notifications。[當(dāng)前這些內(nèi)容都可以在App ID創(chuàng)建好之后重新再配置]
Explicit App ID中的Bundle ID填入我們應(yīng)用的Bundle ID即可。其他默認(rèn)。
(2)配置App ID
創(chuàng)建好App ID之后,進(jìn)入該App ID詳情頁(yè)面。進(jìn)入setting。
選擇"Create an additional certificate to use for this App ID."進(jìn)入"Create Certificate"頁(yè)面之后根據(jù)提示向?qū)нx擇第1步生成的請(qǐng)求證書上傳。
再根據(jù)操作向?qū)螺d生成好的開(kāi)發(fā)版的SSL證書。下載之后[名稱為aps_development.cer],雙擊將證書安裝到鑰匙串中。這個(gè)證書會(huì)允許你的程序接收APNs發(fā)送來(lái)的推送通知。
3,創(chuàng)建Provisioning Profile
進(jìn)入https://developer.apple.com/account/ios/profile/profileList.action
Provisioning Profiles
點(diǎn)擊右上角加號(hào)添加Provisioning Profile, 選擇iOS App Development,選擇你剛才創(chuàng)建的App ID。
過(guò)程中會(huì)讓你選擇你需要包含的設(shè)備(我是勾選所有設(shè)備)。再隨便輸入你取的證書的名字即可生成該證書。下載到本地安裝該文件。名稱一般為XXXX.mobileprovision
將XXXX.mobileprovision導(dǎo)出p12格式的私鑰文件,這里名稱為Certificates.p12文件
4,制作后臺(tái)服務(wù)器(C#為例)使用的p12文件
特酷吧測(cè)試的服務(wù)器后臺(tái)是用C#寫的,需要?jiǎng)?chuàng)建C#用的證書文件,具體制作過(guò)程如下:
制作p12文件,我們需要使用OpenSSL
我們需要上面幾步中得到的三個(gè)文件:
1、CertificateSigningRequest.certSigningRequest
2、Certificates.p12//本地導(dǎo)出的私鑰文件
3、aps_development.cer
操作如下,在終端中執(zhí)行;
1、將aps_development.cer轉(zhuǎn)換成aps_development.pem格式。
openssl x509 -in aps_development.cer -inform DER -out aps_development.pem -outform PEM
2、將p12格式的私鑰轉(zhuǎn)換成pem,需要設(shè)置幾次密碼。
openssl pkcs12 -nocerts -out Certificates.pem -in Certificates.p12
3、用CertificateSigningRequest.certSigningRequest, Certificates.pem和aps_development.pem創(chuàng)建P12格式的文件。
openssl pkcs12 -export -in aps_development.pem -inkey Certificates.pem -certfile CertificateSigningRequest.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12
這樣我們就得到了在.net應(yīng)用程序中使用的證書文件:aps_developer_identity.p12。
基于C#,JAVA等程序的開(kāi)源的庫(kù)也比較多,如:https://github.com/Redth/APNS-Sharp提供了一個(gè)C#的版本。在該測(cè)試程序中,需要給出這里的aps_developer_identity.p12文件以及密碼。
此外,為了方便IOS開(kāi)發(fā)者測(cè)試APNs,已經(jīng)有很多做好的線程的服務(wù)器端的demo,比如:PushMeBaby[下載地址:https://github.com/stefanhafeneger/PushMeBaby].
下載完成后打開(kāi)工程,將aps.developer.cer文件加入到工程中,修改工程中對(duì)應(yīng)代碼:
self.deviceToken = /*填入第4步中didRegisterForRemoteNotificationsWithDeviceToken獲取到的deviceToken*/;
self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_developer" ofType:@"cer"]; 
運(yùn)行PushMeBaby工程,點(diǎn)擊push即可給app終端發(fā)送消息。
5,本地app代碼參考
1,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中注冊(cè)遠(yuǎn)程通知
//注冊(cè)遠(yuǎn)程通知
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
2,實(shí)現(xiàn)幾個(gè)代理方法:
折疊C/C++ Code復(fù)制內(nèi)容到剪貼板
  1. //獲取deviceToken令牌  
  2. -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken  
  3. {  
  4.     //獲取設(shè)備的deviceToken唯一編號(hào)  
  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. //獲取令牌出錯(cuò)  
  15. -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error  
  16. {  
  17.     //注冊(cè)遠(yuǎn)程通知設(shè)備出錯(cuò)  
  18.     NSLog(@"RegisterForRemoteNotification error=%@",error);  
  19. }  
  20. //在應(yīng)用在前臺(tái)時(shí)受到消息調(diào)用  
  21. -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo  
  22. {  
  23.    //打印推送的消息  
  24.   NSLog(@"%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]):  
  25. }  
另外:
在進(jìn)行IOS遠(yuǎn)程推送的過(guò)程中,首先需要?jiǎng)?chuàng)建帶有“Enable for Apple Push Notification service”的App ID。如果之前的創(chuàng)建的App ID開(kāi)啟了推送功能,則可以直接使用之前開(kāi)發(fā)和發(fā)布需要的Provisioning。如果之前的App ID沒(méi)有配置開(kāi)啟遠(yuǎn)程推送功能,則應(yīng)該首先創(chuàng)建開(kāi)啟了遠(yuǎn)程推送功能的App ID,并根據(jù)該App ID生成對(duì)應(yīng)的開(kāi)發(fā)和發(fā)布版本的Provisioning。
還需要制作服務(wù)器端的證書,如果app使用的是開(kāi)發(fā)者證書,則需要使用此開(kāi)發(fā)者證書制作服務(wù)器端的開(kāi)發(fā)者證書,等到發(fā)布版的時(shí)候,還需要制作發(fā)布版本的證書。
使用開(kāi)發(fā)者證書的測(cè)試地址
gateway.sandbox.push.apple.com:2195 
發(fā)布版本的地址
gateway.push.apple.com:2195
另外一個(gè)值得注意的問(wèn)題是:一般我們是使用開(kāi)發(fā)版本的Provisioning做推送測(cè)試,如果沒(méi)有問(wèn)題,再使用發(fā)布版本證書的時(shí)候一般也應(yīng)該是沒(méi)有問(wèn)題的。為了以防萬(wàn)一,我們可以在越獄的手機(jī)上安裝我們的使用發(fā)布版證書的ipa文件(最好使用debug版本,并打印出獲取到的deviceToken),安裝成功后在;XCode->Window->Organizer-找到對(duì)應(yīng)的設(shè)備查看console找到打印的deviceToken。
在后臺(tái)的推送程序中使用發(fā)布版制作的證書并使用該deviceToken做推送服務(wù).
使用開(kāi)發(fā)和發(fā)布證書獲取到的deviceToken是不一樣的。
二,本地通知服務(wù)
IOS的本地通知服務(wù)需要使用NSLocalNotification,處理基于時(shí)間行為的通知。比如定時(shí)通知用戶該學(xué)習(xí)了。
使用NSLocalNotification一般需要考慮三個(gè)方面:
scheduled time:時(shí)間周期,用來(lái)指定iOS系統(tǒng)發(fā)送通知的日期和時(shí)間;
notification type:通知類型(包括警告信息,動(dòng)作按鈕的標(biāo)題,應(yīng)用圖標(biāo)上的badge(數(shù)字標(biāo)記)和播放的聲音);
自定義數(shù)據(jù),本地通知可以包含一個(gè)dictionary類型的本地?cái)?shù)據(jù)。
對(duì)本地通知的數(shù)量限制,iOS最多允許最近本地通知數(shù)量是64個(gè),超過(guò)限制的本地通知將被iOS忽略。
使用示例:
UILocalNotification *notification=[[UILocalNotification alloc] init]; 
NSDate *now=[NSDate new]; 
notification.fireDate=[now addTimeInterval:100]; 
notification.timeZone=[NSTimeZone defaultTimeZone]; 
notification.alertBody=@"特酷吧提醒你該學(xué)習(xí)IOS了"; 
[[UIApplication sharedApplication]   scheduleLocalNotification:notification];
20130714補(bǔ)充:
如果之前App ID已經(jīng)配置了推送功能,則客戶端做得工作很簡(jiǎn)單:只需要生成開(kāi)發(fā)版和發(fā)布版的推送證書例如:aps_production.cer,然后下載安裝。之后重新生成開(kāi)發(fā)版本和發(fā)布版本的provisioning profiles授權(quán)文件即可(provisioning profiles授權(quán)一定要在生成安裝了推送證書之后重新下載安裝)。
而服務(wù)器端則需要aps_production.cer等生成服務(wù)器端的證書。
轉(zhuǎn)載請(qǐng)注明來(lái)自特酷吧,本文地址:http://www./program/286/
推薦閱讀:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多