//一个完整的通知一般包含3个属性:

- (NSString *)name; // 通知的名称

- (id)object; // 通知发布者(是谁要发布通知)

- (NSDictionary *)userInfo; // 一些额外的信息

 //初始化一个通知(NSNotification)对象

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;
4.10 NSNotificationCenter

第一步:注册通知监听器

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;

注意:当name参数为空时,可监听并打印anObject对象的所有事件,可用此方法来观察控件的事件触发顺序

 第二步:发布通知

- (void)postNotification:(NSNotification *)notification;

- (void)postNotificationName:(NSString *)aName object:(id)anObject;

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:
(NSDictionary *)aUserInfo;

 第三步:取消监听器

- (void)removeObserver:(id)observer;

 
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

一.基本概念

1. ios提供了两种通知机制,本地通知,推送通知。

2.本地通知和推送通知可以让不在前端运行的程序告知用户程序内部发生的信息。

3.通知的展示:播放声音,更新应用程序图标上的数字,显示一个横幅。

二.本地通知

1.通常使用本地通知,是在应用程序退出到后台调度的。应用程序退出后台之后,会在内存中驻留10分钟的时间,过了10分钟,系统会自动清理应用程序。

2.在进入后台的方法中创建本地通知。

- (void)applicationDidEnterBackground:(UIApplication *)application

{

[self loadNotification];

}

#pragma mark - 创建本地通知

- (void)loadNotification

{

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

// 5秒钟之后触发

notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];

notification.alertBody = @"出大事了";

notification.soundName = UILocalNotificationDefaultSoundName;

notification.applicationIconBadgeNumber = 100;

notification.userInfo = @{@"userName": @"马大哈", @"age": @(18)};

// 要调用本地通知,需要通过UIApplication来统一调度

[[UIApplication sharedApplication]scheduleLocalNotification:notification];

}

3.发送的通知怎么获取本地通知

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

// 截获本地通知,用户通过通知的横幅点击进入系统,字典中才能找到本地通知

UILocalNotification *notification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

// 判断通知是否存在

if (notification) {

NSLog(@"%@", notification.userInfo);

[notification.userInfo writeToFile:@"/users/apple/Desktop/123.plist" atomically:YES];

}

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

 
}
三.推送通知
(远程推送:

第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。

第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。)

1.消息推送服务,简称APNS。

2.推送流程:首先应用程序需要注册接收消息,然后APNS会返回deciceToken,将token保存到本地,提交开发商的数据服务器,服务器保存用户的token,服务器向APNS发送消息,APNS发送消息给客户的应用程序。

3.在获取到token时,发送给开发商服务器之前,需要做一步优化。

• 4.Device Token的获取,Device Token是由用户手机发起请求时,由APNS生成的。注意:DeviceToken的生成机制可能随时变化,最好方法每次获取到deviceToken后,与之前(如果有)的deviceToken进行比较,如果发生变化,及时更新自己数据服务器上的记录

4.1 向APNS发送请求,即注册应用程序接收APNS推送消息

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

// 注册应用程序接收APNS推送的消息

