今天朋友說到推送,因?yàn)橐郧耙矝]做過,就跟著看了看極光的推送.(自己的每一步,很詳細(xì),很啰嗦..大神就不用看了...)
2016-12-15更新了跳轉(zhuǎn)到指定頁面代碼--第二部分
我是直接用了我們自己的發(fā)布證書,在發(fā)布證書的基礎(chǔ)上做的推送證書,如果說還沒有做任何證書,或者準(zhǔn)備做測試證書使用的,可以點(diǎn)擊看極光的文檔一步步做,其中雖然有部分不同,但大致方向還是對的.證書配置鏈接
1.設(shè)置推送證書
1-1
選擇對應(yīng)的app,如果之前沒有推送證書的話,Push 那一欄應(yīng)該是灰的.然后點(diǎn)擊Edit
1-2
這里和我的可能不一樣,開發(fā)環(huán)境選上面的,生產(chǎn)環(huán)境就點(diǎn)下面的.點(diǎn)擊Create Certificate.
1-3
continue;
1-4
這里需要在自己電腦上做一個CSR證書.
打開電腦的鑰匙串訪問
1-5
1-6
郵件地址,常用名稱隨便填,然后選擇存儲到磁盤,存到本地,在1-4里選擇,然后上傳給蘋果.
1-7
生產(chǎn)成功,下載到本地.雙擊打開.
2.生成P12,傳給極光
雙擊打開下載的證書
2-1
應(yīng)該是apple push 開頭的.右鍵,導(dǎo)出.
2-2
名字隨便起,盡量不用漢字.最后一項要選擇.p12.然后存儲好.(密碼隨便起一個,簡單點(diǎn),一會要用到)
3.在極光創(chuàng)建應(yīng)用,上傳p12文件.融SDK.
3-1
因?yàn)槲抑蛔隽松a(chǎn)證書,沒有用開發(fā)證書,所以選擇ios生產(chǎn)證書,把剛生產(chǎn)的p12,上傳,密碼就填剛剛的密碼.然后創(chuàng)建.
下載極光的SDK極光SDK下載地址
解壓之后只需要lib內(nèi)東西,將整個lib拖動到項目內(nèi)
3-2
記得要選groups啊!!!
然后入一堆庫:
CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
Xcode7需要的是libz.tbd想暗;Xcode7以下版本是libz.dylib
Adsupport.framework (獲取IDFA需要;如果不使用IDFA债鸡,請不要添加)
然后在AppDelegate入口類里進(jìn)行注冊.(我自己寫了一個方法,記得要調(diào)用啊....)
import"JPUSHService.h"
3-3
advertisingId這個我換了,極光的代碼里的報錯了直接,我用自己找的方法,反正就是個唯一標(biāo)識.
最后的方法里,Option:后面我寫的nil,因?yàn)槲臋n里也沒接受,不知道是什么意思,(反正寫nil也能用).
appKey是在極光創(chuàng)建應(yīng)用之后極光給的.填自己的就行了.channel:0是開發(fā)證書,1是生產(chǎn).我的發(fā)布選1.apsForProduction:是否生產(chǎn)環(huán)境.我的是yes.
后面還有幾個代理方法,代碼(簡書省略掉了很多空格....最后還是要記得調(diào)用jPush方法啊....):
pragma mark -極光推送
-(void)jPush
{
NSString*advertisingId = [[UIDevicecurrentDevice].identifierForVendorUUIDString];
//Required
if([[UIDevicecurrentDevice].systemVersionfloatValue] >=8.0) {
//可以添加自定義categories
[JPUSHServiceregisterForRemoteNotificationTypes:(UIUserNotificationTypeBadge|
UIUserNotificationTypeSound|
UIUserNotificationTypeAlert)
categories:nil];
}else{
//categories必須為nil
[JPUSHServiceregisterForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeSound|
UIRemoteNotificationTypeAlert)
categories:nil];
}
//Required
//如需繼續(xù)使用pushConfig.plist文件聲明appKey等配置內(nèi)容江滨,請依舊使用[JPUSHService setupWithOption:launchOptions]方式初始化敷钾。
[JPUSHServicesetupWithOption:nilappKey:@"你自己的APPKEY"
channel:@"1"
apsForProduction:YES
advertisingIdentifier:advertisingId];
}
- (void)application:(UIApplication)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData)deviceToken {
/// Required -注冊DeviceToken
[JPUSHServiceregisterDeviceToken:deviceToken];
} - (void)application:(UIApplication)application didReceiveRemoteNotification:(NSDictionary)userInfo {
// Required,For systems with less than or equal to iOS6
[JPUSHServicehandleRemoteNotification:userInfo];
} - (void)application:(UIApplication)application didReceiveRemoteNotification:(NSDictionary)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler {
// IOS 7 Support Required
[JPUSHServicehandleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
} - (void)application:(UIApplication)application didFailToRegisterForRemoteNotificationsWithError:(NSError)error {
//Optional
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
4.真機(jī)運(yùn)行
在真機(jī)上運(yùn)行,沒有問題的話,就到極光官網(wǎng)上發(fā)送一個推送,向全體人發(fā)的...測試了一下,看下最后效果
4-1
-----------------------補(bǔ)充-------------------------
Xcode8之后還要有一步
5-1
這個push要打開,否則會獲取不到deviceToken;
/-----------------第二部分---推送到指定頁面------------------/#
1.首先是創(chuàng)建了開發(fā)者證書(因?yàn)橹拔抑苯酉茸龅陌l(fā)布證書),步驟和前面的發(fā)布證書的創(chuàng)建是一樣的.
2.創(chuàng)建完成下載到本地,然后生成p12傳給極光,步驟也和上面是一樣的.
3.在appdelegate里注冊極光的時候之前有一個是YES,暫時要先改為NO,因?yàn)橐日{(diào)試,最后上架前再改回來,如圖
2-3-1
然后連接真機(jī),運(yùn)行下你的程序,極光會打印出來log,會有真機(jī)的id,這個用于你后續(xù)的調(diào)試.
2-3-2
記住這個ID,然后在極光推送中心填寫真機(jī)ID,測試下是否真的只發(fā)送到你的手機(jī)推送,如圖.成功后才能繼續(xù).
2-3-3
4.在appdelegate里有兩個方法
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{
//1號方法
/**---當(dāng)app在后臺或者被關(guān)閉時,發(fā)送推送會調(diào)用這個方法(不確定)----*/
// Required,For systems with less than or equal to iOS6
[JPUSHService handleRemoteNotification:userInfo];
if (application.applicationState == UIApplicationStateActive)
{
NSDictionary *aps = userInfo[@"aps"];
NSString *newstitle = aps[@"alert"];
//這里寫APP正在運(yùn)行時菌赖,推送過來消息的處理
UIAlertView *al = [[UIAlertView alloc]initWithTitle:@"新消息" message:newstitle delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"查看", nil];
al.tag = 100;
[al show];
} else if (application.applicationState == UIApplicationStateInactive ) {
//APP在后臺運(yùn)行,推送過來消息的處理
[self goToMssageViewControllerWith:userInfo];
} else if (application.applicationState == UIApplicationStateBackground) {
//APP沒有運(yùn)行域携,推送過來消息的處理
[self goToMssageViewControllerWith:userInfo];
}
}
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler
{
//2號方法
/**---當(dāng)app在運(yùn)行時,發(fā)送推送會調(diào)用這個方法(不確定)----*/
// IOS 7 Support Required
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
if (application.applicationState == UIApplicationStateActive)
{
NSDictionary *aps = userInfo[@"aps"];
NSString *newstitle = aps[@"alert"];
//這里寫APP正在運(yùn)行時棺弊,推送過來消息的處理
UIAlertView *al = [[UIAlertView alloc]initWithTitle:@"新消息" message:newstitle delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"查看", nil];
al.tag = 100;
[al show];
} else if (application.applicationState == UIApplicationStateInactive ) {
//APP在后臺運(yùn)行晶密,推送過來消息的處理
[self goToMssageViewControllerWith:userInfo];
} else if (application.applicationState == UIApplicationStateBackground) {
//APP沒有運(yùn)行,推送過來消息的處理
[self goToMssageViewControllerWith:userInfo];
}
}
這里特別說明一下,我在方法1和方法2里將三種情況都寫了,但實(shí)際上我在網(wǎng)上搜到的是方法1適用于app運(yùn)行時調(diào)用,而我實(shí)際測試正好與搜到的相反,所有我將兩種方法里各個情況都寫上了,到底如何你可以自己試試##
5.gotomessage的方法
//跳轉(zhuǎn)方法
- (void)goToMssageViewControllerWith:(NSDictionary*)msgDic
{
NSString *type = msgDic[@"type"];
if([type isEqualToString:@"news"])
{
/**---新聞---*/
NSString *newsId = msgDic[@"newsId"];
ZXNewDetailVC *fcdVC = [[ZXNewDetailVC alloc]init];
fcdVC.msgId = [NSString stringWithFormat:@"information/getBytype.html?id=%@",newsId];
[self.window.rootViewController presentViewController:fcdVC animated:YES completion:nil];
}
else
{
NSLog(@"others");
}
}
這里的type,news,newsId,都是我自己在發(fā)推送的時候定義的,你可以根據(jù)自己app的實(shí)際需要更改,建議先打印一下msgDic看一下數(shù)據(jù)機(jī)構(gòu).在發(fā)送的時候我的如圖所示,