一.
先說一下我的項目使用本地通知的環境:
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的使用的同學,請私信我。