OC 教程 极光推送
一直覺得自己寫的不是技術(shù),而是情懷,一個(gè)個(gè)的教程是自己這一路走來的痕跡。靠專業(yè)技能的成功是最具可復(fù)制性的,希望我的這條路能讓你們少走彎路,希望我能幫你們抹去知識(shí)的蒙塵,希望我能幫你們理清知識(shí)的脈絡(luò),希望未來技術(shù)之巔上有你們也有我。
說明:今天打算寫一下極光推送的整個(gè)過程,在編寫的時(shí)候已經(jīng)錄制了視頻,不過這個(gè)視頻是留給未來的我看的,今年準(zhǔn)備自學(xué)Pyhton,視頻不打算分享,里面涉及項(xiàng)目的隱私資料,我把整個(gè)重要的過程用圖片的形式寫出來。
OC 項(xiàng)目底層框架(萬能)
官網(wǎng)極光推送ios開發(fā)文檔
視頻位置:
印象筆記
說明一下:測(cè)試的時(shí)候要用真機(jī)測(cè)試,不然模擬器無法推送。
馬上開始:
注意:下面講的在蘋果官網(wǎng)上面申請(qǐng)推送證書的時(shí)候,App是沒有上架的情況下先配置項(xiàng)目描述文件。如果項(xiàng)目是已經(jīng)上架了,再去做極光推送功能的話。只要在點(diǎn)擊進(jìn)項(xiàng)目描述文件把推送功能打開,直接創(chuàng)建開發(fā)SSL證書跟生產(chǎn)SSL證書就可以了。
如果App上架打開推送功能 看下面
上線的圖片創(chuàng)建創(chuàng)建開發(fā)SSL證書跟生產(chǎn)SSL證書的時(shí)候如果沒有需要你上存SCR證書的步驟就需要注意,我在2019年配置的時(shí)候在上線的兩張圖片點(diǎn)進(jìn)去配置發(fā)現(xiàn)缺少不需要你上存SCR證書。這個(gè)是系統(tǒng)的BUG,SCR證書是一定要上存。如果發(fā)現(xiàn)缺少上存SCR證書的時(shí)候可以到配置證書哪里配置。詳見下面 問題1 有詳細(xì)步驟
重點(diǎn):極光推送的主要流程
1.上蘋果網(wǎng)站上面創(chuàng)建一個(gè)AppID,來綁定你項(xiàng)目里面的BundleID
2.然后在自己的電腦上面生成一個(gè)SCR文件
3.上蘋果網(wǎng)站上面創(chuàng)建一張開發(fā)推送證書和發(fā)布推送證書(這兩張證書在創(chuàng)建的過程中會(huì)用到SCR文件)
4.兩張證書完成之后下載下來雙擊安裝。在鑰匙串里面可以看到已經(jīng)安裝的兩張證書。分別右擊導(dǎo)出p12文件。
5.上極光網(wǎng)站申請(qǐng)當(dāng)前項(xiàng)目的app應(yīng)用。把兩張證書填寫進(jìn)去。就ok了,會(huì)生成一個(gè)appKey.會(huì)用到項(xiàng)目里面去。
6.在項(xiàng)目里面的設(shè)置兩個(gè)地方,都是打開推送的按鈕。具體看下面。
7.在AppDelegate里面寫代碼.
下面講的就是圍繞上面的7點(diǎn)展開說明:
1.上蘋果網(wǎng)站上面創(chuàng)建一個(gè)AppID,來綁定你項(xiàng)目里面的BundleID。
這個(gè)就是你得開發(fā)者賬號(hào),一般到公司工作,公司都會(huì)給你一個(gè)開發(fā)者賬號(hào)的。無就用公司的企業(yè)郵箱申請(qǐng)一個(gè)。
2.然后在自己的電腦上面生成一個(gè)SCR文件
3.上蘋果網(wǎng)站上面創(chuàng)建一張開發(fā)推送證書和發(fā)布推送證書(這兩張證書在創(chuàng)建的過程中會(huì)用到SCR文件)
3.1先申請(qǐng)項(xiàng)目描述文件。
往下拉
步驟2
AppID配置好之后就配置推送證書
4.兩張證書完成之后下載下來雙擊安裝。在鑰匙串里面可以看到已經(jīng)安裝的兩張證書。分別右擊導(dǎo)出p12文件。
5.上極光網(wǎng)站申請(qǐng)當(dāng)前項(xiàng)目的app應(yīng)用。把兩張證書填寫進(jìn)去。就ok了,會(huì)生成一個(gè)appKey.會(huì)用到項(xiàng)目里面去。
回到項(xiàng)目
6.在項(xiàng)目里面的設(shè)置兩個(gè)地方,都是打開推送的按鈕。具體看下面。
7.在AppDelegate里面寫代碼.
代碼
// 引入 JPush 功能所需頭文件 #import "JPUSHService.h"//20220110測(cè)試過只需要引入這個(gè)就可以了 /*iOS10 注冊(cè) APNs 所需頭文件 記得必須添加<UserNotifications/UserNotifications.h>,否則無法監(jiān)聽APNS 是蘋果內(nèi)推 極光推送的實(shí)際也是最后通過蘋果推送的.當(dāng)App啟動(dòng)a拿到deviceToken之后要把deviceToken傳到極光SDK.不然關(guān)屏或者前臺(tái)無法收到推送消息,因?yàn)檫@個(gè)消息是屬于蘋果推送的,*/ #ifdef NSFoundationVersionNumber_iOS_9_x_Max//20220110測(cè)試過可以不寫 #import <UserNotifications/UserNotifications.h>//20220110測(cè)試過可以不寫 #endif//20220110測(cè)試過可以不寫 // /* 好像沒有用 等待驗(yàn)證IDFA是蘋果官方唯一允許廣告獲取用戶的信息 這個(gè)暫時(shí)用不上如果需要使用 idfa 功能所需要引入的頭文件(可選)*/ #import <AdSupport/AdSupport.h>//20220110測(cè)試過可以不寫<JPUSHRegisterDelegate>didFinishLaunchingWithOptions代理方法寫一下的內(nèi)容//極光推送 JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];if (@available(iOS 12.0, *)) {entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound|JPAuthorizationOptionProvidesAppNotificationSettings;} else {// Fallback on earlier versions}if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {// 可以添加自定義 categories}[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];//apsForProduction :NO(測(cè)試開發(fā)環(huán)境) YES(生產(chǎn)環(huán)境)[JPUSHService setupWithOption:launchOptions appKey:@"000000000000000000" channel:@"AAA channel" apsForProduction:YES];//注冊(cè)遠(yuǎn)端消息通知獲取device token[application registerForRemoteNotifications];//保存registrationID 登錄成功上存到服務(wù)器[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {//記錄極光注冊(cè)ID[LoginUserInfo new].JPUSHRegistID = registrationID;}];/**在applicationWillEnterForeground方法(App即將進(jìn)入前臺(tái))中將小紅點(diǎn)清除*/ - (void)applicationWillEnterForeground:(UIApplication *)application {NSLog(@"進(jìn)入前臺(tái)");[UIApplication sharedApplication].applicationIconBadgeNumber = 0;[application cancelAllLocalNotifications]; }#pragma mark- JPUSHRegisterDelegate // iOS 12 Support 好像沒有用 等待驗(yàn)證 - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center openSettingsForNotification:(UNNotification *)notification API_AVAILABLE(ios(10.0)){if (notification && [notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {//從通知界面直接進(jìn)入應(yīng)用NSLog(@"從通知界面直接進(jìn)入應(yīng)用");}else{//從通知設(shè)置界面進(jìn)入應(yīng)用NSLog(@"從通知設(shè)置界面進(jìn)入應(yīng)用");} }// iOS 10 Support 1 當(dāng)前應(yīng)用進(jìn)來 - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler API_AVAILABLE(ios(10.0)){// RequiredNSDictionary * userInfo = notification.request.content.userInfo;if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {[JPUSHService handleRemoteNotification:userInfo];}[[JPushManager sharedManager] responseResult:userInfo];//全局勾選代理,需要自己子定義的// 需要執(zhí)行這個(gè)方法,選擇是否提醒用戶,有 Badge(標(biāo)記)、Sound(聲音)、Alert(彈窗現(xiàn)實(shí)5秒) 三種類型可以選擇設(shè)置completionHandler(UNNotificationPresentationOptionSound);//選擇聲音 因?yàn)槲矣米远x框 如果選擇Alert會(huì)重復(fù)a彈框 }// iOS 10 Support 2 解鎖屏幕進(jìn)來 - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)){// RequiredNSDictionary * userInfo = response.notification.request.content.userInfo;if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {[JPUSHService handleRemoteNotification:userInfo];}completionHandler(); // 系統(tǒng)要求執(zhí)行這個(gè)方法 }- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {//發(fā)送通知 感覺無用的這句話[[NSNotificationCenter defaultCenter] postNotificationName:@"showRedBadge" object:nil userInfo:userInfo];// Required, iOS 7 Support[JPUSHService handleRemoteNotification:userInfo];completionHandler(UIBackgroundFetchResultNewData);} - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {// Required,For systems with less than or equal to iOS6[JPUSHService handleRemoteNotification:userInfo]; }// 將得到的deviceToken傳給SDK /*溫馨提示:JPush 3.0.9 之前的版本,必須調(diào)用此接口,注冊(cè) token 之后才可以登錄極光,使用通知和自定義消息功能。從 JPush 3.0.9 版本開始,不調(diào)用此方法也可以登錄極光。但是不能使用 APNs 通知功能,只可以使用 JPush 自定義消息。*/ - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{[JPUSHService registerDeviceToken:deviceToken]; }問題1:
2019年新的配置畫面
配置開發(fā)證書
問題2:
遇到一個(gè)問題。就是測(cè)試的能夠推送,正式發(fā)布之后收不了推送.
首先說明一下,不管公司當(dāng)前是正式服還是測(cè)試服,凡是通過XCode寫進(jìn)手機(jī)的程序都是屬于開發(fā)模式。蘋果用的證書是開發(fā)證書
下面一個(gè)一個(gè)可能進(jìn)行排除
通過AppStore下載下來的程序,App用的是發(fā)布證書.
極光推送分兩種推送的,一種是測(cè)試時(shí)候用的開發(fā)模式(用于測(cè)試的推送).另一種是上架AppStore生產(chǎn)模式用的(正式發(fā)布),所以上架的時(shí)候需要注意下面apsForProduction的參數(shù)設(shè)置。
//apsForProduction :NO(測(cè)試開發(fā)環(huán)境) YES(生產(chǎn)環(huán)境) [JPUSHService setupWithOption:launchOptions appKey:@"000000000000000000000" channel:@"AAAAA channel" apsForProduction:YES]; 造成這次的原因主要是上面的問題,上架的時(shí)候記得改為YES。測(cè)試可以改為NO。然后用蒲公英測(cè)試再打包. 但是改了也是都不行。后來發(fā)現(xiàn)缺小了下面的一句話. // 將得到的deviceToken傳給SDK /*溫馨提示:JPush 3.0.9 之前的版本,必須調(diào)用此接口,注冊(cè) token 之后才可以登錄極光,使用通知和自定義消息功能。從 JPush 3.0.9 版本開始,不調(diào)用此方法也可以登錄極光。但是不能使用 APNs 通知功能,只可以使用 JPush 自定義消息。*/ - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{[JPUSHService registerDeviceToken:deviceToken]; }然后又改了注冊(cè)設(shè)置極光的代碼.
//極光推送 JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];if (@available(iOS 12.0, *)) {entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound|JPAuthorizationOptionProvidesAppNotificationSettings;} else {// Fallback on earlier versions}if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {// 可以添加自定義 categories}[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];//apsForProduction :NO(測(cè)試開發(fā)環(huán)境) YES(生產(chǎn)環(huán)境)[JPUSHService setupWithOption:launchOptions appKey:@"000000000000000000000000" channel:@"Publish channel" apsForProduction:YES];//注冊(cè)遠(yuǎn)端消息通知獲取device token[application registerForRemoteNotifications];//保存registrationID 登錄成功上存到服務(wù)器[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {//記錄極光注冊(cè)ID[LoginUserInfo new].JPUSHRegistID = registrationID;}];退出極光登錄 用于指定用戶推送的
[JPUSHService deleteAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) {NSLog(@"極光推送別名退出 rescode: %ld, \ntags: %@, \nalias: %@\n", (long)iResCode, @"tag" , iAlias); }然后有升級(jí)了極光最新的版本.
pod update
pod install
下面的證書要一一對(duì)應(yīng)
如果有問題可以看看蘋果官網(wǎng)上的項(xiàng)目是否配置證書
項(xiàng)目對(duì)應(yīng)選擇的證書
檢查電腦安裝項(xiàng)目的推送證書并且還沒有過期
極光推動(dòng)驗(yàn)證通過
關(guān)于網(wǎng)上設(shè)置可以訪問http的問題
開啟極光推送
問題3:如何使用別名指定推送
使用指定別名推送 可能是后臺(tái)做的 因?yàn)檎也坏絺魉褪謾C(jī)號(hào)碼的代碼 我別名發(fā)送拿貨的項(xiàng)目是寫手機(jī)號(hào)碼就可以了,但無發(fā)現(xiàn)前端傳送過手機(jī)號(hào)碼,應(yīng)該是后臺(tái)寫的, 看看下面的代碼行不行 但拿貨的項(xiàng)目沒有寫過這樣的話。
寫在登錄按鍵的地方
手動(dòng)集成極光推送
手動(dòng)集成視頻
我已經(jīng)把極光的SDK需要的文件已經(jīng)打包好了,直接下載拖進(jìn)項(xiàng)目里面就可以了:https://download.csdn.net/download/weixin_38716347/75223834
1.官網(wǎng)的對(duì)接網(wǎng)站:https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new/
2.對(duì)接之前首先先把SDK下載下來:https://docs.jiguang.cn/jpush/resources/
把它復(fù)制出來放到項(xiàng)目里面,例如:看下面的圖片
3.添加添加 Framework
CFNetwork.framework CoreFoundation.framework CoreTelephony.framework SystemConfiguration.framework CoreGraphics.framework Foundation.framework UIKit.framework Security.framework libz.tbd UserNotifications.framework libresolv.tbd WebKit.framework StoreKit.framework4.打開對(duì)應(yīng)的功能
5.在info.plist里面進(jìn)行設(shè)置
這樣子手動(dòng)集成就完成了。
極光控制臺(tái)上面推送消息
首先先登錄極光官網(wǎng),賬號(hào)密碼在iOS文件里面有,然后按照下面的步驟一步一步來就可以了。
這樣子的話,發(fā)送出去,手機(jī)就能夠收到消息了。
問題4:如何指定推送
在代碼里面需要在didFinishLaunchingWithOptions調(diào)用下面的方法拿到registrationID。
//保存registrationID 登錄成功上存到服務(wù)器 [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {//記錄極光注冊(cè)IDNSLog(@"registrationID: %@",registrationID); }];
回到極光的控制臺(tái),把拿到的注冊(cè)ID填進(jìn)去就可以針對(duì)用戶推送了。
這樣子也能夠針對(duì)個(gè)人推送成功的。
我們拿到的這個(gè)registrationID需要把它上存到后臺(tái)里面的,然后后臺(tái)會(huì)把我們的用戶信息綁定起來,例如跟手機(jī)號(hào)碼捆綁在一起的,到時(shí)候我們可以通過手機(jī)號(hào)碼指定推送給用戶,到時(shí)候我們用手機(jī)號(hào)碼推送給用戶的時(shí)候需要在下面的框里面去寫
關(guān)于別名推送在問題三也有體過的。
總結(jié)
以上是生活随笔為你收集整理的OC 教程 极光推送的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 4.15 rc7,Linux
- 下一篇: node --- 游走在客户端和服务器