当前位置: 首页 > 编程日记 > 正文

ios 消息通知

苹果的通知分为本地通知和远程通知,这里主要说的是远程通知

历史介绍

iOS 3 - 引入推送通知UIApplication 的 registerForRemoteNotificationTypes 与 UIApplicationDelegate 的 application(_:didRegisterForRemoteNotificationsWithDeviceToken:),application(_:didReceiveRemoteNotification:)

iOS 4 - 引入本地通知scheduleLocalNotification,presentLocalNotificationNow:,application(_:didReceive:)

iOS 5 - 加入通知中心页面

iOS 6 - 通知中心页面与 iCloud 同步

iOS 7 - 后台静默推送application(_:didReceiveRemoteNotification:fetchCompletionHandle:)

iOS 8 - 重新设计 notification 权限请求,Actionable 通知registerUserNotificationSettings(_:),UIUserNotificationAction 与 UIUserNotificationCategory,application(_:handleActionWithIdentifier:forRemoteNotification:completionHandler:) 等

iOS 9 - Text Input action,基于 HTTP/2 的推送请求UIUserNotificationActionBehavior,全新的 Provider API 等

ios 10 -

  1. 相同的特性使用类似的API(之前的功能API使用方法类似但是还是稍有改变)
  2. 内容扩展(支持附件和展示更多内容)
  3. 本地通知和远程通知操作代码在相同调用路径(合并代理方法)
  4. 简化代理方法
  5. 更好的通知管理(支持通知查、改、删;增强本地通知管理,增加日历与地理位置事件的触发)
  6. 应用内通知展示(之前App在前台的情况下收到通知不会UI展示)
  7. 在Extensions中规划和操作通知(使更新通知内容和删除误发或过期的通知内容成为可能,另一个重要场景为端到端加密)
  8. 引入通知Extensions

1.注册通知

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  #pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wdeprecated-declarations"
    CGFloat systemVersion = [[UIDevice currentDevice].systemVersion doubleValue];
    if (systemVersion < 8.0) { //iOS7之前
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
    } else if(systemVersion < 10.0) { // iOS7-IOS9
#ifdef __IPHONE_8_0
        //        UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
        //        action1.identifier = @"action1_identifier";
        //        action1.title=@"确定";
        //        action1.activationMode = UIUserNotificationActivationModeForeground;//当点击的时候启动程序
        //
        //        UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];  //第二按钮
        //        action2.identifier = @"action2_identifier";
        //        action2.title=@"取消";
        //        action2.activationMode = UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理
        //        action2.authenticationRequired = YES;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
        //        action2.destructive = YES;
        //
        //        UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
        //        categorys.identifier = @"category1";//这组动作的唯一标示
        //        [categorys setActions:@[action1,action2] forContext:(UIUserNotificationActionContextDefault)];
        //        NSSet<UIUserNotificationCategory *> set = [NSSet setWithObject:categorys];
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
#endif
    } else {
#ifdef __IPHONE_10_0
        UNUserNotificationCenter *notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
        notificationCenter.delegate = self;
        [notificationCenter requestAuthorizationWithOptions:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (granted) {
                DLog(@"通知已打开")
            } else {
                DLog(@"通知没有打开,建议用户去通知中心打开通知")
            }
        }];
#endif
        
    }
#pragma clang diagnostic pop
}

// ios 10
#pragma mark - UNUserNotificationCenterDelegate
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0)
{
    
}

// The method will be called on the delegate when the user responded to the notification by opening the application, dismissing the notification or choosing a UNNotificationAction. The delegate must be set before the application returns from applicationDidFinishLaunching:.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) __TVOS_PROHIBITED
{
    
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0) {
    DLog(@"%@", [NSString stringWithFormat:@"Device Token: %@", deviceToken]);
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0) {
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0)
{
    
}

// Called when your app has been activated by the user selecting an action from
// a local notification.
// A nil action identifier indicates the default action.
// You should call the completion handler as soon as you've finished handling
// the action.
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler
{
    
}

// Called when your app has been activated by the user selecting an action from
// a remote notification.
// A nil action identifier indicates the default action.
// You should call the completion handler as soon as you've finished handling
// the action.
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
{
    
}
#endif


2.接收到通知

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

