推送通知

1、作用:让不在前台(后台或者关闭)的APP知道APP内部发生的事情

2、在“设置”——>“通知中心”-----> 可以关闭推送通知

3、发送推送通知时,如果程序运行在前台,推送通知就不会呈现。

4、点击推送通知会打开对应的app

5、不管应用程序出于后台还是被杀死,推送通知都会发出

一、本地推送通知
概念:由APP本身给应用程序推送消息,不需要服务器的支持
常见场景:记账软件/闹钟/定时提醒记账/番茄工作法/系统电池没电中提醒你时间等等
注意:不是非常常用。

1、发送本地推送

//点击按钮发送本地通知
- (IBAction)fireLocalNoti {//无论程序在前台、后台、退出了,都可以接收到本地通知//1.创建本地通知UILocalNotification *localNote = [[UILocalNotification alloc] init];//2.设置通知显示的内容//2.1.设置通知发出的时间,即5秒后发出通知localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];//2.2.设置通知的内容localNote.alertBody = @"吃饭了吗?";//2.3.设置锁屏界面滑块下显示的文字localNote.alertAction = @"聊天";//2.4.决定alertAction是否生效localNote.hasAction = NO;//2.5.设置通知中心的标题localNote.alertTitle = @"一般是app的名字";//2.6.设置通知时的音效localNote.soundName = UILocalNotificationDefaultSoundName;//2.7.设置app右上角的数字localNote.applicationIconBadgeNumber = 10;//2.8.设置额外的信息,暂时没有用处localNote.userInfo = @{@"name":@"张三", @"age":@23};//2.9.本地通知的类型标志符,做快捷回复通知使用localNote.category = @"11";//2.10、通知重复调用的时间-->设置以后,则调度池不会自动销毁通知localNote.repeatInterval = NSCalendarUnitMinute;//3.调度通知,让通知在特定的时间发送本地通知,ios8.0以后才出现[[UIApplication sharedApplication] scheduleLocalNotification:localNote];//4、注册通知,ios8.0,请求用户权限的事情,如果只有一次,则在代码直接在代码处写,多次在appDelegate中写UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert categories:nil];[[UIApplication sharedApplication] registerUserNotificationSettings:settings];//5、获取本地通知,并删除重复通知//获取所有通知
//    NSArray *notifcationArr = [[UIApplication sharedApplication] scheduledLocalNotifications];
//    for (UILocalNotification *locationNoti in notifcationArr) {
//        //可以根据userInfo来删除某个通知
//        if (locationNoti.userInfo) {
//            [[UIApplication sharedApplication] cancelLocalNotification:locationNoti];
//        }
//    }
}- (IBAction)removeLocalNote {//关闭所有的通知[[UIApplication sharedApplication] cancelAllLocalNotifications];
}

2、在前台/后台接收到通知后进行跳转

