iOS 后台通知栏收到消息,不执行回调方法或隔了好几分钟才走回调

jpush
ios
标签: #<Tag:0x00007fb849023df8> #<Tag:0x00007fb849023c18>

(寒窗点雪) #1

iOS 后台通知栏收到消息,不执行回调方法或隔了好几分钟才走回调,用了官方demo也是存在这个问题,麻烦大大解答一下


(12) #2

如果使用的是 background 消息,阅读并检查


(寒窗点雪) #3

大大,这个我已经阅读过了,而且也是照着配置了,也是用了官方最新的demo试过,都是会存在这个问题,测试好几天了。有时是已推送就有执行了回调,但是经常收到了消息,隔很久都不执行回调方法


(12) #4

1、说明你的 SDK 版本,你的手机系统和机型

2、你测试得到的客户端日志信息,收到消息的实际和执行回调的时间

3、具体是哪一个回调


(寒窗点雪) #5

1、SDK 版本是3.1.1 release版本 手机有:iPhone7P(11.3)、iPhone 5C(8.4)
2、因为我用的是发布版,信息很难拿到哦,就是收到了消息有时不执行回调,有时隔4、5分钟才回调
3、不执行回调的方法(这四个方法我都语音播报了,但是很大概率都是不执行的):

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo {
  [JPUSHService handleRemoteNotification:userInfo];
  NSLog(@"iOS6及以下系统,收到通知:%@", [self logDic:userInfo]);
  [rootViewController addNotificationCount];
  [self say:userInfo];
}

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
          fetchCompletionHandler:
              (void (^)(UIBackgroundFetchResult))completionHandler {
  [JPUSHService handleRemoteNotification:userInfo];
  NSLog(@"iOS7及以上系统,收到通知:%@", [self logDic:userInfo]);
  
  if ([[UIDevice currentDevice].systemVersion floatValue]<10.0 || application.applicationState>0) {
    [rootViewController addNotificationCount];
    [self say:userInfo];
  }
  completionHandler(UIBackgroundFetchResultNewData);
  
}

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
  NSDictionary * userInfo = notification.request.content.userInfo;
  
  UNNotificationRequest *request = notification.request; // 收到推送的请求
  UNNotificationContent *content = request.content; // 收到推送的消息内容
  
  NSNumber *badge = content.badge;  // 推送消息的角标
  NSString *body = content.body;    // 推送消息体
  UNNotificationSound *sound = content.sound;  // 推送消息的声音
  NSString *subtitle = content.subtitle;  // 推送消息的副标题
  NSString *title = content.title;  // 推送消息的标题
  
  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
    NSLog(@"iOS10 前台收到远程通知:%@", [self logDic:userInfo]);

    [rootViewController addNotificationCount];
    [self say:userInfo];
  }
  else {
    // 判断为本地通知
    NSLog(@"iOS10 前台收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo);
  }
  completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置
}

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
  
  NSDictionary * userInfo = response.notification.request.content.userInfo;
  UNNotificationRequest *request = response.notification.request; // 收到推送的请求
  UNNotificationContent *content = request.content; // 收到推送的消息内容
  
  NSNumber *badge = content.badge;  // 推送消息的角标
  NSString *body = content.body;    // 推送消息体
  UNNotificationSound *sound = content.sound;  // 推送消息的声音
  NSString *subtitle = content.subtitle;  // 推送消息的副标题
  NSString *title = content.title;  // 推送消息的标题
  
  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
    NSLog(@"iOS10 收到远程通知:%@", [self logDic:userInfo]);
    [rootViewController addNotificationCount];
    [self say:userInfo];
  }
  else {
    // 判断为本地通知
    NSLog(@"iOS10 收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo);
  }
  
  completionHandler();  // 系统要求执行这个方法
}

4、我在后台能正确收到推送的消息,说明我应该配置的东西都是对的吧?应该registrationID和msgid是没有问题吧?但是偶尔或者很大概率不走以上所有的回调方法【iPhone7P(11.3)不走回调的概率比iPhone 5C(8.4)大】,有时前面几条走了回调,但是后面又不走了,或者会延迟很久才走