公司集成的個(gè)推推送旬蟋,在處理推送消息的時(shí)候遇到了一些問題,在此記錄一下巾陕,以防犯同樣的錯(cuò)誤终抽。剛開始沒有搞懂接到推送后所要走的方法,以至于處理的時(shí)候走了很長(zhǎng)時(shí)間的彎路蛛倦。
下面分以下三種情況來處理:
1. 應(yīng)用在后臺(tái):
應(yīng)用在后臺(tái)時(shí),用戶點(diǎn)擊通知欄查看推送消息時(shí)啦桌,走的方法是:
-(void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResultresult))completionHandler;
在此取出此條推送的詳細(xì)信息溯壶,并發(fā)送通知。
/** APP已經(jīng)接收到“遠(yuǎn)程”通知(推送) - 透?jìng)魍扑拖? */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[application setApplicationIconBadgeNumber: 0]; // 標(biāo)簽
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// 處理APN
NSString *payloadMsg = [userInfo objectForKey:@"payload"];
// [4]: 收到個(gè)推消息
//如果離線
if([payloadMsg rangeOfString:@"RValue"].length>0)
{
//透?jìng)髟诰€提示
NSDictionary *dict = [payloadMsg JSONValue];
[self savePayloadMsgToUserDefaultsWithDict:dict];
if ( application.applicationState == UIApplicationStateInactive) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationOff" object:nil];
}
}
completionHandler(UIBackgroundFetchResultNewData);
}
2.應(yīng)用被殺死甫男,未開啟的情況下:
當(dāng)點(diǎn)擊通知欄推送消息時(shí)且改,因?yàn)橐葐?dòng)應(yīng)用,會(huì)進(jìn)
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
因?yàn)槲业耐ㄖ挠^察者是寫在首頁的板驳,所以要等首頁加載完成之后又跛,才能在AppDelegate里面發(fā)送通知。要不就進(jìn)不到詳情頁若治。
當(dāng)時(shí)就因?yàn)闆]搞懂這個(gè)流程慨蓝,搞得推送調(diào)試了好幾天都弄不好,各種方法都試過了端幼,個(gè)推客服也被問的都不回我了...... 最后查了好久礼烈,還是這位大神的文檔幫助了我 http://www.reibang.com/p/69fd3dce35c2/comments/2117162
方法和大神寫的一樣,先把這條推送消息保存起來婆跑,在viewDidAppear里面發(fā)送了一個(gè)通知此熬,在AppDelegate里面來接收,然后來處理推送消息滑进,好進(jìn)入詳情頁犀忱。
AppDelegate didFinishLaunchingWithOptions里我是這樣寫的
// 程序在死亡狀態(tài),啟動(dòng)扶关,收到推送通知阴汇,跳轉(zhuǎn)至對(duì)應(yīng)頁面
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
// 緩存apns通知內(nèi)容到本地
[[NSUserDefaults standardUserDefaults] setObject:userInfo forKey:@"payloadMsgDict"];
[[NSUserDefaults standardUserDefaults ]synchronize];
// 根據(jù)通知內(nèi)容,跳轉(zhuǎn)至不同頁面的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jumpToDetailVC) name:@"payloadDictAction" object:nil];
}
- (void)jumpToDetailVC
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *dict = [defaults objectForKey:@"payloadMsgDict"];
NSString *payloadMsg = [dict objectForKey:@"payload"];
if([payloadMsg rangeOfString:@"RValue"].length>0)
{
//取出返回的推送信息
NSDictionary *dict = [payloadMsg JSONValue];
//保存字典里的字段
[self savePayloadMsgToUserDefaultsWithDict:dict];
}
//發(fā)送對(duì)推送消息處理驮审,以此進(jìn)入詳情頁的通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationOff" object:nil];
}
在首頁的
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear: animated];
// 應(yīng)用由死亡狀態(tài)進(jìn)入激活狀態(tài)鲫寄,這個(gè)時(shí)候發(fā)送通知,appdelegate接受通知疯淫,根據(jù)通知內(nèi)容進(jìn)行不同跳轉(zhuǎn)
NSDictionary * notificationUserInfo =[[NSUserDefaults standardUserDefaults] valueForKey:@"payloadMsgDict"];
if (notificationUserInfo) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"payloadDictAction" object:nil];
[[NSUserDefaults standardUserDefaults]setObject:nil forKey:@"payloadMsgDict"];
[[NSUserDefaults standardUserDefaults ]synchronize];
}
}
3.應(yīng)用在前臺(tái):
我是在個(gè)推的回調(diào)方法里面寫的地来,也就是因?yàn)檫@個(gè)方法,導(dǎo)致我走了好幾天的彎路... 其實(shí)到現(xiàn)在我還沒搞懂這個(gè)方法的用處主要是什么熙掺,有知道的大神還請(qǐng)幫我指點(diǎn)一下未斑。
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId{
NSString *payloadMsg = nil;
if (payloadData) {
payloadMsg = [[NSString alloc]initWithBytes:payloadData.bytes length:payloadData.length encoding:NSUTF8StringEncoding];
}
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (offLine) {
}else{
if([payloadMsg rangeOfString:@"RValue"].length>0)
{
//透?jìng)髟诰€提示
NSDictionary *dict = [payloadMsg JSONValue];
NSString *messageCode=[[[dict objectForKey:@"RValue"] valueForKey:@"Code"] objectAtIndex:0];
//對(duì)messaCode類型進(jìn)行判斷,此為我們的功能需求
[[NSNotificationCenter defaultCenter]postNotificationName:@"notificationOn" object:nil];
}
}
因?yàn)樵诖蜷_應(yīng)用的時(shí)候币绩,之前收到的有多少條推送消息蜡秽,這個(gè)方法就走多少次府阀,所以若離線消息的處理寫到這里會(huì)連續(xù)打開多次詳情頁,用戶體驗(yàn)會(huì)很不好芽突。于是我就沒有在offLine的情況下處理试浙。
在線消息的處理是彈出一個(gè)alertView。同理在線時(shí)若同一時(shí)間段推多個(gè)也會(huì)重復(fù)彈出多個(gè)alertView,這個(gè)情況很莫名奇妙寞蚌,我還沒搞懂田巴,不過由于我們推送消息的間隔比較長(zhǎng),在線時(shí)一般不會(huì)收到多個(gè)挟秤,就暫時(shí)這樣寫了壹哺,還沒想到比較好的辦法。
以上就是我自己在做個(gè)推的時(shí)候所遇到的問題艘刚,第一次寫這么長(zhǎng)的文字管宵,條理可能不太清晰,以后得多多練習(xí)攀甚。