//当(前台/后台)接收到一个本地通知时,会调用该方法
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{/***  UIApplicationStateActive  前台*  UIApplicationStateInactive  进入前台*  UIApplicationStateBackground  后台*/if(application.applicationState == UIApplicationStateActive){NSLog(@"在前台时,不要进行跳转;要么提示用户进行跳转");//当然也可以跳转到指定界面return;}//在后台进入前台时,跳转到某个固定的页面NSLog(@"根据%@跳转到一个固定的页面:%s", notification.userInfo, __func__);
}

3、在应用程序被杀死时,接收到本地推送通知后进行跳转

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {if([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0){//1.iOS8之后,如果想要发出通知(无论本地还是远程),必须先进行注册.(iOS8之前不需要)UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];[application registerUserNotificationSettings:setting];}else{//ios8.0之前的注册推送通知[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];}//如果应用程序被杀死了,但是任然要实现接收到通知进行跳转,则需要在此处实现跳转。因为程序被杀死后,接收到通知不会调用didReceiveLocalNotification方法。// 判断是否是通过点击通知打开了应用程序if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {// 跳转代码NSLog(@"接收到本地通知,跳转到一个固定的界面");}return YES;
}

4、本地推送快捷回复调用的方法

通过分类来实现

//无论程序在前台、后台、退出了,都可以接收到本地通知//1.创建本地通知UILocalNotification *localNote = [[UILocalNotification alloc] init];//2.9.本地通知的类型标志符localNote.category = @"category";
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {//1、创建本地推送通知分类UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];//2、设置标志符category.identifier = @"category";//3、设置前台按钮UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];action1.identifier = @"qiantai";//3.1、设置前台按钮模式action1.activationMode = UIUserNotificationActivationModeForeground;//3.2、设置按钮的标题action1.title = @"qiantai哈哈";//3、设置后台按钮UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];action2.identifier = @"houtai";//3.1、设置前台按钮模式action2.activationMode = UIUserNotificationActivationModeBackground;//3.2、设置按钮的标题action2.title = @"houtai哈哈";//4、设置按钮[category setActions:@[action1, action2] forContext:UIUserNotificationActionContextDefault];//5、设置分类的集合NSSet *categorySet = [NSSet setWithObject:category];if([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0){//1.iOS8之后,如果想要发出通知(无论本地还是远程),必须先进行注册.(iOS8之前不需要)/***  @param types:显示收到本地通知时的样式*         UIUserNotificationTypeNone  无*         UIUserNotificationTypeBadge  app图像显示通知的数字*         UIUserNotificationTypeSound  声音*         UIUserNotificationTypeAlert  弹窗**///6、设置分类集合UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:categorySet];[application registerUserNotificationSettings:setting];}else{//ios8.0之前的注册推送通知[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];}return YES;
}//处理分类按钮调用的方法
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler {NSLog(@"根据标识符进行逻辑操作%@", identifier);//一旦接收到本地推送通知,必需调用,告诉系统进行资源分配completionHandler();}

二、远程推送

1、概念

概念:由服务器推送消息给用户,弹出消息的通知(需要联网),需要服务器的支持。远程推送服务,又称为APNs(Apple PushNotification Services)。
常见场景:微信提醒新消息/淘宝提醒有新活动/视频软件提供您有最新电影
注意:非常常用.但是如果仅仅是给用户提醒,客户端(你)做的事情就非常简单.
 
例子:淘宝最近双11搞活动,各种送红包,想告知用户.但是该用户不经常打包淘宝APP.淘宝如何通知该用户有最新的活动呢?
传统方式(以前):只有用户打开了淘宝客户端,客户端向服务器请求是否有最新的活动,才能在APP中告知用户活动。
传统方式局限性:只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容。
远程推送通知的好处:不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知。

2、原理
远程通知的原理:淘宝服务器把“红包活动” --> 推送 -->  苹果的APNs服务器  --> 推送 --> 淘宝客户端app

2.1、为什么淘宝服务器不直接推消息给用户?
在通常情况下服务器端是不能主动向客户端推消息的。
如果想服务器端给客户端推消息,必须建立长连接,淘宝客户端在处于后台时不能和服务器端建立长连接。

2.2、为什么苹果服务器可以推消息给用户?
所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
苹果建立长连接的作用:时间校准、系统升级提示、查找我的iPhone、远程推送通知

短链接:客户端app给服务器发送请求,服务器返回数据,客户端app收到数据,链接断开。此时,服务器则不能给客户端推送消息。
长链接:通过socket来建立。即时通讯中使用。建立长链接对服务器的负荷特别大。高并发后台人才的技术,可以节省服务器。

2.3、苹果在推送消息时,如何准确的推送给某一个用户,并且知道是哪一个APP?
在淘宝服务器把消息给苹果的APNs服务器时,必须告知苹果DeviceToken
什么是DeviceToken?
DeviceToken是由用户手机的UDID和应用程序的BundleID共同生成的
通过DeviceToken可以找到唯一手机中的唯一应用程序
如何获得DeviceToken?
客户端到苹果的APNs注册即可获得。

2.4、如何实现远程推送通知
首先,BundleID对应的APPID必须是明确的(特殊功能)
该APPID必须配置两个证书
调试证书:用于调试远程推送
发布证书:用于发布后给用户推送消息
根据上面的APPID重新配置描述文件
安装对应的证书,即可开始测试远程推送

3、苹果自带的远程推送通知

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {if([[UIDevice currentDevice].systemVersion doubleValue]>= 8.0){//注册推送通知UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];[application registerUserNotificationSettings:settings];//注册远程通知,获取DeviceToken[application registerForRemoteNotifications];}else{//ios8.0之前的注册推送通知[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];}//如果应用程序被杀死了,但是任然要实现接收到通知进行跳转,则需要在此处实现跳转。因为程序被杀死后,接收到通知不会调用didReceiveRemoteNotification方法。// 判断是否是通过点击通知打开了应用程序if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {// 跳转代码NSLog(@"接收到本地通知,跳转到一个固定的界面");//获取通知的消息NSDictionary *remoteDict = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];}return YES;
}//通过代理方法获取deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{//deviceToken:用于发送给公司的服务器,让公司的服务器作存储NSLog(@"%@", deviceToken);/***  UIApplicationStateActive  前台*  UIApplicationStateInactive  进入前台*  UIApplicationStateBackground  后台*/if(application.applicationState == UIApplicationStateActive){NSLog(@"在前台时,不要进行跳转");return;}NSLog(@"跳转到一个固定的页面:%s", __func__);
}#pragma mark - 当接收到远程推送时,调用该方法
//前台/后台时,可以在此方法接收到通知,在杀死时需要在didFinishLaunchingWithOptions
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{NSLog(@"%@", userInfo);
}#pragma mark - 当接收到远程推送时,调用该方法,ios7推出
//前台/后台/退出时,可以在此方法接收到通知
//如果此方法和“application:didReceiveRemoteNotification:”方法都实现,则此方法有效,另外一个方法无效
//如果实现了此方法,还需要打开一个选项值 --> 点击项目 --> capabilites --> backgroundModes --> remoteNotification,即打开了后台远程通知
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{//必须调用一下block,否则报错。此block告诉苹果服务器推送是否成功
//    UIBackgroundFetchResultNewData
//    UIBackgroundFetchResultNoData
//    UIBackgroundFetchResultFailedcompletionHandler(UIBackgroundFetchResultNewData);
}

三、第三方平台的远程推送通知

友盟、极光推送

推送的作用非常简单,就是将我们服务器需要做的事情用激光推送服务器作为替代。

极光推送给任何用户不需要交钱,但是如果推送给特定的用户则需要交钱。

ios中的通知和推送相关推荐

  1. iOS 推送通知及推送扩展

    概述 iOS中的通知包括本地推送通知和远程推送通知,两者在iOS系统中都可以通过弹出横幅的形式来提醒用户,点击横幅会打开应用.在iOS 10及之后版本的系统中,还支持通知扩展功能(UNNotifica ...

  2. iOS - 判断用户是否允许推送通知(iOS7/iOS8)

    (iOS8中用户开启的推送通知类型对应的是UIUserNotificationType(下边代码中UIUserNotificationSettings的types属性的类型),iOS7对应的是UIRe ...

  3. Worktile中的实时消息推送服务实现

    在团队协同工具worktile的使用过程中,你会发现无论是右上角的消息通知,还是在任务面板中拖动任务,还有用户的在线状态,都是实时刷新.Worktile中的推送服务是采用的是基于xmpp协议.erla ...

  4. ios5.1.1旧版软件下载_苹果iOS 14.1正式版推送 关闭旧版本降级通道

    上周,苹果正式发布了iOS14.1 正式版.而就在今天,苹果则停止了对iOS 14.0.1的验证.这样的举措意味着用户将无法再降级到这一版本. 苹果iOS 14.1正式版推送 关闭旧版本降级通道 iO ...

  5. 物联网学习 第4讲 中移OneNET HTTP推送服务接入

    物联网开发 第4讲 中移OneNET HTTP推送服务接入 在使用OneNET平台时,如果我们自己开发应用,基本上会有获取设备的上下线信息以及设备上传的数据点的需求. 为了满足上述的需求,我们有以下两 ...

  6. idea中git替换,推送到新的github或者gitlab上面

    借鉴 目录 git使用,命令行 初始化本地仓库,并提交内容到本地 连接到远程仓库,并将代码同步到远程仓库 继续修改本地代码,然后提交并推送到github idea中git使用合并分支 修改项目的git ...

  7. ad域推送软件_如何在域管理环境中进行软件的推送安装

    如何在域管理环境中进行软件的推送安装 1, 要把你准备分发的软件制作成 .msi 软件安装包 . 在 Windows2000 安装光盘运行 x:\Valueadd\3rdparty\Mgmt\Wins ...

  8. 直播平台开发过程中关于谷歌fcm推送介绍

    在直播平台开发中要集成谷歌fcm,首先需要满足一下条件: 1.设备必须是android4.0以上,Google Play Services 必须是 11.2.0以上版本 2.Android SDK M ...

  9. 推送通知iOS客户端编写实现及推送服务器端编写

    1.iOS客户端编程 推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主要介绍iOS客户端编程,推送通知的编程比较简单,编程的关键是获得令牌,这是从APNS返回的,然后还有把提交给内容 ...

最新文章

  1. print python 如何加锁_Python 进阶(一):多线程
  2. java day07第七课静态的和单例设计模式
  3. Py之Data Base:Python和数据库的那些嘻嘻哈哈事详细攻略
  4. FOJ 2105 Digits Count
  5. Androd之在图片右上角显示红色圆圈里面数字提醒
  6. 真实感人故事_您的数据可以告诉您真实故事吗?
  7. Android 窗口Dialog 代码以及使用
  8. Spring 配置文件
  9. 全球信息数据量陡增 大数据应用前景广阔
  10. 别人改出了新BUG,怎么看?
  11. CAD中如何使用Lisp程序编写坐标标注功能
  12. Jenkins配置邮件, Extended E-mail Notification, 破解管理员密码
  13. Spark on Hive Hive on Spark,傻傻分不清楚
  14. pubg服务器维修时间段,pubg周几维护 | 手游网游页游攻略大全
  15. 期货股票自动交易下单接口怎么执行策略函数?
  16. Unity3D 获取资源运行时内存和硬盘大小
  17. PX4中的二阶巴特沃斯低通滤波
  18. 一个小程序:计算绩效的方案
  19. 搜狗校招笔试题编程之一
  20. 潘多拉路由器搭建php,openwrt PandoraBox(潘多拉)如何安装使用SQM QoS

热门文章

  1. HTML的基本信息——小白篇(2)
  2. Jvm垃圾收集器调优工具调优指南
  3. 浅析GPU通信技术(中)-NVLink总线协议
  4. 下载完Node.js后,npm -v报Cannot find module“yallist“错
  5. buuctf have fun
  6. 常见2的次方结果总结
  7. html隐藏滚动条,并仍然可以滚动
  8. 字典树(单词查找树)详解
  9. NX/UG二次开发—CAM—获取加工环境下所有程序组、刀具组、加工坐标系并输出名称
  10. 计算机进程控制块的作用是什么,计算机考研操作系统之进程控制块(PCB)【中公原创】...