App被失活状态的时候可以走苹果的APNS;但是在活跃的时候却接受不到推送!

那就用到本地推送:UILocalNotification 消息神器。

处理不好可能会有很多本地推送到来,那么问题来了要在什么地方去注册通知?什么地方去移除通知?

一、要在什么地方去注册通知

- (void)applicationDidEnterBackground:(UIApplication *)application;

手机刚进入后台会走的方法,applicationDidEnterBackground;

我会注册一个通知:名字宏定义

/**应用获取到刷新推送消息提醒*/

#define kString_NSNotificationCenterRefreshMessageData    @"kString_NSNotificationCenterRefreshMessageData"

在AppDelegate.m的 applicationDidEnterBackground方法里边添加通知

- (void)applicationDidEnterBackground:(UIApplication *)application{

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(messageCome:) name:kString_NSNotificationCenterRefreshMessageData object:nil];

}

- (void)messageCome:(NSNotification *)notifi{

if (![notifi.name isEqualToString:kString_NSNotificationCenterRefreshMessageData]) {

return;

}

dispatch_async(dispatch_get_main_queue(), ^{

[self notifi:notifi];

});

}

- (void)notifi:(NSNotification *)notifi{

NSMutableString * notifiMessage = nil;

RCMessage *message = notifi.object;

if (message.conversationType == ConversationType_SYSTEM) {

notifiMessage = [[NSMutableString alloc]initWithString: @"猎上网:"];

}else if(message.conversationType == ConversationType_PRIVATE){

MessageUser *user =  [[MyFMDB sharedMyFMDB] findUserWithID:[message.senderUserId intValue]];

if (user.name&&![user.name isEqualToString:@""]) {

notifiMessage = [[NSMutableString alloc]initWithString: [NSString stringWithFormat:@"%@:",user.name]];

}

}else{

return;

}

NSMutableDictionary * inforDic = [NSMutableDictionary dictionary];

UILocalNotification * locNoti = [[UILocalNotification alloc]init];

if ([message.content isKindOfClass:[RCTextMessage class]]) {

RCTextMessage *textMessage = (RCTextMessage *)message.content;

[notifiMessage appendString:textMessage.content];

[inforDic setValue:textMessage.content forKey:@"name"];

}else if([message.content isKindOfClass:[RCImageMessage class]]){

[notifiMessage appendString:@"图片"];

[inforDic setValue:@"图片" forKey:@"name"];

}else if([message.content isKindOfClass:[RCVoiceMessage class]]){

[notifiMessage appendString:@"语音"];

[inforDic setValue:@"语音" forKey:@"name"];

}else if([message.content isKindOfClass:[IMPositionMessage class]]){

[notifiMessage appendString:@"职位名片"];

[inforDic setValue:@"职位名片" forKey:@"name"];

}else if([message.content isKindOfClass:[IMSwapPhoneMessage class]]){

[notifiMessage appendString:@"交换电话"];

[inforDic setValue:@"交换电话" forKey:@"name"];

}else if([message.content isKindOfClass:[IMResumeMessage class]]){

[notifiMessage appendString:@"简历名片"];

[inforDic setValue:@"简历名片" forKey:@"name"];

}else if([message.content isKindOfClass:[TaskedPositionToHunteron class]]){

TaskedPositionToHunteron *textMessage = (TaskedPositionToHunteron *)message.content;

[notifiMessage appendString:[NSString stringWithFormat:@"PA(%@)为您定向推荐了一个新的职位( #%lld %@)。",textMessage.paName,textMessage.positionId,textMessage.positionName]];

[inforDic setValue:textMessage.paName forKey:@"paName"];

[inforDic setValue:[NSString stringWithFormat:@"%lld",textMessage.positionId]  forKey:@"positionId"];

[inforDic setValue:textMessage.positionName forKey:@"positionName"];

}

//1.1 设置通知的内容

locNoti.alertAction = notifiMessage; // 锁屏状态下显示: 滑动来快点啊

locNoti.alertBody = notifiMessage;

//1.2 设置通知的发送时间

locNoti.fireDate = [NSDate date];

locNoti.userInfo =inforDic;

//1.3 设置时区,一般默认

locNoti.timeZone = [NSTimeZone defaultTimeZone];

// 设置通知发送时, 提醒数字(==0, 会自动消失)

locNoti.applicationIconBadgeNumber = 0;

locNoti.repeatInterval = 0;

// 2. 发送通知

[[UIApplication sharedApplication]scheduleLocalNotification:locNoti];

NSLog(@"====%d",[NSThread isMainThread]);

[[UIApplication sharedApplication]cancelLocalNotification:locNoti];

}

二、什么地方去移除通知

手机刚进入前台会走的方法

- (void)applicationWillEnterForeground:(UIApplication *)application{

[[NSNotificationCenter defaultCenter] removeObserver:self name:kString_NSNotificationCenterRefreshMessageData object:nil];

}

因为手机不活跃的时候不能立即发通知!记住是立即,又不是延迟发本地推送,所以不需要处理已经不活跃的情况!要在进入前台的时候移除通知,要不然下次在进入后台会在此注册通知!就会显示两条本地推送!

IM-iOS退出后台接受消息,app退出后台能接收到推送的更多相关文章

  1. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

  2. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  3. 转:C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...

  4. iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

    iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件 iOS高仿微信完整项目源码 想要更简单的推送消息,看本文就对了 ScrollView嵌套ScrolloView解决方 ...

  5. C#微信公众号开发系列教程(接收事件推送与消息排重)

    微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中.类似于pc端网站的注册.可 ...

  6. iOS Xcode 8 打包上架 配置文件问题 此构建版本无效 推送问题 攻克 刚刚 waiting for review

    煎熬...  本来xcode 7 打包正在审核了 还要修改一处购买问题  此时 xcode已经升级到xcode 8 了 升级后 很神奇 应用没报错 很好的运行 (网上很多说xib storyboard ...

  7. ios APP进程杀死之后和APP在后台接收到推送点击跳转到任意界面处理

    https://www.jianshu.com/p/ce0dc53eb627 https://www.cnblogs.com/er-dai-ma-nong/p/5584724.html github: ...

  8. iOS开发——消息推送跳转

    项目开发用集成是极光推送JPush     这里主要是消息推送过来处理对应界面跳转          同时看到两篇写的不错的相关博客分享一下:      http://www.jianshu.com/ ...

  9. iOS刚进入后台接受推送、打开推送调转到相应的界面

    刚进入后台的时候消息处理时候我用了本地推送!可以看我前边写的博客,怎么处理刚进入后台接收推送的案例,链接 /** 注释:打开推送的三种方式:-peter 1.apns的时候,结束进程退出后台:启动的时 ...

随机推荐

  1. 老男孩Python全栈开发(92天全)视频教程 自学笔记15

    day15课程内容: 高阶函数 1.函数名可以进行赋值 2.函数名可以作为参数,也可以作为函数的返回值 def f(): print("高阶函数")def bar(a,b,c): ...

  2. PAT Public Bike Management (dfs)

    思路:你的答案必须满足三个条件: 1.在所有路径中选择最短的: 2.如果路径相等,则选择从PBMC中送出最少的: 3.如果路径相等且PBMC送出的车也相等,则选择带回最少的. 注意:这题很恶心,你要考 ...

  3. UVA - 1371 Period 二分+dp

    思路:设字符串x的长度为n,y的长度为m,那么答案一定在[0, m]之间,那么可以二分求答案. d(i, j)表示第一个串前i个字符至少需要经过多少次才能的到第二个串的前j个字符,转移方程d(i, j ...

  4. Luogu P2888 [USACO07NOV]牛栏Cow Hurdles

    题目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gan ...

  5. hadoop配置遇到问题的解决

    1. ssh localhost: 不能登陆:将错误提示中的文件全部删除.原因:登陆过远程主机 2. 问题: 伪分布式datanode启动不了:在datanode的log日志文件出现以下错误提示:   ...

  6. iOS 开发之内存泄漏问题

    关于内存泄漏问题,一般情况下就是控制器或者视图没有正常的释放引起的,我们通常可以通过dealloc方法来检查一个控制器或者视图是否释放. 对于一个控制器或者视图没有释放,其实也就是还有强引用引用着这个 ...

  7. linux memcached Session共享

    memcached memcached是高性能的分布式缓存服务器用来集中缓存数据库查询结果,减少数据库访问次数提高动态web应用的响应速度 传统web架构的问题许多web应用都将数据保存在RDBMS中 ...

  8. java I/O框架 (一)总览

    一.前言 java io框架非常庞大,各种功能的类让人目不暇接,为了系统学习io框架,搜集了各种资料,整理出这篇文章,尽可能详细的讲述java io框架,其中会牵扯到许多信息,不仅包括框架内各种类的方 ...

  9. 事件CEvent的使用 .

    CEvent类的一个对象,表示一个"事件"--一个允许一个事件发生时线程通知另一个线程的同步对象.在一个线程需要了解何时执行任务时,事件是十分有用的.例如,拷贝数据到数据文档时,线 ...

  10. RTSP协议分析

    RTSP 协议分析 1.概述:  RTSP(Real Time Streaming Protocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetw ...