zoukankan      html  css  js  c++  java
  • iOS-NSNotification本地推送、远程推送

     //一个完整的通知一般包含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 的异步

       }

    }

  • 相关阅读:
    Apple Tree(树状数组+线段树)
    平衡阵容(RMQ st表算法)
    一起去打CS
    夜归

    淋雨
    大马戏
    雨中行船
    弄堂里
    夜游天安门
  • 原文地址:https://www.cnblogs.com/linxiu-0925/p/5055579.html
Copyright © 2011-2022 走看看