簡述
UILocalNotification
一個UILocalNotification對象指定一個通知,一個應用程序可以在特定的日期和時間安排進行演示。操作系統負責在其預定時間提供本地通知;要做到這一點可以應用程序不必運行。雖然和通知類似,因為它們用于顯示警報,播放聲音和徽章應用程序圖標遠程通知,它們是由與本地傳遞,并且不需要與遠程服務器連接。
本地通知主要用于應用程序與基于計時器的行為和簡單的日歷或待辦事項應用程序。即在后臺運行的應用程序還可以安排本地通知,告知進入的消息,聊天,或更新的用戶。一個應用程序只能有計劃通知的數量有限;
當您創建一個本地通知,您必須指定一個特定日期或地理區域為觸發交付通知。基于日期的通知在指定的日期和時間交付,可時區變化需要作出。當用戶進入或退出特定區域的基于區域的通知交付。在這兩種情況下,你可以指定通知書是否是一次性事件或可再次改期并交付使用。
或presentLocalNotificationNow:UiApplication類的方法創建一個UILocalNotification對象后,即使用scheduleLocalNotification安排吧。該scheduleLocalNotification:方法使用火日期如期交貨;該presentLocalNotificationNow:方法立即呈現通知,而不管fireDate的值。您可以取消使用cancelLocalNotification一個或多個本地通知:或cancelAllLocalNotifications的對象的UIApplication方法。
當系統提供了一個本地通知,幾件事情可能發生,這取決于該應用狀態和通知類型。如果應用程序是不是最前面可見,系統會顯示警告信息,徽章的應用程序,播放聲音,無論是在通知規定的。如果通知是警報和用戶點擊操作按鈕(或者,如果設備被鎖定,拖動打開動作滑塊),應用程序被喚醒或啟動。 (如果用戶點擊指定使用additionalActions屬性自定義操作之一,應用程序被喚醒或射入背景)。在其應用:didFinishLaunchingWithOptions:方法中,應用程序的委托可以從啟動選項字典獲得UILocalNotification對象使用UIApplicationLaunchOptionsLocalNotificationKey鍵。委托可以檢查該通知的屬性,并且如果通知包括在其用戶信息的字典的自定義數據,它可以訪問該數據,并相應地進行處理。另一方面,如果本地通知只徽章的應用圖標,并且響應用戶啟動該應用程序,該應用程序:didFinishLaunchingWithOptions:方法中被調用,但不UILocalNotification對象被包括在選項字典。當用戶選擇一個自定義操作,應用程序委托的申請:handleActionWithIdentifier:forLocalNotification:completionHandler:方法被調用來處理的動作。
如果應用程序是最重要的可見當系統提供的通知后,應用程序委托的申請:didReceiveLocalNotification:被調用來處理通知。使用所提供的UILocalNotification對象中的信息來決定采取何種行動。該系統不顯示任何警報,徽章應用程序的圖標,或者發出任何聲音時,應用程序已經最前面。
一個應用程序是負責管理其圖標顯示的證件號碼。例如,如果一個短信應用接收本地通知后,處理所有傳入的消息,應該由的UIApplication對象的applicationIconBadgeNumber屬性設置為0刪除圖標徽章。
效果展示
代碼
發送代碼
- (IBAction)SendNotification_Click:(id)sender {
//新建本地通知
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
//觸發通知時間
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:6];
//重復間隔
//localNotification.repeatInterval = kCFCalendarUnitDay;
//設置通知的交付日期
localNotification.timeZone = [NSTimeZone defaultTimeZone];
//通知內容
localNotification.alertBody = @"本地通知";
//應用角標
localNotification.applicationIconBadgeNumber = 1;
//應用提示音
localNotification.soundName = UILocalNotificationDefaultSoundName;
//通知參數
localNotification.userInfo = @{@"key": @"。。。。"};
//這組事件的名稱
localNotification.category = @"tblocalNotification";
//發送通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
可以設置系統提示方式
如果設置為提醒模式,那么可在SendNotification_Click
方法里追加
//提示框的按鈕,提示方式要設置為alert
localNotification.alertAction = @"查看"; //提示框按鈕
localNotification.hasAction = YES; //是否顯示額外的按鈕,為no時alertAction消失
如果設置為橫幅模式
UIMutableUserNotificationAction
對象,當一個通知交付,系統會顯示與通知相關聯的每個自定義操作的按鈕。按一個按鈕就啟動您的應用(無論是在前臺或后臺),并為您進行相應的操作機會。您可以使用這個類來配置有關,顯示該按鈕的細節和信息您的應用程序需要執行相應的動作。
- (void)registerLocalNotification{
UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
//內部識別操作的字符串
action1.identifier = @"smile";
//本地化的字符串作為按鈕標題為操作使用
action1.title = @"";
//在該模式下進行操作時運行應用程序(在后臺處理)
action1.activationMode = UIUserNotificationActivationModeBackground;
//指示執行操作之前,用戶是否必須解鎖設備。
action1.authenticationRequired = YES;
//destructive 破壞性按鈕,多用于刪除
//destructive屬性設置后,在通知欄或鎖屏界面左劃,按鈕顏色會變為紅色
//如果兩個按鈕均設置為YES,則均為紅色(略難看)
//如果兩個按鈕均設置為NO,即默認值,則第一個為藍色,第二個為淺灰色
//如果一個YES一個NO,則都顯示對應的顏色,即紅藍雙色 (CP色)。
action1.destructive = NO;
//第二個動作
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
action2.identifier = @"text";
action2.title = @"評論";
//當點擊的時候不啟動程序,在后臺處理
action2.activationMode = UIUserNotificationActivationModeBackground;
//設置了behavior屬性為 UIUserNotificationActionBehaviorTextInput 的話,則用戶點擊了該按鈕會出現輸入框供用戶輸入
action2.behavior = UIUserNotificationActionBehaviorTextInput;
//這個字典定義了當用戶點擊了右按鈕后,輸入框右側的按鈕名稱,如果不設置該字典,則右側按鈕名稱默認為 “發送”
action2.parameters = @{UIUserNotificationTextInputActionButtonTitleKey:@"發送"};
//創建動作(按鈕)的類別集合
UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
//這組動作的唯一標示(要和你發送通知時填寫的cateory的名稱保持一致)
category.identifier = @"tblocalNotification";
//最多支持兩個,如果添加更多的話,后面的將被忽略
[category setActions:@[action1, action2] forContext:(UIUserNotificationActionContextDefault)];
//創建UIUserNotificationSettings,并設置消息的顯示類類型
UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObject:category]];
//注冊通知
[[UIApplication sharedApplication] registerUserNotificationSettings:uns];
}
//注冊服務器推送,在應用第一次啟動時彈出對話框讓用戶確認是否開啟消息推送,注冊的消息類型有BadgeNumber, 聲音, 頂部消息框. 可以選擇其中的一種或多種。
// [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
// (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
上面代碼最好在應用第一次啟動時注冊通知,即 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法內
應用程序正在運行接收到本地通知
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"%@", notification.userInfo);
NSLog(@"app在前臺狀態時收到推送消息");
}
在非本App界面時收到本地消息,下拉消息會有快捷回復的按鈕,點擊按鈕后調用的方法,根據identifier來判斷點擊的哪個按鈕,notification為消息內容
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler
{
if ([identifier isEqualToString:@"smile"]) {
NSLog(@"smile");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"smile" message:nil delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil];
[alert show];
} else if ([identifier isEqualToString:@"text"]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"評論:%@", responseInfo[UIUserNotificationActionResponseTypedTextKey]] message:nil delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil];
[alert show];
}
completionHandler();
}
博主在測試的時候,設置了循環通知,然后就是被一直提醒,把代碼循環通知注釋掉也沒有用,最后,想到了,是不是有注銷通知的方法,經查:
- (IBAction)remove:(id)sender {
for (UILocalNotification *obj in [UIApplication sharedApplication].scheduledLocalNotifications) {
if ([obj.userInfo.allKeys containsObject:@"key"]) {
[[UIApplication sharedApplication] cancelLocalNotification:obj];
}
}
//直接取消全部本地通知
//[[UIApplication sharedApplication] cancelAllLocalNotifications];
}
最后,要在開啟
APNS
注冊通知
在應用第一次啟動時注冊通知,即 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法內
//注冊服務器推送,在應用第一次啟動時彈出對話框讓用戶確認是否開啟消息推送,本句注冊的消息類型有BadgeNumber, 聲音, 頂部消息框. 可以選擇其中的一種或多種。
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
獲取token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken{
NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
//獲取終端設備標識,這個標識需要通過接口發送到服務器端,服務器端推送消息到APNS時需要知道終端的標識,APNS通過注冊的終端標識找到終端設備。
NSLog(@"My token is:%@", token);
}
獲取消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo
{
//在此處理接收到的消息。
NSLog(@"Receive remote notification : %@",userInfo);
}
本文到這里就結束了,APNS可以結合本地通知進行使用!