今天终于有时间,好好整理远程推送的那些坑了。以下就是,我在做推送(极光推送为例)遇到的几个坑,希望大家能安利一下。(这是最近工作一个简单的总结,很想在后期找个一大把空闲的午后,好好反省下自己,都做了什么见不得人的事)
1坑:
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler(7.0后引进的方法,拥有多任务属性)会覆盖- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo (没有多任务特点)
*备注:两个方法不要同时用,两个同时存在,优先调用前者(前后台点击通知,会调用者两方法中一个)
2坑:
因为 RegistrationID 是 JPush SDK 注册完成之后才得到的,所以调用 SDK API 来获取 RegistrationID 的值时需要稍注意,不是总能够立即得到。(这有可能导致你推送出错)
建议:在监听到 kJPFNetworkDidLoginNotification 这个通知后的代码里,来获取 RegistrationID 的值。
3坑:
aps = {
alert = haunting;
badge = 1;
"content-available" = 1;
sound = default;
};
**注:除了alert可以为空,其他为空或者("content-available" = 0)会导致
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler(7.0后引进的方法,拥有多任务属性)该方法不走(楼主亲试)
第四个不算是坑:算是个友情提示:
//接收远程通知(iOS7.0后,允许在后台时刷新数据)
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"=======收到推送%@========",userInfo);
NSDictionary*APNSDic = [NSDictionarydictionary];
APNSDic = userInfo[@"aps"];
if(application
.applicationState==UIApplicationStateActive){
。。。。。。。。。。。
}
elseif(application
.applicationState==UIApplicationStateBackground){
if(userInfo) {
。。。。。。。。。。。。
}
}
//在此方法中一定要调用completionHandler这个回调,告诉系统是否处理成功
// UIBackgroundFetchResultNewData, //成功接收到数据
// UIBackgroundFetchResultNoData, //没有接收到数据
// UIBackgroundFetchResultFailed //接受失败
[JPUSHServicehandleRemoteNotification:userInfo];
if(userInfo) {
completionHandler(UIBackgroundFetchResultNewData);
}else{
completionHandler(UIBackgroundFetchResultNoData);
}
}
以上就是那些年我踩过的坑,望各位珍重!
当然只是开个玩笑,楼主希望与各位互相学习,共同进步!