天天看點

iOS 本地通知的實作

iOS本地通知

  • 所有的邏輯都在AppDelegate中, 一個程式更新後使用者長時間沒有使用的提醒
  • 由本地應用觸發的, 它是基于時間行為的一種通知形式, 例如鬧鐘, 提醒事項, 過了一段時間背景程式提醒使用者使用該應用

iOS 通知機制又叫做消息機制, 包括(本地通知, 推送通知)

  • 兩種通知在iOS中的表現一緻, 可以通過橫幅或者彈框兩種形式來告訴使用者, 點選通知可以

打開應用程式, 但是兩種實作原理卻不相同

建立一個本地通知分為以下幾個步驟

  1. 建立UILocationNotification
  2. 設定處理通知的時間fireDate
  3. 配置通知的内容 : 通知主體, 通知聲音, 圖檔數字等
  4. 配置通知傳遞的自定義資料參數userinfo (可選)
  5. 調用通知, 可以使用scheduleLocationNotification 按計劃排程一個通知. 也可以

presentLocationNotificationNow立即調用通知

進入應用後如果沒有注冊通知, 需要首先注冊通知請求使用者允許通知, 一旦調用完注冊方法, 無論使用者是否選擇允許通知此刻都會調用應用程式

-- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings

代理方法

在這個方法中根據使用者的選擇, 如果允許通知, 則會按照前面的步驟建立通知并在一定時間後執行

需要注意

  1. 在使用通知之前必須注冊通知類型(聲音, 圖示, 内容)
  2. 本地通知是由作業系統統一排程, 隻有關閉應用, 或者應用進入背景才能收到通知
  3. 通知的聲音是由iOS系統播放的, 格式必須是Linear PCM、

    MA4(IMA/ADPCM)、µLaw、aLaw中的一種, 播放時間的限制(30s), 否則被系統聲音替換,自定義的聲音必須放到main Boundle中

  4. 本地通知的數量有限, 最近的本地通知最多隻能有64個, 超過這個數量将被系統忽略

關于通知參數的接收問題

notification.userinfo

中的綁定附加資訊

如果使用者關閉應用程式, 那麼使用者點選通知資訊,會走

finishLaunchingWith

這個方法

如果應用處于背景運作狀态, 會走

- didReceiveLocationNotification

會得到

notification

這個對象, 同時也會得到

userinfo

在finish這個 方法中可以通路 launchOptions中鍵為

UIApplicationLaunchOptionsLocalNotificationKey

對象, 這個對象就是發送的通知, 由此對象再通路userinfo, 可以将userinfo寫入檔案友善關閉程式後再通過點選通知打開應用userinfo的過程

具體代碼

/** 
 *  iOS 通知機制又叫做消息機制, 包括(本地通知, 推送通知) 
 兩種通知在iOS中的表現一緻, 可以通過橫幅或者彈框兩種形式來告訴使用者, 點選通知可以打開應用程式 
 但是兩種實作原理卻不相同 
 */  

/** 
 *  本地通知 : 所有的邏輯都在AppDelegate中, 一個程式更新後使用者長時間沒有使用的提醒 
 由本地應用觸發的, 它是基于時間行為的一種通知形式, 例如鬧鐘, 提醒事項, 過了一段時間背景程式提醒使用者使用該應用, 
 建立一個本地通知分為以下幾個步驟: 
 1. 建立UILocationNotification 
 2. 設定處理通知的時間fireDate 
 3. 配置通知的内容 : 通知主體, 通知聲音, 圖檔數字等 
 4. 配置通知傳遞的自定義資料參數userinfo (可選) 
 5. 調用通知, 可以使用scheduleLocationNotification 按計劃排程一個通知. 也可以presentLocationNotificationNow立即調用通知 

 進入應用後如果沒有注冊通知, 需要首先注冊通知請求使用者允許通知, 一旦調用完注冊方法, 無論使用者是否選擇允許通知此刻都會調用應用程式 
 -- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings代理方法 
 在這個方法中根據使用者的選擇, 如果允許通知, 則會按照前面的步驟建立通知并在一定時間後執行 

 */  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  


    // 如果已經獲得發送通知的授權則建立本地通知, 否則請求授權, 注意: 如果不請求授權在設定中沒有對應的通知設定, 如果從來沒有發送過請求, 即使通過設定也打不開消息允許設定  
    if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {  
        [self addLocationNotification];  
    }else {  
        // 必須要注冊通知類型  
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]];  
    }  


    // Override point for customization after application launch.  
    return YES;  
}  



