個推遇到的問題記錄

公司集成的個推推送,在處理推送消息的時候遇到了一些問題,在此記錄一下,以防犯同樣的錯誤。剛開始沒有搞懂接到推送后所要走的方法,以至于處理的時候走了很長時間的彎路。
下面分以下三種情況來處理:

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,這個情況很莫名奇妙,我還沒搞懂,不過由于我們推送消息的間隔比較長,在線時一般不會收到多個,就暫時這樣寫了,還沒想到比較好的辦法。
以上就是我自己在做個推的時候所遇到的問題,第一次寫這么長的文字,條理可能不太清晰,以后得多多練習。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,832評論 25 709
  • 概述 在多數(shù)移動應用中任何時候都只能有一個應用程序處于活躍狀態(tài),如果其他應用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,708評論 1 8
  • 極光推送: 1.JPush當前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,874評論 10 16
  • 附加題 1.一個新客人進店(拓客卡第一次到店),正確的接待流程。 答,首先進店以后先問好,然后就是在給顧客換鞋,然...
    花心偉爺閱讀 228評論 0 0
  • 不知道有多少人,分開后,仍說愛? 有些人,分了手,依然說著牽掛,仍還表現(xiàn)關心,你以為,你有多念舊,你...
    ?小小閱讀 608評論 2 0

友情鏈接更多精彩內容