公司集成的個推推送,在處理推送消息的時候遇到了一些問題,在此記錄一下,以防犯同樣的錯誤。剛開始沒有搞懂接到推送后所要走的方法,以至于處理的時候走了很長時間的彎路。
下面分以下三種情況來處理:
1. 應用在后臺:
應用在后臺時,用戶點擊通知欄查看推送消息時,走的方法是:
-(void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResultresult))completionHandler;
在此取出此條推送的詳細信息,并發(fā)送通知。
/** APP已經(jīng)接收到“遠程”通知(推送) - 透傳推送消息 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[application setApplicationIconBadgeNumber: 0]; // 標簽
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// 處理APN
NSString *payloadMsg = [userInfo objectForKey:@"payload"];
// [4]: 收到個推消息
//如果離線
if([payloadMsg rangeOfString:@"RValue"].length>0)
{
//透傳在線提示
NSDictionary *dict = [payloadMsg JSONValue];
[self savePayloadMsgToUserDefaultsWithDict:dict];
if ( application.applicationState == UIApplicationStateInactive) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationOff" object:nil];
}
}
completionHandler(UIBackgroundFetchResultNewData);
}
2.應用被殺死,未開啟的情況下:
當點擊通知欄推送消息時,因為要先啟動應用,會進
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
因為我的通知的觀察者是寫在首頁的,所以要等首頁加載完成之后,才能在AppDelegate里面發(fā)送通知。要不就進不到詳情頁。
當時就因為沒搞懂這個流程,搞得推送調試了好幾天都弄不好,各種方法都試過了,個推客服也被問的都不回我了...... 最后查了好久,還是這位大神的文檔幫助了我 http://www.itdecent.cn/p/69fd3dce35c2/comments/2117162
方法和大神寫的一樣,先把這條推送消息保存起來,在viewDidAppear里面發(fā)送了一個通知,在AppDelegate里面來接收,然后來處理推送消息,好進入詳情頁。
AppDelegate didFinishLaunchingWithOptions里我是這樣寫的
// 程序在死亡狀態(tài),啟動,收到推送通知,跳轉至對應頁面
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
// 緩存apns通知內容到本地
[[NSUserDefaults standardUserDefaults] setObject:userInfo forKey:@"payloadMsgDict"];
[[NSUserDefaults standardUserDefaults ]synchronize];
// 根據(jù)通知內容,跳轉至不同頁面的通知
[[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ā)送對推送消息處理,以此進入詳情頁的通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationOff" object:nil];
}
在首頁的
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear: animated];
// 應用由死亡狀態(tài)進入激活狀態(tài),這個時候發(fā)送通知,appdelegate接受通知,根據(jù)通知內容進行不同跳轉
NSDictionary * notificationUserInfo =[[NSUserDefaults standardUserDefaults] valueForKey:@"payloadMsgDict"];
if (notificationUserInfo) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"payloadDictAction" object:nil];
[[NSUserDefaults standardUserDefaults]setObject:nil forKey:@"payloadMsgDict"];
[[NSUserDefaults standardUserDefaults ]synchronize];
}
}
3.應用在前臺:
我是在個推的回調方法里面寫的,也就是因為這個方法,導致我走了好幾天的彎路... 其實到現(xià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)
{
//透傳在線提示
NSDictionary *dict = [payloadMsg JSONValue];
NSString *messageCode=[[[dict objectForKey:@"RValue"] valueForKey:@"Code"] objectAtIndex:0];
//對messaCode類型進行判斷,此為我們的功能需求
[[NSNotificationCenter defaultCenter]postNotificationName:@"notificationOn" object:nil];
}
}
因為在打開應用的時候,之前收到的有多少條推送消息,這個方法就走多少次,所以若離線消息的處理寫到這里會連續(xù)打開多次詳情頁,用戶體驗會很不好。于是我就沒有在offLine的情況下處理。
在線消息的處理是彈出一個alertView。同理在線時若同一時間段推多個也會重復彈出多個alertView,這個情況很莫名奇妙,我還沒搞懂,不過由于我們推送消息的間隔比較長,在線時一般不會收到多個,就暫時這樣寫了,還沒想到比較好的辦法。
以上就是我自己在做個推的時候所遇到的問題,第一次寫這么長的文字,條理可能不太清晰,以后得多多練習。