{
    DLog(@"iOS6及以下系统,收到通知");
    [self dealRemoteNotification:userInfo];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler NS_AVAILABLE_IOS(7_0)
{
    DLog(@"iOS7收到通知");
    [self dealRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
     NSDictionary *userInfo = notification.request.content.userInfo;
    [self dealRemoteNotification:userInfo];
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
{
    NSDictionary *userInfo = response.notification.request.content.userInfo;
     [self dealRemoteNotification:userInfo];
}

- (void)dealRemoteNotification:(NSDictionary *) userInfo
{
    NSDictionary *aps = [userInfo objectForKey:@"aps"];
    NSString *alert = [aps objectForKey:@"alert"];
    DLog(@"通知内容:%@", alert);
    DLog(@"收到推送消息:%@", userInfo);
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    switch (state) {
            // app正在前端运行
        case UIApplicationStateActive:
        {
            DLog(@"app active时可以回调此方法,但是手机通知栏没有通知跟声音");
        }
            break;
        case UIApplicationStateBackground:
        {
            DLog(@"UIApplicationStateBackground");
        }
            break;
            // app 在后台运行时点击远程通知
        case UIApplicationStateInactive:
        {
            DLog(@"点击通知图标 时点通知启动");
        }
            break;
        default:
            break;
    }
}

3.点击通知

如果APP处于未启动状态,点击通知栏启动APP,此时

      • 若用户直接启动,lauchOptions内无数据;
      • 若由其他应用程序通过openURL:启动,则UIApplicationLaunchOptionsURLKey对应的对象为启动URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey对应启动的源应用程序的bundle ID (NSString);
      • 若由本地通知启动,则UIApplicationLaunchOptionsLocalNotificationKey对应的是为启动应用程序的的本地通知对象(UILocalNotification);
      • 若由远程通知启动,则UIApplicationLaunchOptionsRemoteNotificationKey对应的是启动应用程序的的远程通知信息userInfo(NSDictionary);
      • 其他key还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,
        UIApplicationLaunchOptionsNewsstandDownloadsKey。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{NSURL *url = [options objectForKey:UIApplicationLaunchOptionsURLKey];if(url){}NSString *bundleId = [options objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];if(bundleId){}UILocalNotification * localNotify = [options objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];if(localNotify){}NSDictionary * userInfo = [options objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];if(userInfo){}}

相关文章:

aml linux 环境,各位辛苦编译DSDT.aml的兄弟,linux是个好工具啊,简单提取

本小菜先后安装雪豹和lion&#xff0c;驱动一直不能完美解决。本想靠dsdt和idsdt大法驱动我的G310M显卡&#xff0c;可是困难重重。小本bios为phoenix&#xff0c;而非各位大神提供的ami和aword板&#xff0c;编译错误达到201处&#xff0c;更改rtc处编译剩余7处错误&#xff0…

华南理工网络计算机基础知识,2019年华南理工大学网络教育计算机基础随堂练习第一章...

2019年华南理工大学网络教育计算机基础随堂练习第一章 (9页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;11.90 积分&#xfeff;第一章 计算机基础知识第一节 计算机的基本概念随堂练习提交截止时间…

AFN 切换BaseUrl

在某个特定的接口需要修改baseurl时&#xff1a; 直接使用kvc&#xff1a; [_sessionManager setValue:[NSURL URLWithString:NEW_BASE_URL] forKey:"baseURL"];在发出请求后&#xff0c;在修改会通用的baseurl 转载于:https://www.cnblogs.com/liuwenqiang/p/960667…

按下开机键,计算机背后的故事

计算机是如何启动的&#xff1f; 从打开电源到开始操作&#xff0c;计算机的启动是一个非常复杂的过程。 我一直搞不清楚&#xff0c;这个过程到底是怎么回事&#xff0c;只看见屏幕快速滚动各种提示...…… 零、boot的含义 问&#xff1a;"启动"用英语怎么说&#…

android 图片缓存

一、Picasso https://github.com/square/picasso Picasso是Square公司开源的一个Android平台上的图片加载框架&#xff0c;简单易用&#xff0c;一句话搞定项目中的图片加载&#xff0c;好用到令人发指。 使用一句话&#xff1a;Picasso.with(this).load("url").plac…

linux shell cgi post,linux下shell处理cgi的方法--post get

web server获取网页上HTML的DOM对象信息发送来的信息&#xff0c;主要有get和post方法。介绍原理的文章很多&#xff0c;但介绍实际应用到linux的shell中的文章很少。1、get方法①表单源码如下&#xff0c;有几个HTML对象作为传值对象。CGI TestText fieldRadio button123②cgi…

福建工程学院计算机科学类投档线,2019年福建工程学院美术类本科专业投档分数线...

福建工程学院2019年美术类本科专业录取情况省份科类专业计划最高分最低分平均分江苏艺术综合环境设计5247.2241.2244.6视觉传达设计3244.2240241.8数字媒体艺术3247.2244.2246产品设计3243.8238.6241.1安徽艺术综合环境设计5728.7724.9726.9视觉传达设计4729726.5727.3数字媒体…

如何对正在运行的进程,进行heap profile

简单来说, 就是先preload上tcmalloc, 日常用用没啥问题, 当感觉出现问题时, gdb attach 上, 然后执行 call HeapProfilerStart("xxx") , 过一段时间, 再执行call HeapProfilerStop, 产出相应的profile文件, 然后detach出进程 以下为一些未整理的 link https://gperft…

linux 命令窗口美化,美化你的命令行终端Terminal

yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:46发表:太好了yuezhang.su 于 2009-05-13 18:20:46发表:太好了yuezhang.su 于 2009-05-13 18:20…

mac 显示隐藏文件

打开终端&#xff0c;输入&#xff1a;defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool false 此命令关闭显示隐藏文件命令运行之后需要重新加载Finder&#xff1a;快捷…

Android修改包名

1.直接Refactor ---> rename 2.修改build.gradle ---> applicationId 为新包名 3.修改后要注意XML中自定义控件的全名是否也改变了 参考&#xff1a;android studio 改包名转载于:https://www.cnblogs.com/jarvisyin/p/6634392.html

学计算机的好处处300字,学计算机的心得体会300字

学计算机的心得体会300字我们从一些事情上得到感悟后&#xff0c;可以寻思将其写进心得体会中&#xff0c;这么做可以让我们不断思考不断进步。那么好的心得体会都具备一些什么特点呢&#xff1f;以下是小编精心整理的学计算机的心得体会300字&#xff0c;欢迎大家分享。学计算…

洛谷 3519 bzoj 2213 Difference

联考考试考到了这个题&#xff0c;随机化40分&#xff0c;现在来秒掉它吧。 题意&#xff1a; 给一个字符串&#xff0c;求其中的一段&#xff0c;使得出现次数最多的字符与出现次数最少的字符的出现次数之差最大。 输入输出样例 输入样例#1&#xff1a; 复制 10 aabbaaabab 输…

linux 文件管理 教程,Linux文件管理

Linux文件管理本文介绍如何在Linux上创建文件、删除文件、复制文件、移动文件使用touch命令在linux上创建文件使用rm命令在linux上删除文件使用cp命令在linux上复制拷贝文件mv命令在linux上移动或重命名文件##文件简介Linux中文件可以分为普通文件、目录文件、链接文件、设备文…

ios cocopods 安装使用及高级教程

CocoaPods简介 每种语言发展到一个阶段&#xff0c;就会出现相应的依赖管理工具&#xff0c;例如Java语言的Maven&#xff0c;nodejs的npm。随着iOS开发者的增多&#xff0c;业界也出现了为iOS程序提供依赖管理的工具&#xff0c;它的名字叫做&#xff1a;CocoaPods。http://co…

单片微型计算机概念及组成,中国民用航空飞行学院2014年微机原理与接口考研复习大纲...

中国民用航空飞行学院硕士研究生入学考试801《微机原理与接口》复习大纲第一部分 考试说明一、 考试性质《微机原理与接口》是中国民用航空飞行学院硕士生入学考试科目之一。它的评价标准是高等学校、科研院所的优秀本科毕业生能达到及格以上水平&#xff0c;以保证被录取者具…

【转】Jmeter常见问题

收集工作中JMeter遇到的各种问题1. JMeter的工作原理是什么&#xff1f;向服务器提交请求&#xff1b;从服务器取回请求返回的结果。2. JMeter的作用&#xff1f;JMeter可以用于测试静态或者动态资源的性能&#xff08;文件、Servlets、Perl脚本、java对象、数据库和查询、ft…

linux的tar中ztvf,linux中的tar命令(2)

实例4&#xff1a;只将 /tar 内的 部分文件解压出来命令&#xff1a;tar -zxvf /opt/soft/test/log30.tar.gz log2013.log输出&#xff1a;[rootlocalhost test]# tar -zcvf log30.tar.gz log2012.log log2013.loglog2012.loglog2013.log[rootlocalhost test]# ls -al log30.ta…

xcode 消除警告

项目中引用大量的第三方代码时&#xff0c;这些代码很复杂&#xff0c;不要轻易去改动它&#xff0c;如果编译产生很多警告&#xff0c;该如何消除呢&#xff1f; 1. 最直接、最一劳永逸、最安全的方式&#xff0c;直接找到警告的那段代码&#xff0c;改为不警告。这个方式最安…

RoadMap

转载于:https://www.cnblogs.com/taogao3364/p/9616020.html

罗格斯大学电气与计算机工程专业怎么样,美国电子工程排名 - 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克校区好还是清华...

美国电子工程排名 - 电子计算机工程的研究生教育&#xff0c;特别是偏向电路设计方向&#xff0c;请问是美国罗格斯大学新布朗斯维克校区好还是清华&#xff0c;1. 电子计算机工程的研究生教育&#xff0c;特别是偏向电路设计方向&#xff0c;请问是美国罗格斯大学新布朗斯维克…

Win10系列:VC++调用自定义组件1

通过20.9.1小节中的代码和步骤编写了一个名为"FilePickerComponent"的WinRT组件&#xff0c;接下来将在上一小节所新建的项目基础上&#xff0c;继续介绍如何在不同的语言所编写的应用中调用这个WinRT组件。 &#xff08;1&#xff09;JavaScript调用WinRT组件 在解决…

windows常用命令有哪些(整理)

windows常用命令有哪些&#xff08;整理&#xff09; 一、总结 一句话总结&#xff1a;其实这个好学&#xff0c;只要先弄懂主干&#xff0c;清除主干&#xff0c;那么枝叶的添加逻辑就很清除了 这种多内容的&#xff0c;散乱的&#xff0c;弄清除主干效率就高了 1、windows命令…

c语言定义字符类型变量的关键字,C语言数据类型

C语言关键字&#xff1a;也称保留字&#xff0c;是C语言预先定义的、具有特殊意义的单词。数据类型关键字(12个)&#xff1a;(1)char&#xff1a;声明字符型变量或函数(2)double&#xff1a;声明双精度变量或函数(3)enum&#xff1a;声明枚举类型(4)float&#xff1a;声明浮点型…

mac tomcat https

一、HTTPS的基本工作原理&#xff1a; HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手&#xff0c;在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议&#xff0c;更是一件经过艺术家精心设计的艺术品&#xff0c;…

计算机应用基础电子演示文稿系统行考作业,最新电大计算机应用基础形考PowerPoint答案...

.;.. 计算机应用基础/ ? 课程考核/ ? 模块4 PowerPoint 2010 电子演示文稿系统——客观题一&#xff0e;单项选择题1. 在PoewrPoint 中&#xff0c;“视图”这个名词表示( D )。A. 一张正在修改的幻灯片B. 一种图形C. 编辑演示文稿的方式D. 显示幻灯片的方式2. 在下列PowerPo…

数据结构(三) 用java实现七种排序算法。

很多时候&#xff0c;听别人在讨论快速排序&#xff0c;选择排序&#xff0c;冒泡排序等&#xff0c;都觉得很牛逼&#xff0c;心想&#xff0c;卧槽&#xff0c;排序也分那么多种&#xff0c;就觉得别人很牛逼呀&#xff0c;其实不然&#xff0c;当我们自己去了解学习后发现&a…

Codeforces ECR50 div2题解

A&#xff1a;签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long ll read() {ll x0,f1;char cgetchar();while (c<0||…

开发ios的语言

iOS发展这么多年了&#xff0c;很多第三方语言都向开发一种自己的iOS&#xff0c;于是多种跨平台诞生了&#xff01; Object-c、swift&#xff1a; 当然是开发iOS的首先&#xff0c;毕竟是苹果自己的东西&#xff0c;也是最流行、最适合开发ios的&#xff0c;无论是UI库、性能、…

c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式

原标题&#xff1a;单片机C语言编程定时器的几种表达方式吴鉴鹰单片机开发板地址店铺&#xff1a;【吴鉴鹰的小铺】地址&#xff1a;【https://item.taobao.com/item.htm?_uukgdp5a7629&id524088004171】单片机C语言编程中&#xff0c;定时器的初值对于初学者真的是比较不…