推送問題研究

相關網址:http://www.cocoachina.com/bbs/read.php?tid=290239

http://www.cocoachina.com/ios/20160316/15665.html

http://www.360doc.com/content/15/0123/14/11411827_443080937.shtml 推送證書的創建

推送問題研究:

1、推送原理: 


直白的說就是三個步驟:

1、app發起註冊通知的請求,蘋果通知中心(APNS Server),給這個app分配一個device Token。

2、app把device Token和pem證書文件給到自己的服務器/第三方推送服務器平臺,用於加密和識別。

3、服務器主動把要發送的信息和device Token和pem證書融合,發送給APNS Server,APNS Server進行pem校驗判斷這個信息是否符合蘋果開發規則,根據device Token建立通道,把消息發送給app。


2、註冊通知

分兩種情況:

第一種:iOS8 、iOS9、iOS10下需要使用新的 API

    //創建消息上面要添加的動作

    UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];

    action1.identifier = kNotificationActionIdentifileStar;

    action1.title = @"贊";

    //當點擊的時候不啓動程序,在後臺處理

    action1.activationMode = UIUserNotificationActivationModeBackground;

    //需要解鎖才能處理(意思就是如果在鎖屏界面收到通知,並且用戶設置了屏幕鎖,用戶點擊了贊不會直接進入我們的回調進行處理,而是需要用戶輸入屏幕鎖密碼之後才進入我們的回調),如果action.activationMode = UIUserNotificationActivationModeForeground;則這個屬性被忽略;

    action1.authenticationRequired = YES;

    /*

     destructive屬性設置後,在通知欄或鎖屏界面左劃,按鈕顏色會變爲紅色

     如果兩個按鈕均設置爲YES,則均爲紅色(略難看)

     如果兩個按鈕均設置爲NO,即默認值,則第一個爲藍色,第二個爲淺灰色

     如果一個YES一個NO,則都顯示對應的顏色,即紅藍雙色 (CP色)。

     */

    action1.destructive = NO;

    

    //第二個動作

    UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];

    action2.identifier = kNotificationActionIdentifileComment;

    action2.title = @"評論";

    //當點擊的時候不啓動程序,在後臺處理

    action2.activationMode = UIUserNotificationActivationModeBackground;

    //設置了behavior屬性爲 UIUserNotificationActionBehaviorTextInput 的話,則用戶點擊了該按鈕會出現輸入框供用戶輸入

    action2.behavior = UIUserNotificationActionBehaviorTextInput;

    //這個字典定義了當用戶點擊了評論按鈕後,輸入框右側的按鈕名稱,如果不設置該字典,則右側按鈕名稱默認爲 “發送”

    action2.parameters = @{UIUserNotificationTextInputActionButtonTitleKey: @"評論"};

    

    //創建動作(按鈕)的類別集合

    UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];

    //這組動作的唯一標示

    category.identifier = kNotificationCategoryIdentifile;

    //最多支持兩個,如果添加更多的話,後面的將被忽略

    [category setActions:@[action1, action2] forContext:(UIUserNotificationActionContextMinimal)];

    //創建UIUserNotificationSettings,並設置消息的顯示類類型

    UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObject:category]];

    

    [[UIApplication sharedApplication] registerUserNotificationSettings:uns];

也可以不添加動作:

UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil];

    

    [[UIApplication sharedApplication] registerUserNotificationSettings:uns];

第二種:iOS6 、iOS7、<iOS8下需要使用老的的 API

// iOS8.0 以前遠程推送設置方式

// 定義遠程通知類型(Remote.遠程 - Badge.標記 Alert.提示 Sound.聲音)

        UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;

3、註冊通知反饋

        // 註冊遠程通知 -根據遠程通知類型

        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];


#pragma mark - 遠程通知(推送)回調

/** 遠程通知註冊成功委託 */

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];

    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];

    NSLog(@"\n>>>[DeviceToken Success]:%@\n\n", token);


    // [3]:向自己的服務器或者第三方推送服務器註冊deviceToken

    [GeTuiSdk registerDeviceToken:token];

}


/** 遠程通知註冊失敗委託 */

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {

    NSLog(@"\n>>>[DeviceToken Error]:%@\n\n", error.description);

}

4、推送在三種情況下的接收情況:

第一、程序在前臺運行

不出現通知欄,直接執行方法:- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

第二、程序在後臺運行

出現通知欄,並且app圖標出現小紅點。

當用戶點擊通知時:軟件啓動。執行方法:- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

當用戶沒有點擊通知,而是點擊通知裏面的可操作按鈕時候:通知消失,但是小紅點還存在,不啓動軟件;稍後點擊軟件圖標進入軟件後,執行方法:- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

當用戶點擊app圖標啓動軟件時:- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification這個方法不執行;網上說可以通過didFinishLaunchingWithOptions方法獲取到通知內容方法如下:NSDictionary *dic = [NSDictionary dictionaryWithDictionary:[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]];但使用本地推送測試不能,遠程推送不能測試

第三、程序處於休眠狀態

通知欄顯示通知,並且app圖標出現小紅點。

當用戶點擊app圖標啓動軟件:網上沒有提及

當用戶點擊通知啓動軟件:網上說:didFinishLaunchingWithOptions可以獲取到通知,但使用本地推送測試不能,遠程推送不能測試

5、和第三方推送平臺結合

在第三方平臺創建應用,注意創建應用時候名字和bundleID一定不可以錯,同時上傳發布和開發兩種環境的pem文件。結果就是獲取到了啓動第三方的必備參數;比如:kGtAppId、、kGtAppKey、kGtAppSecret。。。

在註冊通知之前,首現啓動第三方sdk。同時就需要實現相應的一些delegate方法;比如:是否啓動成功,監測鏈接是否成功的方法。。。

就是註冊通知,在反饋通知裏面獲取到DeviceToken時候,向自己的服務器或者第三方推送服務器註冊deviceToken

然後就是接受通知的相關delegate方法。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章