zoukankan      html  css  js  c++  java
  • 本地通知

    本地通知,local notification,用于基于时间行为的通知,比如有关日历或者todo列表的小应用。另外,应用如果在后台执行,iOS允许它在受限的时间内运行,它也会发现本地通知有用。比如,一个应用,在后台运行,向应用的服务器端获取消息,当消息到达时,通过本地通知机制通知用户。

    本地通知是UILocalNotification的实例,主要有三类属性:

    • scheduled time,时间周期,用来指定iOS系统发送通知的日期和时间;
    • notification type,通知类型,包括警告信息、动作按钮的标题、应用图标上的badge(数字标记)和播放的声音;
    • 自定义数据,本地通知可以包含一个dictionary类型的本地数据。

    对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略。

    如果就写个简单的定时提醒,是很简单的,比如这样:

    示例写的很简单,启动应用后,就发出一个定时通知,10秒后启动。这时按Home键退出,一会儿就会提示上图的提示信息。如果应用不退出则无效。

    代码如下:

    UILocalNotification *notification=[[UILocalNotification alloc] init]; 
    if (notification!=nil) { 
        NSLog(@">> support local notification"); 
        NSDate *now=[NSDate new]; 
        notification.fireDate=[now addTimeInterval:10]; 
        notification.timeZone=[NSTimeZone defaultTimeZone]; 
        notification.alertBody=@"该去吃晚饭了!"; 
        [[UIApplication sharedApplication]   scheduleLocalNotification:notification];

     

    更详细的代码见官方文档:《Scheduling, Registering, and Handling Notifications》,可以设置比如声音,比如用户定义数据等。

    设置更多本地通知的信息:
    • 设置icon上数字。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
        // Override point for customization after application launch. 
        ///////////// 
      application.applicationIconBadgeNumber = 0; 
        // Add the view controller’s view to the window and display. 
        [self.window addSubview:viewController.view]; 
        [self.window makeKeyAndVisible];

        return YES; 
    }

    • 添加通知时间,通知类型,取消通知

    #pragma mark – 
    #pragma mark onChageValue 
    -(IBAction)onChangeValue:(id)sender 

        UISwitch *switch1=(UISwitch *)sender; 
        if (switch1.on) { 
            UILocalNotification *notification=[[UILocalNotification alloc] init]; 
            NSDate *now1=[NSDate date];  
            notification.timeZone=[NSTimeZone defaultTimeZone]; 
            notification.repeatInterval=NSDayCalendarUnit; 
            notification.applicationIconBadgeNumber = 1; 
            notification.alertAction = NSLocalizedString(@"显示", nil); 
            switch (switch1.tag) { 
                case 0: 
                { 
                    notification.fireDate=[now1 dateByAddingTimeInterval:10]; 
                    notification.alertBody=self.myLable1.text; 
                } 
                    break; 
                case 1: 
                { 
                    notification.fireDate=[now1 dateByAddingTimeInterval:20]; 
                    notification.alertBody=self.myLable2.text; 
                } 
                    break; 
                case 2: 
                { 
                    notification.fireDate=[now1 dateByAddingTimeInterval:30]; 
                    notification.alertBody=self.myLable3.text; 
                } 
                    break; 
                default: 
                    break; 
            } 
            [notification setSoundName:UILocalNotificationDefaultSoundName]; 
            NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
                                  [NSString stringWithFormat:@"%d",switch1.tag], @"key1", nil]; 
            [notification setUserInfo:dict]; 
            [[UIApplication sharedApplication]   scheduleLocalNotification:notification]; 
        }else { 
            NSArray *myArray=[[UIApplication sharedApplication] scheduledLocalNotifications]; 
            for (int i=0; i<[myArray count]; i++) { 
                UILocalNotification    *myUILocalNotification=[myArray objectAtIndex:i]; 
                if ([[[myUILocalNotification userInfo] objectForKey:@"key1"] intValue]==switch1.tag) { 
                    [[UIApplication sharedApplication] cancelLocalNotification:myUILocalNotification]; 
                } 
            } 
        } 
    }

     

    ***************Demo**************

    #import <Foundation/Foundation.h>

    @interface LocalNotifications : NSObject

    // 设置本地通知

    + (void)registerLocalNotification:(NSInteger)alertTime;

    // 取消当前通知

    + (void)cancelLocalNotificationWithKey:(NSString *)key;

    @end

    #import "LocalNotifications.h"

    // 1.如果需要设置多个通知,key就不能写成宏定义了,需要动态生成

    // 2.以便在用户关闭某个通知时,可以移除对应的本地通知

    #define KAlarmLocalNotificationKey @"KAlarmLocalNotificationKey"

    @implementation LocalNotifications

    // 设置本地通知

    + (void)registerLocalNotification:(NSInteger)alertTime

    {

        UILocalNotification *notification = [[UILocalNotification alloc] init];

        // 设置触发通知的时间

        NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];

        

        notification.fireDate = fireDate;

        // 时区

        notification.timeZone = [NSTimeZone defaultTimeZone];

        // 设置重复的间隔

        notification.repeatInterval = kCFCalendarUnitSecond;

        // 通知内容

        notification.alertBody =  @"发现新版本,请前往更新";

        notification.applicationIconBadgeNumber = 1;

        // 通知被触发时播放的声音

        notification.soundName = UILocalNotificationDefaultSoundName;

        // 通知参数

        NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"是否前往更新" forKey:@"key"];

        notification.userInfo = userDict;

        

        // ios8后,需要添加这个注册,才能得到授权

        if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {

            UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;

            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];

            [[UIApplication sharedApplication] registerUserNotificationSettings:settings];

            // 通知重复提示的单位,可以是天、周、月

            notification.repeatInterval = NSCalendarUnitDay;

        } else {

            // 通知重复提示的单位,可以是天、周、月

            notification.repeatInterval = NSDayCalendarUnit;

        }

        

        // 执行通知注册

        [[UIApplication sharedApplication] scheduleLocalNotification:notification];

    }

    // 取消某个本地推送通知

    + (void)cancelLocalNotificationWithKey:(NSString *)key

    {

        // 获取所有本地通知数组

        NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

        

        for (UILocalNotification *notification in localNotifications) {

            NSDictionary *userInfo = notification.userInfo;

            if (userInfo) {

                // 根据设置通知参数时指定的key来获取通知参数

                NSString *info = userInfo[key];

                

                // 如果找到需要取消的通知,则取消

                if (info != nil) {

                    [[UIApplication sharedApplication] cancelLocalNotification:notification];

                    break;

                }

            }

        }

    }

    @end

  • 相关阅读:
    Netty事件监听和处理(上)
    Netty事件监听和处理(上)
    Netty事件监听和处理(上)
    nginx 反向代理转发导致css,js,图片失效
    nginx 反向代理转发导致css,js,图片失效
    nginx 反向代理转发导致css,js,图片失效
    【leetcode】507.Perfect Number
    【leetcode】507.Perfect Number
    【leetcode】507.Perfect Number
    Javascript中的类实现
  • 原文地址:https://www.cnblogs.com/xmqios/p/5036395.html
Copyright © 2011-2022 走看看