iOS開發-APNS and LocalNotification

簡述

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可以結合本地通知進行使用!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容

  • 應用程序必須進行適當配置,才可以接受本地或遠程通知。配置過程在iOS和OS X略有不同,但基本原理是相同的。在啟動...
    shenzhenboy閱讀 1,402評論 1 2
  • 概述 在多數移動應用中任何時候都只能有一個應用程序處于活躍狀態,如果其他應用此刻發生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,539評論 1 8
  • 極光推送: 1.JPush當前版本是1.8.2,其SDK的開發除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,758評論 10 16
  • 推送通知 注意:這里說的推送通知跟NSNotification有所區別 NSNotification是抽象的,不可...
    iOS開發攻城獅閱讀 4,278評論 1 13
  • 每個人都有一個死角, 自己走不出來, 別人也闖不進去。 我把最深沉的秘密放在那里。 你不懂我,我不怪你。 每個人都...
    鈺婧Erica閱讀 200評論 0 0