iOS本地通知
- 所有的邏輯都在AppDelegate中, 一個程式更新後使用者長時間沒有使用的提醒
- 由本地應用觸發的, 它是基于時間行為的一種通知形式, 例如鬧鐘, 提醒事項, 過了一段時間背景程式提醒使用者使用該應用
iOS 通知機制又叫做消息機制, 包括(本地通知, 推送通知)
- 兩種通知在iOS中的表現一緻, 可以通過橫幅或者彈框兩種形式來告訴使用者, 點選通知可以
打開應用程式, 但是兩種實作原理卻不相同
建立一個本地通知分為以下幾個步驟
- 建立UILocationNotification
- 設定處理通知的時間fireDate
- 配置通知的内容 : 通知主體, 通知聲音, 圖檔數字等
- 配置通知傳遞的自定義資料參數userinfo (可選)
- 調用通知, 可以使用scheduleLocationNotification 按計劃排程一個通知. 也可以
presentLocationNotificationNow立即調用通知
進入應用後如果沒有注冊通知, 需要首先注冊通知請求使用者允許通知, 一旦調用完注冊方法, 無論使用者是否選擇允許通知此刻都會調用應用程式
-- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
代理方法
在這個方法中根據使用者的選擇, 如果允許通知, 則會按照前面的步驟建立通知并在一定時間後執行
需要注意
- 在使用通知之前必須注冊通知類型(聲音, 圖示, 内容)
- 本地通知是由作業系統統一排程, 隻有關閉應用, 或者應用進入背景才能收到通知
-
通知的聲音是由iOS系統播放的, 格式必須是Linear PCM、
MA4(IMA/ADPCM)、µLaw、aLaw中的一種, 播放時間的限制(30s), 否則被系統聲音替換,自定義的聲音必須放到main Boundle中
- 本地通知的數量有限, 最近的本地通知最多隻能有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];
}