UILocalNotification本地推送机制

本文详细介绍了如何在iOS应用中实现本地推送功能,包括创建、接收和取消本地推送的方法,并提供了具体的代码示例。
1、增加一个本地推送

//设置20秒之后 

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:20];

    //chuagjian一个本地推送

    UILocalNotification *noti = [[[UILocalNotification alloc] init] autorelease];

    if (noti) {

        //设置推送时间

        noti.fireDate = date;

        //设置时区

        noti.timeZone = [NSTimeZone defaultTimeZone];

        //设置重复间隔

        noti.repeatInterval = NSWeekCalendarUnit;

        //推送声音

        noti.soundName = UILocalNotificationDefaultSoundName;

        //内容

        noti.alertBody = @"推送内容";

        //显示在icon上的红色圈中的数子

        noti.applicationIconBadgeNumber = 1;

        //设置userinfo 方便在之后需要撤销的时候使用

        NSDictionary *infoDic = [NSDictionary dictionaryWithObject:@"name" forKey:@"key"];

        noti.userInfo = infoDic;

        //添加推送到uiapplication        

        UIApplication *app = [UIApplication sharedApplication];

        [app scheduleLocalNotification:noti];  

    }

 

2、程序运行时接收到本地推送消息

 

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

{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"接收到本地提醒 in app"

message:notification.alertBody

   delegate:nil

  cancelButtonTitle:@"确定"

  otherButtonTitles:nil];

[alert show];

//这里,你就可以通过notification的useinfo,干一些你想做的事情了

application.applicationIconBadgeNumber -= 1;

}

 

3、取消一个本地推送

 

UIApplication *app = [UIApplication sharedApplication];

    //获取本地推送数组

    NSArray *localArr = [app scheduledLocalNotifications];

    

    //声明本地通知对象

    UILocalNotification *localNoti;

    

    if (localArr) {

        for (UILocalNotification *noti in localArr) {

            NSDictionary *dict = noti.userInfo;

            if (dict) {

                NSString *inKey = [dict objectForKey:@"key"];

                if ([inKey isEqualToString:key]) {

                    if (localNoti){

                        [localNoti release];

                        localNoti = nil;

                    }

                    localNoti = [noti retain];

                    break;

                }

            }

        }

        

        //判断是否找到已经存在的相同key的推送

        if (!localNoti) {

            //不存在 初始化

            localNoti = [[UILocalNotification alloc] init];

        }

        

        if (localNoti && !state) {

            //不推送 取消推送

            [app cancelLocalNotification:localNoti];

            [localNoti release];

            return;

        }

}



    //删除通知

    //1)删除全部

    [[UIApplication sharedApplication] cancelAllLocalNotifications];

     //2)删除单独一个通知

    //需要userInfo属性来配合,找到具体需要删除的通知对象,在userInfo中给一个唯一的标识

    //scheduledLocalNotifications,拿到全部可以激活的通知对象

    NSArray* lns = [UIApplication sharedApplication].scheduledLocalNotifications;

    NSLog(@"%@", localNotification);

    NSLog(@"%@", lns);

     //我们可以通过遍历这个数组,找到我们需要删除的那个本地通知

    for (UILocalNotification* ln in lns) {

        NSDictionary* userInfo = ln.userInfo;

        if ([userInfo[@"id"] isEqualToString:@"123"]) {

            [[UIApplication sharedApplication] cancelLocalNotification:ln];

        }

    }

   //设置完以上的内容 还不能完成 UILocalNotification 因为 app 进入后台之后就被挂起,那如何让进入

    //后台的app 能提醒用户 消息了呢?

    //简单 只需要 AppDelegate 里面完成2步操作

    

    //处理UILocalNotification

    //在提醒框动作按钮被点击后,应用开始运行时,可以在-(BOOL)application:didFinishLaunchingWithOptions:这个Application delegate方法中处理。可以通过以下方式来加载为最近未处理的Notification

    //UILocalNotification * localNotif=[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    

    //如果应用正在运行时,可以通过覆盖在Application Delegate中的方法

    //-(void)application:didReceiveLocalNotification:来处理Notification。作为方法的第二个参数为UILocalNotification对象,只需处理对象携带的userInfo来处理响应的动作。


入口类的两个方法

//程序没打开,后台没运行,这个时候收到通知,执行这个方法。

//响应通知的时候,如果程序没有打开,也没有在后台运行,那么就需要在这个方法中处理。

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

    //图标右上角归零

    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

    // Override point for customization after application launch.

   // UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"通知" message:[launchOptions description] delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

//    [alertView show];

    //只有在点击通知进来的时候才会有,正常启动是没有这个keyvalue

    UILocalNotification* notification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

    if (notification) {

        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"通知" message:@"321321321" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

        [alertView show];

    }

    return YES;

}

//响应通知需要两个方法,

//在当前程序是发出通知的程序的时候,这个时候不会显示通知,但是会调用这个方法。需要自己来处理通知的显示。

//当前程序不是发出通知的程序,如果发出通知的程序没有运行,那么也不调用这个方法。

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

    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

    NSLog(@"通知出现了");

    UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"通知" message:notification.alertBody delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

    [alertView show];

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值