zoukankan      html  css  js  c++  java
  • iOS开发——本地通知,本地推送(UILocalNotification)

      iOS开发中经常用到本地通知,有时也叫做本地推送,两者都是同一个类UILocalNotification,这个类可以用于开发者灵活控制一些需要推送到通知栏的信息,比如提示信息,日程提醒或者是一些其他应用信息,它和远程通知(也叫远程推送,RemoteNotification)本质没有多大区别,唯一区别在于发起的地方不同,本地通知在APP内发起,而远程通知由远端服务器发起通过APNS推送到设备,两者展示的方式都一样,都会出现在通知栏,都可以携带信息。下面用通过三个步骤来讲下本地通知的使用方法。

    一、发起通知,也就是本地通知的初始化,需要注意的是iOS8及以后发起通知需要先进行一个注册。

     1 - (void)initializeLocalNotification {
     2     
     3     // 初始化本地通知
     4     UILocalNotification *notification = [[UILocalNotification alloc] init];
     5     // 设置启动时间
     6     notification.fireDate = [[NSDate date] dateByAddingTimeInterval:15.0f];
     7     // 设置时区
     8     notification.timeZone = [NSTimeZone defaultTimeZone];
     9     // 设置用户信息
    10     notification.userInfo = @{
    11                               @"test":@"test",
    12                               };
    13     // 通知栏提示信息
    14     notification.alertBody = @"this is a local notification";
    15     // 通知音效
    16     notification.soundName = UILocalNotificationDefaultSoundName;
    17     // badgeNumber
    18     notification.applicationIconBadgeNumber = 1;
    19     
    20     // iOS8及以后需要添加这个注册,才能得到授权
    21     if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    22         UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
    23         UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type
    24                                                                                  categories:nil];
    25         [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    26     }
    27     
    28     // 调用通知
    29     [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    30 }

    模拟器也可以接受本地通知,效果如下:

    二、接收通知,发起了通知,如果我们需要处理接收到的信息,那么需要在AppDelegate里面作以下处理。

     1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     2     
     3     // 如果程序被kill掉,点击通知栏通知进入程序,那么本地通知(远程通知也是一样)将从这里接收
     4     // 判断是否有本地通知信息,判断远程通知的Key为 UIApplicationLaunchOptionsRemoteNotificationKey
     5     if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
     6         [self dealLocalNotificationWithUserInfo:launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]];
     7     }
     8     
     9     return YES;
    10 }
    11 
    12 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    13     
    14     // 如果程序只是挂起,或者是程序正在运行,那么本地通知(远程通知也类似,不过是在另外一个代理方法里接收)将从这里接受
    15     [self dealLocalNotificationWithUserInfo:notification.userInfo];
    16 }
    17 
    18 /**
    19  *  处理本地通知
    20  *
    21  *  @param userInfo 通知内容
    22  */
    23 - (void)dealLocalNotificationWithUserInfo:(NSDictionary *)userInfo {
    24     
    25     NSLog(@"receive localNotification - %@", userInfo);
    26 }

    打印出的效果如下:

    三、取消通知,有时候我们需要取消已经schedule的本地通知,那么就需要使用到:

     1 - (void)cancelLocalNotification {
     2     
     3     // 取消所有本地通知
     4     [[UIApplication sharedApplication] cancelAllLocalNotifications];
     5     
     6     // 取消特定本地通知
     7     // 通过遍历的方式找到你想要取消的通知
     8     for (UILocalNotification *notification in [UIApplication sharedApplication].scheduledLocalNotifications) {
     9         // 判断你需要取消的通知,本地的通知的很多属性都可以用来判断,启动日期、userInfo、alertBody都可以
    10         if ([notification.userInfo[@"test"] isEqualToString:@"test"]) {
    11             [[UIApplication sharedApplication] cancelLocalNotification:notification];
    12         }
    13     }
    14 }

    Demo地址:https://github.com/LeoTangCN/LocalNotificationDemo

    以上即是本次分享,多谢观看!

  • 相关阅读:
    cs61b project1
    CS61b lab5
    leetcode DP
    Leetcode 还未解决的bug
    Git使用总结
    Mac TensorFlow Anaconda
    eclipse C++ ld: 1 duplicate symbol for architecture x86_64
    Leetcode Hashtable 1-5
    EC 601 PYTHONPATH
    EC 601 OpenCV Install
  • 原文地址:https://www.cnblogs.com/leotangcn/p/4973962.html
Copyright © 2011-2022 走看看