您的位置:首页 > 移动开发 > IOS开发

ios推送通知之本地推送

2015-09-01 19:37 543 查看
本地推送,ios8和以往ios7有些变化,多了一些注册相关的步骤。如下:


if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
}


如果是ios7就不用上面的代码了


其中UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound是枚举变量,表示要推送的是图标右上角显示的消息数量,手机下拉通知栏的消息,推送的声音。具体的一些变量用法可以自行在xcode里浏览。

简单做个例子:

首先介绍一个方法好让后面的部分理解

推送的程序写在在程序启动时的一个方法中执行的 - (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions

在这个方法中值得注意的一点是launchOptions这个变量,如你们可见,它是一个NSDictionary*类型的变量,重点就是这里。如果我们正常启动程那么launchOptions是空值,在这里正常启动就是点击应用图标或者xcode run进入的意思。如果是其他方式进入,launchOptions就不为空,具体什么情况进入的,就赋值为不同的值。

在控制器中新建一个button ,作用是发送一个通知。button连线到这个方法里

- (IBAction)addLocalNote:(id)sender {
// 1.创建一个本地通知相关属性可以自定义设置
UILocalNotification *localNote = [[UILocalNotification alloc] init];

// 2.设置本地通知的一些属性(通知发出的时间/通知的内容)
// 2.1.设置通知发出的时间
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];
// 2.2.设置通知的内容
localNote.alertBody = @"吃饭了吗?";
// 2.3.设置锁屏界面的文字
localNote.alertAction = @"查看具体的消息";
// 2.4.设置锁屏界面alertAction是否有效
localNote.hasAction = YES;
// 2.5.设置通过点击通知打开APP的时候的启动图片(无论字符串设置成什么内容,都是显示应用程序的启动图片)
localNote.alertLaunchImage = @"111";
// 2.6.设置通知中心通知的标题
localNote.alertTitle = @"222222222222";
// 2.7.设置音效
localNote.soundName = @"buyao.wav";
// 2.8.设置应用程序图标右上角的数字
localNote.applicationIconBadgeNumber = 1;
// 2.9.设置通知之后的属性
localNote.userInfo = @{@"name" : @"张三", @"toName" : @"李四"};

// 3.调度通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}


通知会在这个方法中接受到- (void)application:(UIApplication )application didReceiveLocalNotification:(UILocalNotification )notification。

在这个方法中我没写下如下代码

if (application.applicationState == UIApplicationStateActive) return;

if (application.applicationState == UIApplicationStateInactive) {
// 当应用在后台收到本地通知时执行的跳转代码
UILabel *redView = [[UILabel alloc] init];
redView.backgroundColor = [UIColor redColor];
redView.frame = CGRectMake(0, 100, 300, 400);
redView.numberOfLines = 0;
// redView.text = [NSString stringWithFormat:@"%@", launchOptions];
[self.window.rootViewController.view addSubview:redView];
//同时打印之前设置的信息
NSLog(@"%@", notification);




nslog打印了之前button里面设置的东西。

其中UIApplicationStateActive表示程序在前台,UIApplicationStateInactive表示程序即将进入时的状态。上面的判断的用意就是如果程序在前台就不用显示通知。但是下拉通知栏中还是显示。如果程序运行在后台的话,手机就会弹出通知,当我们点击通知,便会进入程序。然后视图中便会创建一个redView(看上述代码)。



但是如果我们点击了按钮然后马上把程序被杀死了,通知还会继续吗,答案是当然的。大家应该没有忘记刚开始的lauchOPtions这个变量吧,我们在

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


方法中加入如下代码

if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
// 当被杀死状态收到本地通知时执行的跳转代码
// [self jumpToSession];
UILabel *redView = [[UILabel alloc] init];
redView.backgroundColor = [UIColor redColor];
redView.frame = CGRectMake(0, 100, 300, 400);
redView.numberOfLines = 0;
redView.text = [NSString stringWithFormat:@"%@", launchOptions];
[self.window.rootViewController.view addSubview:redView];

4000
UIView *jj=[[UIView alloc] initWithFrame:CGRectMake(0, 200, 100, 100)];
jj.backgroundColor=[UIColor yellowColor];
[self.window.rootViewController.view addSubview:jj];
}




之所以将打印信息写在label中是因为当程序被杀死的那一刻,xcode就不能调试了,只是程序自己在跑。所以为了方便就把信息写在label中方便查看button按钮传递过来的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: