1. 程式人生 > >iOS開發--本地通知與遠程通知

iOS開發--本地通知與遠程通知

授權 atom nbsp sel bject 面試 tar 生效 nat

iOS開發--本地通知與遠程通知

技術分享 作者 雷潮 2016.02.01 00:18* 字數 1921 閱讀 8898評論 1

這裏是指推送通知跟NSNotification有區別:

1、NSNotification是系統內部發出通知,一般用於內部事件的監聽,或者狀態的改變等等,是不可見的
2、本地通知與遠程通知是可見的,主要用於告知用戶或者發送一些App的內容更新,推送一些相關的消息,讓用戶知道App內部發生了什麽事情。

技術分享
Paste_Image.png

iOS常用通知

1、本地推送通知:(Local Notification)
2、遠程推送通知:(Remote Notification)

iOS通知呈現效果(5)

1.設置音效,(提醒作用)
2.設置橫幅,
3.設置彈窗,
4.鎖屏下也可以呈現,
5.App圖標的數字 (即新內容的數量)
至於顯示橫幅或者彈窗,取決於用戶的設置
iOS手機設置中:通知中心-選擇應用-選擇應用下的通知模式-OK!

技術分享
Paste_Image.png

通知的註意點

1、App在前臺運行的時候,通知不會展示出來
2、點擊通知,默認會自動打開推送通知的App
3、不管App是否打開,通知都可以如期發出

1、本地推送通知:

不需要聯網就可以發出的通知
使用場景:
提醒用戶完成一些任務,比如:定時提醒,生活備註,看電影等等

推送通知屬性:

// 枚舉值-發出通知的時間(有局限性)
@property(nonatomic) NSCalendarUnit repeatInterval;
// 自定義-發出通知的時間(可以自由設定時間)
@property(nonatomic,copy) NSCalendar *repeatCalendar;
// 區域-創建只需要創建一個中心點與半徑就可以了
@property(nonatomic,copy) CLRegion *region
// 進入區域發出一個通知,設置yes,只會發出一個通知,設置NO就會每次進入這個區域都發送
@property(nonatomic,assign) BOOL regionTriggersOnce NO
// 設置通知的內容
@property(nonatomic,copy) NSString *alertBody;      
 // 決定alertAction是否生效
@property(nonatomic) BOOL hasAction;
// 設置滑塊的文字
@property(nonatomic,copy) NSString *alertAction;    

// 設置點擊通知的啟動圖片(一般設置App啟動圖片後,這裏可以隨便寫)
@property(nonatomic,copy) NSString *alertLaunchImage;
// 設置alertTitle,就是通知內容上面的文字
@property(nonatomic,copy) NSString *alertTitle
 // 設置彈出的聲音
@property(nonatomic,copy) NSString *soundName;
 // 設置App的消息條數
@property(nonatomic) NSInteger applicationIconBadgeNumber;
 // 設置通知一些額外數據
 @property(nonatomic,copy) NSDictionary *userInfo;

如何發出本地通知:

 // 1.創建本地通知
    UILocalNotification *localNote = [[UILocalNotification alloc] init];

    // 2.設置本地通知的內容
    // 2.1.設置通知發出的時間
    localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
    // 2.2.設置通知的內容
    localNote.alertBody = @"在幹嗎?";
    // 2.3.設置滑塊的文字(鎖屏狀態下:滑動來“解鎖”)
    localNote.alertAction = @"解鎖";
    // 2.4.決定alertAction是否生效
    localNote.hasAction = NO;
    // 2.5.設置點擊通知的啟動圖片
    localNote.alertLaunchImage = @"123Abc";
    // 2.6.設置alertTitle
    localNote.alertTitle = @"你有一條新通知";
    // 2.7.設置有通知時的音效
    localNote.soundName = @"buyao.wav";
    // 2.8.設置應用程序圖標右上角的數字
    localNote.applicationIconBadgeNumber = 999;

    // 2.9.設置額外信息
    localNote.userInfo = @{@"type" : @1};

    // 3.調用通知
    [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}

使用註意:
iOS7,不需要用戶授權就可發出通知,而iOS8以後,必須用戶授權才可以發出通知

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

    // 設置應用程序的圖標右上角的數字
    [application setApplicationIconBadgeNumber:0];

    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }

    // 界面的跳轉(針對應用程序被殺死的狀態下的跳轉)
    // 殺死狀態下的,界面跳轉並不會執行下面的方法- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification,
    // 所以我們在寫本地通知的時候,要在這個與下面方法中寫,但要判斷,是通過哪種類型通知來打開的
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        // 跳轉代碼
        UILabel *redView = [[UILabel alloc] init];
        redView.frame = CGRectMake(0, 0, 200, 300);
        redView.numberOfLines = 0;
        redView.font = [UIFont systemFontOfSize:12.0];
        redView.backgroundColor = [UIColor redColor];
        redView.text = [NSString stringWithFormat:@"%@", launchOptions];
        [self.window.rootViewController.view addSubview:redView];
    }

    return YES;
}

監聽通知,如果用戶打開通知,可以讓用戶進入一些特定的界面

/*
 應用程序在進入前臺,或者在前臺的時候都會執行該方法
 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    // 必須要監聽--應用程序在後臺的時候進行的跳轉
    if (application.applicationState == UIApplicationStateInactive) {
        NSLog(@"進行界面的跳轉");
      // 如果在上面的通知方法中設置了一些,可以在這裏打印額外信息的內容,就做到監聽,也就可以根據額外信息,做出相應的判斷
        NSLog(@"%@", notification.userInfo);

// 
        UIView *redView = [[UIView alloc] init];
        redView.frame = CGRectMake(0, 0, 100, 100);
        redView.backgroundColor = [UIColor redColor];
        [self.window.rootViewController.view addSubview:redView];
    }
}

2、遠程推送通知:

從遠程服務器推送給客戶端的通知(需要聯網)
遠程推送服務---就是APNs
模擬器無法調試遠程推送

為什麽需要遠程推送通知:

解決獲取傳統數據的局限性,讓數據實時更新

使用場景:

聊天功能(一般非即時聊天)、推送一下App的內部新功能、版本下載等

註:所有的蘋果設備,在聯網狀態下,都會與蘋果的服務器建立-長連接

長連接的作用:
時間效準、系統升級、查找我的iphone、遠程通知
好處:
數據傳輸快、數據保持最新狀態

技術分享
Paste_Image.png 技術分享
Paste_Image.png 技術分享
Paste_Image.png

我在面試中一般也比較喜歡問面試者這個問題。能解釋清楚肯定就有貨真價實的開發經驗

使用遠程推送

1、獲取蘋果獲得deviceToken-獲取手機UDID+應用的唯一標識(bundel ID)
2、得到蘋果返回的deviceToken
3、發送deviceToken給公司的服務器
4、監聽用戶對通知的點擊

如何調試遠程推送功能

1、真機
2、調試推送需要的證書文件
證書自己配置。。。
3、發布具有推送服務的App
包含推送的cer證書+某個具有發布資格的電腦,就可以發布

如何推送
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    } else { // iOS7
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
    }

// 根據遠程通知通過UIApplicationLaunchOptionsRemoteNotificationKey打開的情況來進行
    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
        // 跳轉
        // 添加一個紅色的View
    }

    return YES;
}
// 獲取DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 將DeviceToken傳給服務器
    NSLog(@"%@", deviceToken.description);
}
// 正常接到遠程通知的時候會調用這個方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%@", userInfo);
    // 正常打開推送後,
}
// 後臺操作(根據收到推送,讓程序自己執行一些操作,不管用戶是否點擊推送)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"---------");
    UIView *redV = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redV];

    // 1.打開後臺模式 2.告訴系統是否有新內容的更新 3.發送的通知有固定的格式("content-available":"1")
    // 2.告訴系統有新內容
    completionHandler(UIBackgroundFetchResultNewData);
}
1、打開後臺模式
技術分享
Paste_Image.png
2、告訴系統有新內容

completionHandler(UIBackgroundFetchResultNewData);

3、發送通知有固定格式

("content-available":"1")

找的這張圖:也有相應的模擬推送代碼,需要的可以聯系我

技術分享
Paste_Image.png

一般開發中直接使用(jpush)激光推送就可以快速完成App的推送功能。具體按照官方文檔來進行.(有空會寫一篇專門針對激光推送的文稿)

iOS開發

iOS開發--本地通知與遠程通知