zoukankan      html  css  js  c++  java
  • 推送通知

    一、推送通知

    1、iOS中提供了2种推送通知
    本地推送通知(Local Notification)
    远程推送通知(Remote Notification)
    2、推送通知的作用
    可以让不在前台运行的app,告知用户app内部发生了什么事情
    3、推送通知有5种不同的呈现效果
    在屏幕顶部显示一块横幅(显示具体内容)
    在屏幕中间弹出一个UIAlertView(显示具体内容)
    在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
    更新app图标的数字(说明新内容的数量)
    播放音效(提醒作用)
    4、推送通知的呈现效果设置
    (1)显示横幅还是UIAlertView,取决于用户的设置
    (2)用户也可以决定是否要开启以下4个功能:
    (3)发出推送通知时,如果当前程序正运行在前台,那么推送通知就不会被呈现出来

    (4)点击推送通知后,默认会自动打开发出推送通知的app

    (5)不管app打开还是关闭,推送通知都能如期发出

    二、本地推送通知

    1、什么是本地推送通知
    顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持)
     
    2、本地推送通知的使用场景
    常用来定时提醒用户完成一些任务,比如
    清理垃圾、记账、买衣服、看电影、玩游戏
     
    3、如何发出本地推送通知
    (1)创建本地推送通知对象
    UILocalNotification *ln = [[UILocalNotification alloc] init];
    

     (2)设置本地推送通知属性

    推送通知的触发时间(何时发出推送通知)
    property(nonatomic,copy) NSDate *fireDate;
    推送通知的具体内容
    @property(nonatomic,copy) NSString *alertBody;
    在锁屏时显示的动作标题(完整标题:“滑动来” + alertAction)
    @property(nonatomic,copy) NSString *alertAction;
    音效文件名
    @property(nonatomic,copy) NSString *soundName;
    app图标数字
    @property(nonatomic) NSInteger applicationIconBadgeNumber;
    
    调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
    [[UIApplication sharedApplication] scheduleLocalNotification:ln];
    

     获得被调度(定制)的所有本地推送通知

    @property(nonatomic,copy) NSArray *scheduledLocalNotifications;

    (已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)

     取消调度本地推送通知

    - (void)cancelLocalNotification:(UILocalNotification *)notification;
    
    - (void)cancelAllLocalNotifications;

     立即发出本地推送通知

    - (void)presentLocalNotificationNow:(UILocalNotification *)notification;
    

    (3) 本地推送通知的其他属性

    每隔多久重复发一次推送通知

    @property(nonatomic) NSCalendarUnit repeatInterval;
    

    点击推送通知打开app时显示的启动图片

    @property(nonatomic,copy) NSString *alertLaunchImage;
    

     附加的额外信息

    @property(nonatomic,copy) NSDictionary *userInfo;
    

     时区

    @property(nonatomic,copy) NSTimeZone *timeZone;

    (一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)

     (4)点击本地推送通知

    当用户点击本地推送通知,会自动打开app,这里有2种情况
    app并没有关闭,一直隐藏在后台
    让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
     
    app已经被关闭(进程已死)
    启动app,启动完毕会调用AppDelegate的下面方法
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
    
    launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
    

     (5)iOS 8.0的变化

    在iOS 8.0中,如果要使用本地通知,需要得到用户的许可
    在didFinishLaunchingWithOptions方法中添加如下代码:
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
    
    [application registerUserNotificationSettings:settings];
    

     代码:

    //  在iOS8之后,Apple对用户隐私要求更加严格,所有很多东西都需要请求用户权限
        
        if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
            
            /*
             
             UIUserNotificationTypeNone    = 0,      // 不展示通知
             UIUserNotificationTypeBadge   = 1 << 0, // 应用图标右上角的红色数字权限
             UIUserNotificationTypeSound   = 1 << 1, // 提示音的权限
             UIUserNotificationTypeAlert   = 1 << 2, // 弹窗或横幅的权限
             */
    //       权限类型
            UIUserNotificationType types = UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert;
    //      用户通知设置
            UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:types  categories:nil];
    //      注册用户设置,用户的请求窗口会弹出一次
            [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
        }
    

     发送本地通知

    //  1.创建本地通知对象
        UILocalNotification *ln = [[UILocalNotification alloc] init];
        
        //  2.设置本地通知属性
        //************************************************************/
        //  什么时候发送这个本地通知
        ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
        //  设置通知的内容
        ln.alertBody = alertBody;
        //  设置提示音,如果用户是静音,它自动会转为震动
        ln.soundName = UILocalNotificationDefaultSoundName;
        //  应用图标
        ln.applicationIconBadgeNumber = 10;
        //  当用用户点击通知时候,进入应用程序,要不要显示启动图标
        ln.alertLaunchImage = @"UILaunchImageFile";
    //  用户信息(比如界面跳转的信息)
        ln.userInfo = userInfo;
        //************************************************************/
    
        //  调度本地通知
        [[UIApplication sharedApplication] scheduleLocalNotification:ln];
    

     界面跳转

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
    //  如果应用程序被杀死了,我们需要在这里处理界面跳转
        
    //  1.从应用程序的加载项取出本地通知对象
        UILocalNotification *ln  = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
        
    //  2.如果存在这个对象,表示用户是点击本地通知进入到应用的
        if (ln) {
    //      跳转界面
            [self jumpToPageWithLocalNotification:ln];
        }
    
        return YES;
    }
    
    
    /**
      1.当收到本地通知就会调用该代理方法
      调用场景
      1.如果应用程序在后台,当点击通知的时候
      2.如果应用程序在前台,一旦收到本地通知,就会调用该方法
      3.如果应用程序被杀死了,那么这个方法就不再执行了
     */
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
        /*
         UIApplicationStateActive,    活动
         UIApplicationStateInactive,  活动与后台切换的一种状态
         UIApplicationStateBackground 后台
         */
    //  如果应用在前台,就不要跳转界面了
        if (application.applicationState == UIApplicationStateActive) {
            return;
        }
    //  跳转界面
        [self jumpToPageWithLocalNotification:notification];
    
    }
    
    ///跳转界面
    - (void) jumpToPageWithLocalNotification:(UILocalNotification *) notification
    {
        //    NSLog(@"%s",__func__);
        //  取出用户信息
        NSDictionary *userInfo = notification.userInfo;
        //  拿到跳转到索引
        NSInteger index = [userInfo[@"index"] integerValue];
        
        //  获取根控制
        UITabBarController *tabVc   = (UITabBarController *)self.window.rootViewController;
        
        //  跳转界面
        tabVc.selectedIndex = index;
    }
    

     总结:

       1.在发送本地通知的时候,通过userInfo属性来指示跳转到那个界面

       2.监听本地通知的接收

             1.当收到本地通知就会调用该代理方法

             调用场景

             1.如果应用程序在后台,当点击通知的时候

             2.如果应用程序在前台,一旦收到本地通知,就会调用该方法 

               所以:判断如果应用程序在前台时候,不要执行界面跳转,来提高用户体验

             3.如果应用程序被杀死了,那么这个方法就不再执行了

            //- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

        3.在 didFinishLaunchingWithOptions:方法中,完成界面跳转

        判断用户是点击本地通知进入到应用的

        1.从应用程序的加载项取出本地通知对象

         UILocalNotification *ln  = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

        2.如果 ln 有值表示是用户点击本地通知进入的,这个时候,才需要进行界面跳转.

    三、远程推送通知

    1、远程推送通知
    (1)什么是远程推送通知
    顾名思义,就是从远程服务器推送给客户端的通知(需要联网)
    远程推送服务,又称为APNs(Apple Push Notification Services)

    (2)为什么需要远程推送通知?

    传统获取数据的局限性
    只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容

    (3)远程推送通知可以解决以上问题

    不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知

    2、远程推送通知使用须知

    所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
    (1)什么是长连接、短连接
    长连接:只要联网了,就一直建立连接
    短连接:当客户向服务器请求数据的时候建立连接,接受服务器端的数据后连接失效。只有客户端向服务器请求数据,才能获得服务端的数据

    (2)长连接的作用

    时间校准
    系统升级
    查找我的iPhone
    .. ...

     (3)长连接的好处

    数据传输速度快
    数据保持最新状态
    3、开发远程推送的条件

    (1)开发iOS程序的推送功能, iOS端需要做的事

    1.请求苹果获得deviceToken

    2.得到苹果返回的deviceToken

    3.发送deviceToken给公司的服务器

    4.监听用户对通知的点击

    (2)调试iOS的远程推送功能, 必备条件:

    1.真机

    2.调试推送需要的证书文件

    1> aps_development.cer : 某台电脑就能调试某个app的推送服务

    2> ios_development.cer : 让电脑具备真机调试的能力(调试设备)

    3> iphone5_qq.mobileprovision : 某台电脑就能利用某台设备调试某个程序

     (3)发布具有推送服务的app

    1> aps_production.cer : 如果发布的程序中包含了推送服务,就必须安装这个证书

    2> ios_distribution.cer  : 让电脑具备发布程序的能力

    3> qq.mobileprovision  : 某台电脑就能发布某个程序

    4、注册远程推送通知

    客户端如果想接收APNs的远程推送通知,必须先注册(得到用户的授权)
    一般在App启动完毕后就马上注册
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    
    {
    
        // 注册远程通知
    
           UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
    
        [application registerForRemoteNotificationTypes:type];
    
        return YES;
    
    }
    

     如果是第一次注册,会弹出右边的对话框

    注册成功后会调用AppDelegate的下面方法,得到设备的deviceToken

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    
    {
    
        NSLog(@"%@", deviceToken);
    
    }
    

    5、点击远程推送通知

    当用户点击远程推送通知,会自动打开app,这里有2种情况
    app并没有关闭,一直隐藏在后台
    让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
    

    app已经被关闭(进程已死)

    启动app,启动完毕会调用AppDelegate的下面方法
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
    
    launchOptions参数通过UIApplicationLaunchOptionsRemoteNotificationKey取出服务器返回的字典内容
    

     6、PushMeBaby

    1、PushMeBaby是一款用来测试ANPs的开源Mac项目
    它充当了服务器的作用,用法非常简单
    它负责将内容提交给苹果的APNs服务器,苹果的APNs服务器再将内容推送给用户的设备

    PushMeBaby的主页

    2、PushMeBaby的使用步骤
    注释掉不要的错误
    填写必要信息
    deviceToken:用于找到设备的令牌
    payload:推送的内容
    将推送的调试证书改为名apns.cer,添加到PushMeBaby项目中
    command + R启动程序,然后点击Push
    接下来就可以在设备上接收到远程推送通知

    四、JPush

    (1)什么是JPush
    一套远程推送解决方案,支持android和iOS两个平台
    它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量、开发复杂度
    更多的信息,可以参考JPush官方网站:https://www.jpush.cn
     
    集成iOS SDK的步骤可以参考

    (2)JPush的集成步骤

    注册帐号,创建应用
    填写iOS App的必要信息
    iOS开发证书和iOS生产证书必须是p12格式的交换证书
     
    (4)利用JPush发送通知
    JPush会自动记录和管理所有安装过此app的设备deviceToken
    利用JPush,可以轻易地给所有设备发送远程推送通知

  • 相关阅读:
    linux awk命令详解
    世界上最差的系统就是linux,双击不能安装软件
    硬盘安装CentOS 6.0(超级详细图文教程)
    Vim+cscope+ctags+tags阅读源代码
    使用vim看代码:cscope
    解决面板里没有network manager图标的问题
    【b804】双栈排序
    【BZOJ 1002】[FJOI2007]轮状病毒
    【BZOJ 1004】 [HNOI2008]Cards
    【t018】派对
  • 原文地址:https://www.cnblogs.com/jiqiaochun/p/4719080.html
Copyright © 2011-2022 走看看