iOS 本地通知的實現
阿新 • • 發佈:2018-12-23
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:0];
}
#pragma mark ---- 新增本地通知
- (void)addLocationNotification
{
// 定義本地通知物件
UILocalNotification *notification = [[ UILocalNotification alloc] init];
// 設定呼叫時間----- 當前時間10秒之後
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10.0];
// 通知重複次數
notification.repeatInterval = 2;
// 當前日曆, 使用前對號設定時區等資訊, 使其同步
// notification.repeatCalendar = [NSCalendar currentCalendar];
// 設定通知的屬性
// 1. 通知的主體 body
notification.alertBody = @"有好玩的東西, 快來嘗試吧";
// 2. 應用程式圖示左上角顯示的訊息數字
notification.applicationIconBadgeNumber = 1;
// 3. 待機介面的滑動動作提示
notification.alertAction = @"開啟應用";
// 4. 通過點選通知開啟應用時的啟動圖片, 這裡使用預設圖片
notification.alertLaunchImage = @"Default";
// 5. 收到通知時播放的聲音, 預設訊息聲音
notification.soundName = UILocalNotificationDefaultSoundName; // 預設系統通知聲音
// notification.soundName = @"sound.caf"; // 通知聲音, 自定義
// 6. 設定使用者資訊
notification.userInfo = @{@"ID" : @1, @"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];
}