美文网首页ios开发iOS即时通讯iOS推送技术
iOS开发--本地通知与远程通知

iOS开发--本地通知与远程通知

作者: 元宇宙协会 | 来源:发表于2016-02-01 00:18 被阅读14802次

    这里是指推送通知跟NSNotification有区别:

    1、NSNotification是系统内部发出通知,一般用于内部事件的监听,或者状态的改变等等,是不可见的
    2、本地通知与远程通知是可见的,主要用于告知用户或者发送一些App的内容更新,推送一些相关的消息,让用户知道App内部发生了什么事情。


    Paste_Image.png

    iOS常用通知

    1、本地推送通知:(Local Notification)
    2、远程推送通知:(Remote Notification)

    iOS通知呈现效果(5)

    1.设置音效,(提醒作用)
    2.设置横幅,
    3.设置弹窗,
    4.锁屏下也可以呈现,
    5.App图标的数字 (即新内容的数量)
    至于显示横幅或者弹窗,取决于用户的设置
    iOS手机设置中:通知中心-选择应用-选择应用下的通知模式-OK!


    Paste_Image.png

    通知的注意点

    1、App在前台运行的时候,通知不会展示出来
    2、点击通知,默认会自动打开推送通知的App
    3、不管App是否打开,通知都可以如期发出

    1、本地推送通知:

    不需要联网就可以发出的通知
    使用场景:
    提醒用户完成一些任务,比如:定时提醒,生活备注,看电影等等

    推送通知属性:

    // 枚举值-发出通知的时间(有局限性)
    @property(nonatomic) NSCalendarUnit repeatInterval;
    // 自定义-发出通知的时间(可以自由设定时间)
    @property(nonatomic,copy) NSCalendar *repeatCalendar;
    // 区域-创建只需要创建一个中心点与半径就可以了
    @property(nonatomic,copy) CLRegion *region
    // 进入区域发出一个通知,设置yes,只会发出一个通知,设置NO就会每次进入这个区域都发送
    @property(nonatomic,assign) BOOL regionTriggersOnce NO
    // 设置通知的内容
    @property(nonatomic,copy) NSString *alertBody;      
     // 决定alertAction是否生效
    @property(nonatomic) BOOL hasAction;
    // 设置滑块的文字
    @property(nonatomic,copy) NSString *alertAction;    
     
    // 设置点击通知的启动图片(一般设置App启动图片后,这里可以随便写)
    @property(nonatomic,copy) NSString *alertLaunchImage;
    // 设置alertTitle,就是通知内容上面的文字
    @property(nonatomic,copy) NSString *alertTitle
     // 设置弹出的声音
    @property(nonatomic,copy) NSString *soundName;
     // 设置App的消息条数
    @property(nonatomic) NSInteger applicationIconBadgeNumber;
     // 设置通知一些额外数据
     @property(nonatomic,copy) NSDictionary *userInfo;
    

    如何发出本地通知:

     // 1.创建本地通知
        UILocalNotification *localNote = [[UILocalNotification alloc] init];
        
        // 2.设置本地通知的内容
        // 2.1.设置通知发出的时间
        localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
        // 2.2.设置通知的内容
        localNote.alertBody = @"在干吗?";
        // 2.3.设置滑块的文字(锁屏状态下:滑动来“解锁”)
        localNote.alertAction = @"解锁";
        // 2.4.决定alertAction是否生效
        localNote.hasAction = NO;
        // 2.5.设置点击通知的启动图片
        localNote.alertLaunchImage = @"123Abc";
        // 2.6.设置alertTitle
        localNote.alertTitle = @"你有一条新通知";
        // 2.7.设置有通知时的音效
        localNote.soundName = @"buyao.wav";
        // 2.8.设置应用程序图标右上角的数字
        localNote.applicationIconBadgeNumber = 999;
        
        // 2.9.设置额外信息
        localNote.userInfo = @{@"type" : @1};
        
        // 3.调用通知
        [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
    }
    

    使用注意:
    iOS7,不需要用户授权就可发出通知,而iOS8以后,必须用户授权才可以发出通知

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        // 设置应用程序的图标右上角的数字
        [application setApplicationIconBadgeNumber:0];
        
        if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
            [application registerUserNotificationSettings:settings];
        }
        
        // 界面的跳转(针对应用程序被杀死的状态下的跳转)
        // 杀死状态下的,界面跳转并不会执行下面的方法- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification,
        // 所以我们在写本地通知的时候,要在这个与下面方法中写,但要判断,是通过哪种类型通知来打开的
        if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
            // 跳转代码
            UILabel *redView = [[UILabel alloc] init];
            redView.frame = CGRectMake(0, 0, 200, 300);
            redView.numberOfLines = 0;
            redView.font = [UIFont systemFontOfSize:12.0];
            redView.backgroundColor = [UIColor redColor];
            redView.text = [NSString stringWithFormat:@"%@", launchOptions];
            [self.window.rootViewController.view addSubview:redView];
        }
        
        return YES;
    }
    

    监听通知,如果用户打开通知,可以让用户进入一些特定的界面

    /*
     应用程序在进入前台,或者在前台的时候都会执行该方法
     */
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
        // 必须要监听--应用程序在后台的时候进行的跳转
        if (application.applicationState == UIApplicationStateInactive) {
            NSLog(@"进行界面的跳转");
          // 如果在上面的通知方法中设置了一些,可以在这里打印额外信息的内容,就做到监听,也就可以根据额外信息,做出相应的判断
            NSLog(@"%@", notification.userInfo);
            
    // 
            UIView *redView = [[UIView alloc] init];
            redView.frame = CGRectMake(0, 0, 100, 100);
            redView.backgroundColor = [UIColor redColor];
            [self.window.rootViewController.view addSubview:redView];
        }
    }
    

    2、远程推送通知:

    从远程服务器推送给客户端的通知(需要联网)
    远程推送服务---就是APNs
    模拟器无法调试远程推送

    为什么需要远程推送通知:

    解决获取传统数据的局限性,让数据实时更新

    使用场景:

    聊天功能(一般非即时聊天)、推送一下App的内部新功能、版本下载等

    注:所有的苹果设备,在联网状态下,都会与苹果的服务器建立-长连接

    长连接的作用:
    时间效准、系统升级、查找我的iphone、远程通知
    好处:
    数据传输快、数据保持最新状态

    Paste_Image.png Paste_Image.png Paste_Image.png

    我在面试中一般也比较喜欢问面试者这个问题。能解释清楚肯定就有货真价实的开发经验

    使用远程推送

    1、获取苹果获得deviceToken-获取手机UDID+应用的唯一标识(bundel ID)
    2、得到苹果返回的deviceToken
    3、发送deviceToken给公司的服务器
    4、监听用户对通知的点击

    如何调试远程推送功能

    1、真机
    2、调试推送需要的证书文件
    证书自己配置。。。
    3、发布具有推送服务的App
    包含推送的cer证书+某个具有发布资格的电脑,就可以发布

    如何推送
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8
            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
            [application registerUserNotificationSettings:settings];
            [application registerForRemoteNotifications];
        } else { // iOS7
            [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
        }
        
    // 根据远程通知通过UIApplicationLaunchOptionsRemoteNotificationKey打开的情况来进行
        if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
            // 跳转
            // 添加一个红色的View
        }
        
        return YES;
    }
    
    // 获取DeviceToken
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        // 将DeviceToken传给服务器
        NSLog(@"%@", deviceToken.description);
    }
    
    // 正常接到远程通知的时候会调用这个方法
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    {
        NSLog(@"%@", userInfo);
        // 正常打开推送后,
    }
    
    // 后台操作(根据收到推送,让程序自己执行一些操作,不管用户是否点击推送)
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
        NSLog(@"---------");
        UIView *redV = [[UIView alloc] init];
        redView.backgroundColor = [UIColor redColor];
        redView.frame = CGRectMake(100, 100, 100, 100);
        [self.window.rootViewController.view addSubview:redV];
        
        // 1.打开后台模式 2.告诉系统是否有新内容的更新 3.发送的通知有固定的格式("content-available":"1")
        // 2.告诉系统有新内容
        completionHandler(UIBackgroundFetchResultNewData);
    }
    
    1、打开后台模式
    Paste_Image.png
    2、告诉系统有新内容

    completionHandler(UIBackgroundFetchResultNewData);

    3、发送通知有固定格式

    ("content-available":"1")

    找的这张图:也有相应的模拟推送代码,需要的可以联系我


    Paste_Image.png

    一般开发中直接使用(jpush)激光推送就可以快速完成App的推送功能。具体按照官方文档来进行.(有空会写一篇专门针对激光推送的文稿)

    相关文章

      网友评论

      本文标题:iOS开发--本地通知与远程通知

      本文链接:https://www.haomeiwen.com/subject/xarskttx.html