第一次使用socket网络请求实现本地通知的总结

一.
先说一下我的项目使用本地通知的环境:
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的使用的同学,请私信我。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 7,373评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 120,986评论 16 134
  • 第一部分、概念的理解 1、什么是Socket? Socket又称之为“套接字”,是系统提供的用于网络通信的方法。它...
    pawn_cheng阅读 3,150评论 0 14
  • 百日初临,糕分三块香千瞬。 烛温光润,母意连刀刃。 秀口轻吹,祝愿平生顺。 随风趁,教诲真谆,雨后逢佳讯。
    碧痕轩主阅读 563评论 2 16
  • 天快亮了吗?终于可以“逃离”了。看到这个词,谁能会想得到,是从妈妈家逃离呢?一提到妈妈,人们会自然联想到的词是慈爱...
    健康是福_4889阅读 88评论 0 0