UILocalNotification

一、UILocalNotification相关参数

(1)fireDate,执行本地通知的时间;

(2)soundName,通知声音的名称;

(3)repeatInterval,重复的周期(如kCFCalendarUnitDay,每天通知一次);

(4)timeZone,当地时区;

(5)applicationIconBadgeNumber,app icon上得数字提示;

(6)alertBody,弹出的通知内容;

(7)alertAction,点击动作;


二、创建UILocalNotification

(1)创建一个本地通知,10秒后弹出通知。

//进入后台,创建一个本地通知
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    
    if (notification) {
       
        notification.repeatInterval = kCFCalendarUnitDay;
        
        notification.timeZone = [NSTimeZone defaultTimeZone];
        NSDate *currentDate = [NSDate date];
        
        NSDate *sinceNow = [currentDate dateByAddingTimeInterval:10];
        notification.fireDate = sinceNow;
        
        notification.applicationIconBadgeNumber = 1;
        
        notification.soundName = UILocalNotificationDefaultSoundName;
        notification.alertBody = @"测试通知";
        notification.alertAction = @"打开";
        
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    }


(2)在进入前台页面时- (void)applicationDidBecomeActive:,设置appicon的applicationIconBadgeNumber的值为0;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];


三、IOS8(以上)请求授权

原因是因为在ios8中,设置应用的application badge value需要得到用户的许可。使用如下方法咨询用户是否许可应用设置application badge value,在application: didFinishLaunchingWithOptions:中加入以下代码。

//IOS8以上的系统
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 8.0) {
        
        if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
            
            UIUserNotificationSettings *noteSetting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound
                                                                                        categories:nil];
            
            [[UIApplication sharedApplication] registerUserNotificationSettings:noteSetting];
        }
    }

备注:在IOS8 -- iphone6调试报错:

2015-12-14 16:40:50.997 Mannyi1[3932:1764085] Attempting to badge the application icon but haven't received permission from the user to badge the application

原因是:没有用户权限,无法设置badge的值,奇怪的是权限已设置(待研究)。


四、其他

触发通知有两种情况:一种是程序没有运行,另一种是程序已经运行;已经在运行又分为两种情况:后台运行触发和前台运行触发。

(1)我先说明一下程序没有运行的情况,可以在application: didFinishLaunchingWithOptions:函数中判断是否存在UIApplicationLaunchOptionsLocalNotificationKey。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{    

    UILocalNotification *loc = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    if(loc!=nil){

        NSDictionary *dic= loc.userInfo//就使本地通知中传递过的NSDictionary,我们可以获取其中的参数。

    }

}

(2)程序已运行,在后台运行通知的时间到了,不会主动触发- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification函数,需要用户点击才会触发;程序在前台运行,会出现这样的一种情况就是:通知时间到了会触发函数,用户在通知之中心点击通知也会触发函数。所以需要区别这两种情况,用到的方法就是:当前时间与触发时间比较在很小的范围内则表示时间到了触发,反之表示在用户在通知中心点击通知触发例如:

if([[formatter dateFromString:[formatter stringFromDate:[NSDate date]]] timeIntervalSinceDate:notification.fireDate] > 0.5) {

                    //用户点击了,

                }else{

               //时间到了触发的

 }


以下的例子是判断激活状态的,application: didReceiveLocalNotification函数;

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    
    //if ([[notification.userInfo objectForKey:@"id"] isEqualToString:@"affair.schedule"]) {
    //判断应用程序当前的运行状态,如果是激活状态,则进行提醒,否则不提醒
    if (application.applicationState == UIApplicationStateActive) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:notification.alertBody delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:notification.alertAction, nil];
        [alert show];
    }
    //}
}


你可能感兴趣的:(本地通知)