1. 程式人生 > >iOS 本地通知的實現

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: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];  

}