一.
先说一下我的项目使用本地通知的环境:
1.人脸机有人人脸识别开门的时候,识别人脸,并把此人信息发送给服务器。
2.服务器接受到此人信息后立即发送给手机端。
3.这就要求手机端能够保持实时接收数据,我用的是socket长连接,保持网络连接不断开。
4.手机端接收到数据后解析显示。
二.
socket保持网络不断开的方法:
这里的网络请求不是要从服务器获取数据,只是为了保持和服务器的链接,而且为了在App在哪个页面都能保持这个链接,所以在一登录的时候就发送一个socket网络请求,这里的socket的请求体可以随便写,只要能连上服务器就可以,我用的是登录指令,如下:
NSDictionary *parmDictionary= [NSDictionary dictionaryWithObjectsAndKeys:user,@"user",
password,@"password",
@"",@"cardnumber",
@"",@"visitmobil",
@"",@"visitname",
@"",@"deviceid",
@"",@"newpassword",
@"",@"messageID",
@"1",@"userType",nil];
NSDictionary *jsonDictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"Login",@"command",
parmDictionary,@"parameter",nil];
这样就和服务器连接上了,而保持不断开的方法,只要注销掉socket关闭连接的代理方法就可以,如下:
//- (void)viewWillDisappear:(BOOL)animated{
// [self disconnect :clientSocket];
//}
//
////断开连接
//-(void) disconnect:(AsyncSocket *)sock{
// NSLog(@"device socket exit!!!");
// [sock setDelegate:nil];
// [sock disconnect];
// [_clientSocket release];
//}
这样你的项目就和服务器保持了一直连接状态,只要服务器又数据发过来,你就可以接收到了。
三. 下面说一下实现本地通知
1.如果有服务器发送来数据,会在下面这个方法里接收到,创建通知:
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
//这里接收到数据
接收到数据后,创建通知
// 1.创建通知
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
// 2.设置通知的必选参数
// 设置通知显示的内容
localNotification.alertBody = @"您有一条通知,请注意查看!";
// 设置通知的发送时间
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];
localNotification.soundName = @"win.aac";
//消息数量
localNotification.applicationIconBadgeNumber = [[[UIApplication sharedApplication] scheduledLocalNotifications] count]+1;
//localNotification.applicationIconBadgeNumber = 1;
// 设置锁屏状态下, "滑动XXX"
localNotification.hasAction = YES;
localNotification.alertAction = @"解锁查看!";
// NSDictionary *infoDic = [NSDictionary dictionaryWithObject:@"name" forKey:@"key"];
//
// localNotification.userInfo = infoDic;
// 3.发送通知
根据通知的发送时间(fireDate)发送通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
这样就发送了一个通知,而显示通知这里有两种情况:
AppDelegate.m
1.程序在前台
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"接收到本地通知");
// 查看当前的状态出于(前台: 0)/(后台: 2)/(从后台进入前台: 1)
NSLog(@"applicationState.rawValue: %zd", application.applicationState);
// 执行响应操作
// 如果当前App在前台,执行操作
if (application.applicationState == UIApplicationStateActive) {
NSLog(@"执行前台对应的操作");
//我这里做了一个弹窗提示。
} else if (application.applicationState == UIApplicationStateInactive) {
// 后台进入前台
NSLog(@"执行后台进入前台对应的操作");
} else {
// 当前App在后台
NSLog(@"执行后台对应的操作");
}
}
我是做了一个alert弹窗提示,不重点细说了。
2.程序在后台,弹出条幅,点击通知条幅,唤醒App。
首先
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"接收到本地通知");
// 查看当前的状态出于(前台: 0)/(后台: 2)/(从后台进入前台: 1)
NSLog(@"applicationState.rawValue: %zd", application.applicationState);
// 执行响应操作
// 如果当前App在前台,执行操作
if (application.applicationState == UIApplicationStateActive) {
NSLog(@"执行前台对应的操作");
} else if (application.applicationState == UIApplicationStateInactive) {
// 后台进入前台
NSLog(@"执行后台进入前台对应的操作");
} else {
// 当前App在后台
NSLog(@"执行后台对应的操作");
}
}
然后,在后台的代理方法和后台进入前台的代理方法里
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:nil];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[UIApplication sharedApplication]endBackgroundTask:UIBackgroundTaskInvalid];
[application setApplicationIconBadgeNumber:0]; //清除角标
//[application cancelAllLocalNotifications];
}
另外:如果通知弹窗没有声音,检查一下info-plist里的voip 是否设置好了。
注意:此文章只是自己的总结,并不是一个技术博客,仅供参考,如有问题,欢迎留言。
补充一下:上面socket连接,并不是我写的那么简单几句话,他还包括很多方法和代理方法,我只是简单说了一下怎么保持连接的流程,如果有想详细了解socket的使用的同学,请私信我。