iOS开发2017---推送通知

对于推送,不管是我们开发人员还是用户,都是又爱又恨,特别是iOS的推送苹果爸爸几乎每出一个版本的iOS系统都要给他一两斧子,以改善用户体验和安全性,因为东西实在又多又杂,所以我只说说我们常用到的一些东西。

推送无外乎就两个,一个是本地推送,一个是远程推送,但是二者其实是相互依存的。

我们做出来的时候,还要特别注意第三个东西,那就是APP的状态:

UIApplicationStateActive,// 激活状态,用户正在使用

AppUIApplicationStateInactive,// 待激活状态,即用户切换到其他App、按Home键回到桌面、拉下通知中心

UIApplicationStateBackground// 在后台运行

其实,还有一个更棘手的状态,那就是app被杀死的状态,文章末尾我将说到。

本地推送一般和APP的UIApplicationStateBackground这个状态密切相关,其他状态要么没有多大必要,要么接收不到(杀手状态),在收到远程推送后,先判断状态:

switch (state) {

     case UIApplicationStateActive:{}//可以播放声音震动提示

    break;

    case UIApplicationStateInactive:{}//可以播放声音震动提示

   break;

   case UIApplicationStateBackground:{

        [self showNotificationLocalNotification];//生成本地推送

   }

   break;

   default:

   break;

}

本地推送到了iOS10,有很大的改动,所以要判断是否是iOS10:

- (void)showNotificationWithMessage:(EMMessage *)message

{

//接连推送判断

NSTimeInterval timeInterval = [[NSDate date] timeIntervalSinceDate:self.lastPlaySoundDate];

BOOL playSound = NO;

if (!self.lastPlaySoundDate || timeInterval >= kDefaultPlaySoundInterval) {

self.lastPlaySoundDate = [NSDate date];

playSound = YES;

}

NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];

[userInfo setObject:@"xxx" forKey:@"key"];

if (IOS10) {

//发送本地推送

if (NSClassFromString(@"UNUserNotificationCenter")) {

UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.01 repeats:NO];

UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];

if (playSound) {

content.sound = [UNNotificationSound defaultSound];

}

content.body =alertBody;

content.userInfo = userInfo;

UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:message.messageId content:content trigger:trigger];

[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:nil];

}

else {

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

notification.fireDate = [NSDate date]; //触发通知的时间

NSString *title = message.ext[kChatUserNick];

}

}

notification.alertBody =[NSString stringWithFormat:@"%@:%@", title, messageStr];;

notification.alertAction = NSLocalizedString(@"open", @"Open");

notification.timeZone = [NSTimeZone defaultTimeZone];

if (playSound) {

notification.soundName = UILocalNotificationDefaultSoundName;

}

notification.userInfo = userInfo;

//发送通知

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

}

UIApplication *application = [UIApplication sharedApplication];

application.applicationIconBadgeNumber += 1;

}  else {//iOS10 以下

//发送本地推送

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

notification.fireDate = [NSDate date]; //触发通知的时间

notification.alertBody = @"xxxx";

notification.alertAction = @"打开";

notification.timeZone = [NSTimeZone defaultTimeZone];

notification.soundName = UILocalNotificationDefaultSoundName;

notification.userInfo = userInfo;

//发送通知

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

UIApplication *application = [UIApplication sharedApplication];

application.applicationIconBadgeNumber += 1;

}

}

以上是接到远程推送并发送本地推送的代码,很多童鞋会认为这是自定义推送,其实也可以这么理解,那么怎么接收到本地推送呢?

很简单,在AppDelegate里实现这个方法就OK:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

这个方法中你要放你接收到本地推送,用户点击后要处理的事情,比如跳转到某个指定页面,那么问题又来了,怎么跳转到指定页面呢?

这个问题就和你APP的架构密切相关了,我只说说我的思路

1.找到APP此时顶层的UIViewController

2.回到rootViewControlle

3.跳转至页面

当然,在APP杀死的状态下,你将只能收到远程推送,如果用户点击了通知,将进入下面的方法:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

注意,远程推送有一定的延迟。

最后说一个问题,希望有大神来指点迷津:

APP在绑定了推送之后,被用户卸载了,然后又重装了,也能收到推送,怎么破????目前发现微信也存在这个问题,真心求解!!!!


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容