為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2016-07 文章編輯:小燈 瀏覽次數(shù):3581
一.關(guān)于推送通知
推送通知,也被叫做遠(yuǎn)程通知,是在iOS
3.0以后被引入的功能。是當(dāng)程序沒(méi)有啟動(dòng)或不在前臺(tái)運(yùn)行時(shí),告訴用戶有新消息的一種途徑,是從外部服務(wù)器發(fā)送到應(yīng)用程序上的。一般說(shuō)來(lái),當(dāng)要顯示消息或
下載數(shù)據(jù)的時(shí)候,通知是由遠(yuǎn)程服務(wù)器(程序的提供者)發(fā)送,然后通過(guò)蘋果的推送通知服務(wù)(Apple Push Notification
Service,簡(jiǎn)稱apns)推送到設(shè)備的程序上。
推
送的新消息可能是一條信息、一項(xiàng)即將到期的日程或是一份遠(yuǎn)程服務(wù)器上的新數(shù)據(jù)。在系統(tǒng)上展現(xiàn)的時(shí)候,可以顯示警告信息或在程序icon上顯示數(shù)字,同時(shí),
也可以播放警告音。一旦用戶注意到程序有新的信息、時(shí)間或是數(shù)據(jù),他們可以運(yùn)行程序并訪問(wèn)新的內(nèi)容。也可以選擇忽略通知,這時(shí)程序?qū)⒉粫?huì)被激活。
iPhone, iPad和iPod touch上同一時(shí)刻只有一個(gè)app在前臺(tái)運(yùn)行。大多數(shù)程序在后臺(tái)運(yùn)行的時(shí)候,可以對(duì)某些用戶感興趣的內(nèi)容做出回應(yīng)(定時(shí)、或數(shù)據(jù)等)。推送通知能讓程序在這些事件發(fā)生的時(shí)候通知用戶。
作
為提供者為程序開(kāi)發(fā)和部署推送通知,必須通過(guò)iOS Developer Program
Portal獲得SSL證書(shū)。每個(gè)證書(shū)限用于一個(gè)程序,使用程序的bundle
ID作為標(biāo)識(shí)。證書(shū)有兩種用途的:一種是針對(duì)sandbox(用于開(kāi)發(fā)和測(cè)試),另外一種針對(duì)發(fā)布產(chǎn)品。這兩種運(yùn)行環(huán)境擁有為各自指定的IP地址并且需要
不同的證書(shū)。還必須為兩種不同的環(huán)境獲取各自的provisioning profiles。
APNS提供了兩項(xiàng)基本的服務(wù):消息推送和反饋服務(wù)。
消
息推送:使用流式TCP套接字將推送通知作為二進(jìn)制數(shù)據(jù)發(fā)送給APNs。消息推送有分別針對(duì)開(kāi)發(fā)和測(cè)試用的sandbox、發(fā)布產(chǎn)品的兩個(gè)接口,每個(gè)都有
各自的地址和端口。不管用哪個(gè)接口,都需要通過(guò)TLS或SSL,使用SSL證書(shū)來(lái)建立一個(gè)安全的信道。提供者編制通知信息,然后通過(guò)這個(gè)信道將其發(fā)送給
APNs。 注:sandbox:?? gateway.sandbox.push.apple.com:219
產(chǎn)品接口:gateway.push.apple.com:2195
反
饋服務(wù):可以得到針對(duì)某個(gè)程序的發(fā)送失敗記錄。提供者應(yīng)該使用反饋服務(wù)周期性檢查哪些設(shè)備一直收不到通知,不需要重復(fù)發(fā)送通知到這些設(shè)備,降低推送服務(wù)器
的負(fù)擔(dān)。 注:sandbox:feedback.push.apple.com:2196
產(chǎn)品接口:feedback.sandbox.push.apple.com:2196
二.Apple Push Notification的工作機(jī)制
自己的客戶端發(fā)送消息到自己應(yīng)用軟件的apns,apns發(fā)送消息到你的手機(jī)。這個(gè)是根據(jù)令牌識(shí)別的。手機(jī)在發(fā)送消息到你的應(yīng)用軟件。
首先是應(yīng)用程序注冊(cè)消息推送。
IOS跟APNS Server要deviceToken。應(yīng)用程序接受deviceToken。
應(yīng)用程序?qū)eviceToken發(fā)送給PUSH服務(wù)端程序(Provider)。
服務(wù)端程序向APNS服務(wù)發(fā)送消息。
APNS服務(wù)將消息發(fā)送給iPhone應(yīng)用程序。
1. Provider是指某個(gè)iPhone軟件的Push服務(wù)器,是我們將要開(kāi)發(fā)的服務(wù)器。
2. APNS 是Apple Push Notification Service(Apple Push服務(wù)器)的縮寫(xiě),是蘋果的服務(wù)器。
上圖可以分為三個(gè)階段:
第一階段:推送服務(wù)器(provider)把要發(fā)送的消息、目的iPhone的標(biāo)識(shí)打包,發(fā)給APNS;
第二階段:APNS在自身的已注冊(cè)Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識(shí)的iPhone,并把消息發(fā)到iPhone;
第三階段:iPhone把發(fā)來(lái)的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知。
三 推送之前的配置
在任何iOS應(yīng)用開(kāi)發(fā)里面,開(kāi)發(fā)人員總是在團(tuán)隊(duì)里面扮演某一角色:團(tuán)隊(duì)經(jīng)理,團(tuán)隊(duì)管理員,和團(tuán)隊(duì)成員。iPhone開(kāi)發(fā)證書(shū)和配置文件由不同角色完成。通常團(tuán)隊(duì)經(jīng)理是團(tuán)隊(duì)里面唯一可以創(chuàng)建Development SSL證書(shū)(沙箱環(huán)境)和Distribution SSL證書(shū)(產(chǎn)品環(huán)境)的人。而團(tuán)隊(duì)經(jīng)理和團(tuán)隊(duì)管理員都可以創(chuàng)建Development和Distribution的配置文件。團(tuán)隊(duì)成員只能下載并安裝證書(shū)和配置文件(!這里要區(qū)別好證書(shū)和配置文件的概念:證書(shū),即Certificates,它主要是使用Access Key Chain來(lái)生成的一個(gè)簽名密鑰。而配置文件,即Provisioning profiles,它主要是根據(jù)不同的App來(lái)生成的針對(duì)性的代碼簽名文件。二者區(qū)別是一般一個(gè)開(kāi)發(fā)者賬戶只能有一個(gè)Certificates(而Development一個(gè),Distribtuion一個(gè)),但是可以有多個(gè)Provisioning profiles文件,且這些Provisioning profiles通常創(chuàng)建的時(shí)候都使用同一個(gè)Certrificates)。以下部分詳細(xì)介紹該過(guò)程。
注意:iOS Provisioning Portal給所有iOS開(kāi)發(fā)者。
創(chuàng)建SSL證書(shū)和密鑰
在iOS Dev Center的iOS Provisioning Portal里面,團(tuán)隊(duì)經(jīng)理選中相應(yīng)APNs的AppID。他需要完成以下步驟來(lái)創(chuàng)建SSL證書(shū):
1.
點(diǎn)擊窗口左邊側(cè)邊欄的App IDs。
將會(huì)跳轉(zhuǎn)到一個(gè)顯示當(dāng)前合法應(yīng)用IDs的頁(yè)面。每個(gè)應(yīng)用的ID前面包含了它的Bundle ID,而在Bundle ID之前包含了蘋果生成的十位字符串。團(tuán)隊(duì)管理員必須輸入Bundle ID。對(duì)于每個(gè)證書(shū),它必須匹配某一特定的Bundle ID,你不能使用“wildcart”的應(yīng)用ID。即要使用推送通知的應(yīng)用的Bundle ID不能使用“*”來(lái)創(chuàng)建。
2.
找到需要?jiǎng)?chuàng)建SSL證書(shū)的應(yīng)用ID(和Development Provisioning Profile相關(guān)),并單擊Configure按鈕。
你必須確保該App ID下面的蘋果推送通知服務(wù)欄下面顯示“可用”狀態(tài)才能為該應(yīng)用配置APNs證書(shū)。
3.
在App ID配置頁(yè)面,檢查已經(jīng)勾選了“Enable for Apple Push Notification service”復(fù)選框,并點(diǎn)擊下面的“Configure”按鈕。
單擊該按鈕將會(huì)啟動(dòng)APNs助理,它會(huì)通過(guò)一系列步驟來(lái)引導(dǎo)完成操作。
4.
第一步要求你啟動(dòng)Keychain Access應(yīng)用并生成一個(gè)Certificate Signing Request(CSR)文件。
下面的介紹來(lái)自證書(shū)助理。當(dāng)你完成生成CSR后,點(diǎn)擊Keychain Access上面Continue來(lái)返回到APNs Assistant。
當(dāng)你創(chuàng)建一個(gè)CSR時(shí),Keychain Access生成一個(gè)私有和公有的加密密鑰對(duì)。而私有的密鑰會(huì)默認(rèn)被放入你的Login keychain里面。而公有的密鑰包含CSR會(huì)發(fā)送到配置服務(wù)器。當(dāng)配置服務(wù)器把證書(shū)發(fā)回給你的時(shí)候,證書(shū)里面的其中一個(gè)條目將是公有密鑰。
5.
在Submit Certificate Signing Request面板上,單擊Choose File。導(dǎo)航到你之前創(chuàng)建的CSR文件的地方并選中它。
6.
單擊Generate按鈕。
在顯示Generate Your Certificate面板的同時(shí),Assistant會(huì)配置并生成你的客戶端SSL證書(shū)。如果生成成功,它將會(huì)顯示信息“Your APNs Certificate has been generated.”。單擊Continue來(lái)進(jìn)入下一步操作。
7.
在下一個(gè)面板,單擊Download Now按鈕來(lái)下載證書(shū)文件到本地文件夾。找到文件下載的地方并雙擊證書(shū)文件(該證書(shū)文件包含一個(gè).cer的擴(kuò)展名)來(lái)把它安裝到你的keychain里面。當(dāng)完成后,單擊APNs Assistant上面的Done按鈕。
雙擊加載啟動(dòng)Keychain Access。確保你已經(jīng)把剛才的證書(shū)安裝到了你用于開(kāi)發(fā)的電腦的login keychain里面。在Keychain Access里面,確保你的證書(shū)使用的ID匹配你應(yīng)用的Bundle ID。APNs的SSL證書(shū)應(yīng)該安裝到你的通知服務(wù)上面。
當(dāng)你返回到iOS Dev Center Portal的Configure App ID頁(yè)面完成這些步驟后,你的證書(shū)應(yīng)該會(huì)變成綠色,并且顯示“Enabled”。
為了給產(chǎn)品環(huán)境創(chuàng)建一個(gè)證書(shū),重復(fù)上述步驟,但記住選中產(chǎn)品證書(shū)的應(yīng)用ID。
團(tuán)隊(duì)經(jīng)理或團(tuán)隊(duì)管理器接下來(lái)必須創(chuàng)建在服務(wù)器用于遠(yuǎn)程通知開(kāi)發(fā)的配置證書(shū)(Development 或 Distribution)。配置文件就是一個(gè)集合,它囊括了和應(yīng)用相關(guān)的開(kāi)發(fā)者和開(kāi)發(fā)團(tuán)隊(duì)驗(yàn)證過(guò)的設(shè)備并使用這些設(shè)備來(lái)測(cè)試應(yīng)用程序。配置文件包含了證書(shū)、設(shè)備標(biāo)示符、應(yīng)用的Bundle ID、和所有權(quán)利,包括。所有團(tuán)隊(duì)程序需要在運(yùn)行并測(cè)試他們應(yīng)用代碼的設(shè)備上面安裝該配置文件。
注意:關(guān)于創(chuàng)建配置文件的詳細(xì)解析參考編程用戶指南。
為了下載并安裝配置文件,團(tuán)隊(duì)程序必須完成以下步驟:
1.
進(jìn)入iOS Dev Center的Provisioning portal頁(yè)面。
2.
創(chuàng)建一個(gè)新的配置文件,并包含你注冊(cè)用于APNs的App ID。
3.
在你下載這個(gè)新的配置文件之前修改任何已存在的配置文件。
你必須修改配置文件的一些細(xì)微部分(比如切換選項(xiàng))來(lái)生成一個(gè)新的配置文件。如果配置文件并沒(méi)有“受損(dirtied)”,你不應(yīng)該給以該原始配置文件任何推送的權(quán)利。
4.
找到文件的下載目錄,把該配置文件(通常是一個(gè).mobileprovision擴(kuò)展文件)拖拉到Xcode或iTunes應(yīng)用程序的圖標(biāo)上面。
可選的,你也可以把配置文件復(fù)制到~/Library/MobileDevice/Provisioning Profiles目錄。如果當(dāng)前目錄不存在則生成一個(gè)新目錄。
5.
驗(yàn)證該配置文件的權(quán)利是否正確。為此,使用文本編輯器打開(kāi).mobileprovision文件。該文件的內(nèi)容是一個(gè)XML的文本。查看在aps-environment鍵的位置的字典值。對(duì)于一個(gè)開(kāi)發(fā)模式的配置文件,該值應(yīng)該是development;而對(duì)應(yīng)發(fā)布模式的配置文件,該字符值應(yīng)該是production。
6.
在Xcode的Organizer窗口,查看Provisioning Profiles部分,并確認(rèn)證書(shū)已經(jīng)安裝到你的設(shè)備上面。
當(dāng)你編譯該工程的時(shí)候,二進(jìn)制文件現(xiàn)在使用證書(shū)的私有密鑰簽名。
4.2.3
安裝SSL證書(shū)和密鑰到你的服務(wù)器上面
你必須安裝SSL發(fā)布證書(shū)和你之前獲取的私有加密密鑰到需要運(yùn)行提供者代碼的服務(wù)器上,從該服務(wù)器連接到APNs的沙箱或產(chǎn)品環(huán)境。為此,需要完成以下步驟:
1.
打開(kāi)Keychain Access實(shí)體并單擊左邊面板的My Certificates類別。
2.
找到你將要安裝的證書(shū),并打開(kāi)相應(yīng)內(nèi)容。
你將會(huì)看到證書(shū)和私有密鑰。
3.
選中證書(shū)和密鑰,選中File > Export Items,并把它們導(dǎo)出個(gè)人信息交換文件(.p12)。
4.
如果服務(wù)器采用Buby或Perl語(yǔ)言來(lái)實(shí)現(xiàn)的話,那么它們更容易處理個(gè)人信息交換格式的文件。為了把證書(shū)轉(zhuǎn)換為該格式,需要完成以下步驟:
a)
在Keychain Access里面,選中相應(yīng)證書(shū)并選擇File > Export Items。選擇個(gè)人信息交換格式選項(xiàng)(.p12)。選擇一個(gè)保存地址,并單擊Save按鈕。
b)
加載終端應(yīng)用,并輸入如下的命令:
openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes
5.
拷貝.pem證書(shū)文件到新的電腦并安裝它到合適的地方。
這次準(zhǔn)備工作已經(jīng)完成了。
下面是客戶端的步驟了
一個(gè)應(yīng)用程序必須在設(shè)備(iOS設(shè)備或Mac電腦)上面注冊(cè)了蘋果推送通知服務(wù)才能接收來(lái)自程序提供者的遠(yuǎn)程通知。
注冊(cè)過(guò)程包含以下三個(gè)步驟:
一個(gè)應(yīng)用程序必須在設(shè)備(iOS設(shè)備或Mac電腦)上面注冊(cè)了蘋果推送通知服務(wù)才能接收來(lái)自程序提供者的遠(yuǎn)程通知。
注冊(cè)過(guò)程包含以下三個(gè)步驟:
1.
程序調(diào)用registerForRemoteNotificationTypes:方法。
2.
委托實(shí)現(xiàn)application:didRegisterForRemoteNotificationsWithDeviceToken:方法來(lái)接收設(shè)備令牌。
3.
把設(shè)備令牌作為非對(duì)象(二進(jìn)制值)傳遞給程序提供者。
1.
程序調(diào)用registerForRemoteNotificationTypes:方法。
2.
委托實(shí)現(xiàn)application:didRegisterForRemoteNotificationsWithDeviceToken:方法來(lái)接收設(shè)備令牌。
3.
把設(shè)備令牌作為非對(duì)象(二進(jìn)制值)傳遞給程序提供者。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.viewController = [[[ViewController alloc] init] autorelease];
self.window.rootViewController = self.viewController;
[self.window setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]]];
[self.window makeKeyAndVisible];
/** 注冊(cè)推送通知功能, */
[[UIApplication sharedApplication]
registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
//判斷程序是不是由推送服務(wù)完成的
if(launchOptions) {
NSDictionary* pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(pushNotificationKey) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"推送通知"
message:@"這是通過(guò)推送窗口啟動(dòng)的程序,你可以在這里處理推送內(nèi)容"
delegate:nil
cancelButtonTitle:@"知道了"
otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
}
returnYES;
}
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString* token = [NSString stringWithFormat:@"%@",deviceToken];
NSLog(@"apns -> 生成的devToken:%@", token);
//把deviceToken發(fā)送到我們的推送服務(wù)器
DeviceSender* sender = [[[DeviceSender alloc]initWithDelegate:self ]autorelease];
[sender sendDeviceToPushServer:token ];
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSLog(@"apns -> 注冊(cè)推送功能時(shí)發(fā)生錯(cuò)誤, 錯(cuò)誤信息:\n %@", err);
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"\napns -> didReceiveRemoteNotification,Receive Data:\n%@", userInfo);
//把icon上的標(biāo)記數(shù)字設(shè)置為0,
application.applicationIconBadgeNumber = 0;
if([[userInfo objectForKey:@"aps"] objectForKey:@"alert"]!=NULL) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"**推送消息**"
message:[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]
delegate:self
cancelButtonTitle:@"關(guān)閉"
otherButtonTitles:@"處理推送內(nèi)容",nil];
alert.tag = alert_tag_push;
[alert show];
}
}
至此已經(jīng)可以了,如果沒(méi)有服務(wù)器端可以參考pushMebaby
日期:2018-04 瀏覽次數(shù):6845
日期:2017-02 瀏覽次數(shù):3513
日期:2017-09 瀏覽次數(shù):3752
日期:2017-12 瀏覽次數(shù):3598
日期:2018-12 瀏覽次數(shù):4907
日期:2016-12 瀏覽次數(shù):4667
日期:2017-07 瀏覽次數(shù):13713
日期:2017-12 瀏覽次數(shù):3588
日期:2018-06 瀏覽次數(shù):4338
日期:2018-05 瀏覽次數(shù):4520
日期:2017-12 瀏覽次數(shù):3627
日期:2017-06 瀏覽次數(shù):4054
日期:2018-01 瀏覽次數(shù):4023
日期:2016-12 瀏覽次數(shù):3979
日期:2018-08 瀏覽次數(shù):4490
日期:2017-12 瀏覽次數(shù):3797
日期:2016-09 瀏覽次數(shù):6557
日期:2018-07 瀏覽次數(shù):3280
日期:2016-12 瀏覽次數(shù):3298
日期:2018-10 瀏覽次數(shù):3449
日期:2018-10 瀏覽次數(shù):3557
日期:2018-09 瀏覽次數(shù):3647
日期:2018-02 瀏覽次數(shù):3672
日期:2015-05 瀏覽次數(shù):3595
日期:2018-09 瀏覽次數(shù):3379
日期:2018-06 瀏覽次數(shù):3504
日期:2017-02 瀏覽次數(shù):3939
日期:2018-02 瀏覽次數(shù):4409
日期:2018-02 瀏覽次數(shù):4275
日期:2016-12 瀏覽次數(shù):3642
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.