#pragma mark ---- 調用過使用者注冊通知方法之後執行(調用完 registerUserNotificationSettings:之後執行的)  
-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings  
{  
    if (notificationSettings.types != UIUserNotificationTypeNone) {  
        [self addLocationNotification];  
    }  
}  

#pragma mark ---- 進入前台後設定消息資訊  
- (void)applicationWillEnterForeground:(UIApplication *)application  
{  
    // 進入前台取消應用消息圖示  
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:];  
}  


#pragma mark ---- 添加本地通知  
- (void)addLocationNotification  
{  
    // 定義本地通知對象  
    UILocalNotification *notification  = [[ UILocalNotification alloc] init];  
    // 設定調用時間----- 目前時間10秒之後  
    notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:];  
    // 通知重複次數  
    notification.repeatInterval = ;  
    // 目前月曆, 使用前對号設定時區等資訊, 使其同步  
 //    notification.repeatCalendar = [NSCalendar currentCalendar];  


    // 設定通知的屬性  
    // 1. 通知的主體 body  
    notification.alertBody = @"有好玩的東西, 快來嘗試吧";  
    // 2. 應用程式圖示左上角顯示的消息數字  
    notification.applicationIconBadgeNumber = ;  
    // 3. 待機界面的滑動動作提示  
    notification.alertAction = @"打開應用";  
    // 4. 通過點選通知打開應用時的啟動圖檔, 這裡使用預設圖檔  
    notification.alertLaunchImage = @"Default";  

    // 5. 收到通知時播放的聲音, 預設消息聲音  
    notification.soundName = UILocalNotificationDefaultSoundName; // 預設系統通知聲音  
//    notification.soundName = @"sound.caf"; // 通知聲音, 自定義  

    // 6. 設定使用者資訊  
    notification.userInfo = @{@"ID" : @, @"user" : @"xiayan"}; // 綁定通知上的其他附加資訊  

    // 7. 調用通知  
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
}  

/** 
 *  注意: 
 *   
    1. 在使用通知之前必須注冊通知類型(聲音, 圖示, 内容) 
    2. 本地通知是由作業系統統一排程, 隻有關閉應用, 或者應用進入背景才能收到通知 
    3. 通知的聲音是由iOS系統播放的, 格式必須是Linear PCM、MA4(IMA/ADPCM)、µLaw、aLaw中的一種, 播放時間的限制(30s), 否則被系統聲音替換, 自定義的聲音必須放到main Boundle中 
    4. 本地通知的數量有限, 最近的本地通知最多隻能有64個, 超過這個數量将被系統忽略 
    5. 如果想要移除本地通知可 
 */  
/** 
 *  關于通知參數的接收問題 
 * 
 *  notification.userinfo 中的綁定附加資訊 
    如果使用者關閉應用程式, 那麼使用者點選通知資訊,會走 finishLaunchingWith 這個方法 
    如果應用處于背景運作狀态, 會走- didReceiveLocationNotification 會得到notification這個對象, 同時也會得到userinfo 
    在finish這個 方法中可以通路 launchOptions中鍵為UIApplicationLaunchOptionsLocalNotificationKey對象, 這個對象就是發送的通知, 由此對象再通路userinfo, 可以将userinfo寫入檔案友善關閉程式後再通過點選通知打開應用userinfo的過程 
 */  
#pragma mark ---- 移除本地通知, 在不需要的此通知時移除通知  
- (void)removeNotification  
{  
    // 設定取消通知  
    [[UIApplication sharedApplication] cancelAllLocalNotifications];  

}