//一个完整的通知一般包含3个属性:
- (NSString *)name; // 通知的名称
- (id)object; // 通知发布者(是谁要发布通知)
- (NSDictionary *)userInfo; // 一些额外的信息
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
第一步:注册通知监听器
- (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;
一.基本概念
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.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 的异步
}
}