第一次使用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 前言: 排版 ...
    庭說閱讀 11,172評論 6 13
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • 百日初臨,糕分三塊香千瞬。 燭溫光潤,母意連刀刃。 秀口輕吹,祝愿平生順。 隨風趁,教誨真諄,雨后逢佳訊。
    作家魏潘閱讀 996評論 2 16
  • 天快亮了嗎?終于可以“逃離”了。看到這個詞,誰能會想得到,是從媽媽家逃離呢?一提到媽媽,人們會自然聯想到的詞是慈愛...
    健康是福_4889閱讀 180評論 0 0
  • 這周陽光出來了,雨神終于走了。辭職在家幾天休息,心態也在不斷發生變化。春天,到處鮮花盛開。怎么拍都是這么漂亮!沒想...
    Annbaby閱讀 172評論 0 0