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