[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

4.2 获取Device Token。

#pragma mark - 获取DeviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken

{

NSLog(@"%@", deviceToken);

// 1. 从系统偏好取之前的token

NSData *oldToken = [[NSUserDefaults standardUserDefaults]objectForKey:@"deviceToken"];

// 2. 新旧token进行比较

if (![oldToken isEqualToData:deviceToken]) {

// 3. 如果不一致,保存token到系统偏好

[[NSUserDefaults standardUserDefaults]setObject:deviceToken forKey:@"deviceToken"];

// 4. 使用post请求传输新旧token至服务器

// 1) url

// 具体的URL地址以及POST请求中的参数和格式,是由公司的后端程序员提供的

// 2) request POST body(包含新旧token的数据)

// 3) connection 的异步

}

}

iOS-NSNotification本地推送、远程推送的更多相关文章

  1. IOS中程序如何进行推送消息(本地推送,远程推送)2(上)

    未看过本地推送的,可以提前看一下本地推送. http://www.cnblogs.com/wolfhous/p/5135711.html =============================== ...

  2. iOS的推送机制APNs:本地推送&远程推送

    本地推送: 本地推送主要应用在备忘录,闹钟等本地的,基于时间定时的消息提醒.本篇不做详细描述. 远程推送:APNS(苹果推送通知服务) iOS远程推送机制的原理及流程: 注册推送(橙色部分):若该Ap ...

  3. 包教包会:本地推送 & 远程推送

    什么是推送?注意,和我们常用的抽象通知不同(NSNotification): 可以让不在前台运行的app,告知用户app内部发生了什么事情:或者没有运行的app接收到服务器发来的通知..比如离线QQ接 ...

  4. iOS---iOS10适配iOS当前所有系统的远程推送

    一.iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出 ...

  5. IOS JPush 集成步骤(极光远程推送解决方案,支持android和iOS两个平台)

    ●  什么是JPush ●  一套远程推送解决方案,支持android和iOS两个平台 ●  它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量.开发复杂 度 ●  更多的信息,可 ...

  6. iOS 申请测试用的远程推送证书

    进入member center创建一个App ID 注意下面证书名字的变化 将刚刚生成的两个证书下载下来,双击安装 安装完成后可以在钥匙串中查看 这样远程推送证书的申请流程就走完了

  7. IOS中程序如何进行推送消息(本地推送,远程推送)

    [1]-------------什么是推送消息? 我就以一张图解释------------ [2]-----------IOS程序中如何进行本地推送?----------- 2.1,先征求用户同意 1 ...

  8. IOS中程序如何进行推送消息(本地推送,远程推送)2(下)

    内容中包含 base64string 图片造成字符过多,拒绝显示

  9. 适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue

    原文:http://imtx.me/archives/1910.html 昨天我在微博上吐槽:iOS 8 / Xcode 6 真是史上对开发人员最糟糕的版本号了.收到非常多朋友表达同感. 之所以这么说 ...

  10. 李洪强iOS经典面试题154- 通知与推送

    李洪强iOS经典面试题154- 通知与推送   通知与推送 本地通知和远程推送通知对基本概念和用法? image 本地通知和远程推送通知都可以向不在前台运行的应用发送消息,这种消息既可能是即将发生的事 ...

随机推荐

  1. Codeforces Global Round 2 E. Pavel and Triangles(思维+DP)

    题目链接:https://codeforces.com/contest/1119/problem/E 题意:有n种长度的棍子,有a_i根2^i长度的棍子,问最多可以组成多少个三角形 题解:dp[i]表 ...

  2. maven-pom文件的scope作用域

    1.compile 编译范围,默认scope,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候都有效. 2.provided 容器或JDK已提供范围,表示该依 ...

  3. learning scala dependency injection

    println("Step 1: Create a trait which knows how to do create, read, update and delete operation ...

  4. learning scala Case Classses

    package com.aura.scala.day01 object caseClasses { def main(args: Array[String]): Unit = { // 注意在实例化案 ...

  5. Windows10+Jupyter notebook+添加核

    链接:https://blog.csdn.net/ZWX2445205419/article/details/80113472 1. 安装Anaconda   2. 创建虚拟环境   > con ...

  6. SSH dao层异常 org.hibernate.HibernateException: No Session found for current thread

    解决方法: 在 接口方法中添加 事务注解 即可. public interface IBase<PK extends Serializable, T> { @Transactional v ...

  7. @ControllerAdvice 和 @ExceptionHandler

    @ExceptionHandler的作用是把对不同异常处理抽取到不同的方法中. @ControllerAdvice的作用是把控制器中 @ExceptionHandler.@InitBinder.@Mo ...

  8. 【00NOIP提高组】单词接龙

    #include<bits/stdc++.h> using namespace std; ; int n,length; int vis[N]; string str[N]; inline ...

  9. .Net类库 压缩文件 与 Ionic.Zip 批量压缩不同目录文件与解压 文件

    using System; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; us ...

  10. Dockerfile HEALTHCHECK详解

    Dockerfile中使用HEALTHCHECK的形式有两种: 1.HEALTHCHECK [options] CMD command(本次详细解释) 2.HEALTHCHECK NODE 意思是禁止 ...