本地推送總結

  • 1.簡介
    • 推送分為本地推送和遠程推送2種。可以在應用沒有打開甚至手機鎖屏情況下給用戶以提示。它們都需要注冊,注冊后系統會彈出提示框(如下圖)提示用戶是否同意,如果同意則正常使用;如果用戶不同意則下次打開程序也不會彈出該提示框,需要用戶到設置里面設置。一共有三種提示類型:
      UIUserNotificationTypeBadge:應用圖標右上角的信息提示
      UIUserNotificationTypeSound:播放提示音
      UIUserNotificationTypeAlert:提示框
  • 2.本地推送
  • 2.1本地推送的注冊以及拿到userInfo (程序被殺死時,即沒有啟動程序時點擊通知)
// 一般在在啟動時注冊通知
// 程序被殺死,點擊通知后調用此程序
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0) { //iOS10特有
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
        //進行用戶權限的申請
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        // 遵守代理協議
        center.delegate = self;
        
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            //在block中會傳入布爾值granted,表示用戶是否同意
            if (granted) {
                //點擊允許
                NSLog(@"注冊通知成功");
                // 獲取用戶對通知的設置信息 對應ios8的didRegisterUserNotificationSettings:代理方法, ios10不會調用這個代理方法
                [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                    NSLog(@"settings:== %@", settings);
                }];
                
            } else {
                //點擊不允許
                NSLog(@"注冊通知失敗");
            }
        }];
        
        // 2.自動獲取當前設備的UDID, 以及, app bundle id , 向蘋果服務器發送請求, 獲取deviceToken
        // 如果是注冊遠程推送,還是和以前一樣,需要加上下面這行代碼
        [[UIApplication sharedApplication] registerForRemoteNotifications];
#endif
        
    }else if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { // iOS 8.0 - iOS 10(iOS8-9使用)
        
        // 1.請求授權
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        
        [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
        // 2.自動獲取當前設備的UDID, 以及, app bundle id , 向蘋果服務器發送請求, 獲取deviceToken
        // 如果是注冊遠程推送,還是和以前一樣,需要加上下面這行代碼
        [[UIApplication sharedApplication] registerForRemoteNotifications];
        
    } else { // iOS 8.0之前不用請求授權
        // 2.自動獲取當前設備的UDID, 以及, app bundle id , 向蘋果服務器發送請求, 獲取deviceToken
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
        
        // ios8之前不用設置setting   即registerForRemoteNotificationTypes == registerForRemoteNotifications;
    }

    // 點擊通知后調用改方法, 通過  
      launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]獲取本地通知內容
    //  launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] == 代理方法中的userInfo參數
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        // 這里添加處理代碼, 根據不同的通知內容進行不同的頁面處理
    }
    return YES;
}
  • 2.1本地推送拿到userInfo (處于前臺或后臺時,點擊通知)
// 程序沒有被殺死(處于前臺或后臺),點擊通知后會調用此程序
 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
     // 這里添加處理代碼, 根據不同的通知內容進行不同的頁面處理
}
  • 總結:

// 點擊本地通知時: 如果程序處于前臺或者后臺時調用, notification.userInfo是通知的消息。
  - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
//  點擊本地通知時: 如果程序被殺死時調用, (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]是通知的消息userInfo。
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
  • 2.3發送本地通知

范例1:

 - (IBAction)addLocalNotification {
    // 1.創建一個本地通知
    UILocalNotification *localNote = [[UILocalNotification alloc] init];

    // 1.1.設置通知發出的時間
    localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];

    // 1.2.設置通知內容
    localNote.alertBody = @"這是一個推送這是一個推送";

    // 1.3.設置鎖屏時,字體下方顯示的一個文字
    localNote.alertAction = @"趕緊!!!!!";
    localNote.hasAction = YES;

    // 1.4.設置啟動圖片(通過通知打開的)
    localNote.alertLaunchImage = @"../Documents/IMG_0024.jpg";

    // 1.5.設置通過到來的聲音
    localNote.soundName = UILocalNotificationDefaultSoundName;

    // 1.6.設置應用圖標左上角顯示的數字
    localNote.applicationIconBadgeNumber = 999;

    // 1.7.設置一些額外的信息
    localNote.userInfo = @{@"qq" : @"704711253", @"msg" : @"success"};

    // 2.執行通知
    [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}

范例2:

  // 設置本地通知  
   + (void)registerLocalNotification:(NSInteger)alertTime alertBody:(NSString *)alertBody userDict:(NSDictionary *)userDict  
    {  
    UILocalNotification *notification = [[UILocalNotification alloc] init];  
    // 設置觸發通知的時間  
    NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];  
      
    notification.fireDate = fireDate;  
    // 時區  
    notification.timeZone = [NSTimeZone defaultTimeZone];  
    // 設置重復的間隔  
    notification.repeatInterval = kCFCalendarUnitSecond;  
      
    // 通知內容  
    notification.alertBody = alertBody;  
    notification.applicationIconBadgeNumber = 1;  
    // 通知被觸發時播放的聲音  
    notification.soundName = UILocalNotificationDefaultSoundName;  
    // 通知參數  
    notification.userInfo = userDict;  
      
    // ios8后,需要添加這個注冊,才能得到授權  
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])  
    {  
        UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;  
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];  
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];  
        // 通知重復提示的單位,可以是天、周、月  
        notification.repeatInterval = NSCalendarUnitDay;  
    }  
    else  
    {  
        // 通知重復提示的單位,可以是天、周、月  
        notification.repeatInterval = NSDayCalendarUnit;  
    }  
      
    // 執行通知注冊  
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
  • 2.3取消本地通知

取消所有的本地通知

// 取消所有本地通知
[application cancelAllLocalNotifications];

取消某個本地通知

// 取消某個本地推送通知  
+ (void)cancelLocalNotificationWithKey:(NSString *)key  
{  
    // 獲取所有本地通知數組  
    NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;  
      
    for (UILocalNotification *notification in localNotifications)  
    {  
        NSDictionary *userInfo = notification.userInfo;  
        if (userInfo)  
        {  
            // 根據設置通知參數時指定的key來獲取通知參數  
            NSString *info = userInfo[key];  
              
            // 如果找到需要取消的通知,則取消  
            if (info != nil)  
            {  
                [[UIApplication sharedApplication] cancelLocalNotification:notification];  
                break;  
            }  
        }  
    }  
}  
  • 參考博客:

http://www.cnblogs.com/r360/p/5741136.html http://blog.csdn.net/u014220518/article/details/51489139

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 極光推送: 1.JPush當前版本是1.8.2,其SDK的開發除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,792評論 10 16
  • 推送通知 注意:這里說的推送通知跟NSNotification有所區別 NSNotification是抽象的,不可...
    iOS開發攻城獅閱讀 4,340評論 1 13
  • 推送通知注意:這里說的推送通知跟NSNotification有所區別NSNotification是抽象的,不可見的...
    醉葉惜秋閱讀 1,547評論 0 3
  • 概述 在多數移動應用中任何時候都只能有一個應用程序處于活躍狀態,如果其他應用此刻發生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,564評論 1 8
  • 轉載自http://www.cnblogs.com/r360/p/5741136.html iOS本地推送與遠程推...
    飛雨2013閱讀 1,331評論 0 1