阿里雲推送 SDK iOS 端 配置

阿里雲 SDK 配置 請依官方爲主,畢竟已經很詳細了
https://help.aliyun.com/document_detail/30072.html?spm=5176.doc30071.6.648.No5CmA

 

SDK 配置流程:

1、導入下載好的 OneSDK

引入 Framework 在 Xcode 中,直接把下載 SDK 目錄中的 framework 拖入對應 Target 下即可,在彈出框勾選 Copy items if needed。

oneSDK 目錄結構:

  • CloudPushSDK.framework
  • AlicloudUtils.framework
  • UTDID.framework
  • UTMini.framework(阿里雲平臺下載的SDK無需依賴,百川平臺下載的SDK需要依賴)

2、添加公共包依賴 在 Build Phases -> Link Binary With Libraries 中,引入下列的公共包:

  • libz.tbd
  • libresolv.tbd
  • CoreTelephony.framework
  • SystemConfiguration.framework
  • UserNotifications.framework(iOS 10+)
    libsqlite3.tbd(阿里雲平臺下載的 SDK 無需依賴,百川平臺下載的SDK需要依賴)

3、特殊要求

  • 應用的 targets -> Build Settings -> Linking -> Other Linker Flags,請加上 -ObjC 這個屬性,否則推送服務無法正常使用。
  • 移動推送 iOS SDK 已經完成 ATS 適配,請求都以 HTTPS 發出,無需在 Info.plist 中進行 ATS 配置。

4、在AppDelegate.m 裏面完成配置

  • 工程引入頭文件
# import <CloudPushSDK/CloudPushSDK.h>

5、Xcode 設置

  • 在 TARGET 下 Capabilities 勾選 Backgroud Modes -> Remote notifications,
  • 主要是 iOS7 之後,蘋果支持後臺運行,如果這裏打開後,當接收到遠程推送後,程序在後臺也可以做一些處理。

6、常遇見的問題:

  • 在項目 target 中,打開 Capabilitie —> Push Notifications,並會自動在項目中生成 .entitlement(ɪn'taɪt(ə)lmənt 權利 )文件。(很多同學升級後,獲取不到 deviceToken,大概率是由於沒開這個選項)
    Capabilitie —> Push Notifications 自動生成 .entitlement 文件
  • 確保添加了 UserNotifications.framework,並 import 到 AppDelegate,記得實現 UNUserNotificationCenterDelegate 。
# import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate>
//
//  AppDelegate.m
//  PushDemo_OC
//
//  Created by Admin on 2018/6/7.
//  Copyright © 2018年 Rock. All rights reserved.
//

#import "AppDelegate.h"

// 導入 Push_SDK 頭文件
#import <CloudPushSDK/CloudPushSDK.h>

// iOS 10 Notification
#import <UserNotifications/UserNotifications.h>

// 跳轉界面
#import "JumpViewController.h"

#import <AVFoundation/AVFoundation.h>

// appkey & AppSecret
static NSString *const testAppKey = @"24921284";
static NSString *const testAppSecret = @"ccc7489c1d3deb07fd58e801e89071a0";

@interface AppDelegate () <UNUserNotificationCenterDelegate>

@end

@implementation AppDelegate {
    // iOS 10 通知中心
    UNUserNotificationCenter * _notificationCenter;
}

/*
 iOS 如何判斷是 *點擊推送信息進入程序* 還是 *點擊app圖標進入程序*  ???
 當設備接到 apns 發來的通知,應用處理通知有以下幾種情況:
 
 1. 應用還沒有加載
 
 1.1 這時如果點擊 通知的顯示按鈕,
 會調用   didFinishLaunchingWithOptions 方法,
 不會調用  didReceiveRemoteNotification 方法。
 
 1.2 如果點擊通知的關閉按鈕,再點擊應用,
 只會調用 didFinishLaunchingWithOptions 方法。
 
 2. 應用加載過了
 
 2.1 應用在前臺(foreground)
 這時如果收到通知,會觸發 didReceiveRemoteNotification 方法。
 
 2.2 應用在後臺
 此時如果收到通知,點擊顯示按鈕,會調用 didReceiveRemoteNotification 方法。
 點擊關閉再點擊應用,則上面兩個方法都不會被調用這時,只能在 applicationWillEnterForeground 或者 applicationDidBecomeActive, 根據發過來通知中的 badge 進行判斷是否有通知,然後發請求獲取數據。
 */

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // APNs註冊,獲取deviceToken並上報
    [self registerAPNS:application];
 
    // 初始化SDK
    [self initCloudPush];
    
    // 監聽推送通道打開動作
    [self listenerOnChannelOpened];
    
    // 監聽推送消息到達
    [self registerMessageReceive];
    
    // 點擊通知將 App 從關閉狀態啓動時,將通知打開回執上報 // 計算點擊 OpenCount
    // [CloudPushSDK handleLaunching:launchOptions];(Deprecated from v1.8.1)
    [CloudPushSDK sendNotificationAck:launchOptions];
    
    // 主動獲取設備通知是否授權 (iOS 10+)
    [self getNotificationSettingStatus];
    
    
    /*
     
     當程序處於關閉狀態 (APP未運行) 收到推送通知時,
     點擊 圖標 會調用該方法 didFinishLaunchingWithOptions:
     那麼通知可以通過 launchOptions 這個參數獲取到。
     在該方法中 didFinishLaunchingWithOptions: 這個函數 在正常啓動下 launchOptions 是空,
     如果你是從點擊推送通知過來的,那麼 laungchOptions 裏面會包含你的推送的內容。
     在這裏就可以進行相應的處理,你就可以發一個通知,可以在 rootViewController 中接收執行相應的操作
    */
    
    // 當APP爲關閉狀態 收到推送通知,點擊 圖標 會調用該方法 didFinishLaunchingWithOptions:
    if (launchOptions) {
        NSLog(@"\n ====== launchOptions: %@",launchOptions);
        NSDictionary *pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (pushNotificationKey) {
            // 這裏定義自己的處理方式
            // 如需要代碼控制 BadgeNum (icon右上角的數字)
            [UIApplication sharedApplication].applicationIconBadgeNumber = 10;
        }
    }
    
    /* 當APP爲關閉狀態,收到推送通知, 點擊 通知欄 跳轉到指定的頁面 */
    [self jumpViewController:launchOptions];
    
    
    return YES;
}


/**
 *    向APNs註冊,獲取deviceToken 用於推送
 *    @param  application
 */
- (void)registerAPNS:(UIApplication *)application {
    
    float systemVersionNum = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersionNum >= 10.0) {
        
        // iOS 10 notifications
        _notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
        
        // 創建 category,並註冊到通知中心
        [self createCustomNotificationCategory];
        
        // 遵循協議
        _notificationCenter.delegate = self;
        
        // 請求客戶推送通知權限,以及推送的類型
        [_notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound completionHandler:^(BOOL granted, NSError * _Nullable error) {
            
            if (granted) {
                // granted
                NSLog(@"\n ====== User authored notification.");
        
                // 向APNs註冊,獲取deviceToken  // 要求在主線程中
                dispatch_async(dispatch_get_main_queue(), ^{
                    [application registerForRemoteNotifications];
                });
                
            } else {
                // not granted
                NSLog(@"\n ====== User denied notification.");
                
                // 即使客戶不允許通知也想讓它通知 // 待測試
                // 向APNs註冊,獲取deviceToken  // 要求在主線程中
                dispatch_async(dispatch_get_main_queue(), ^{
                    [application registerForRemoteNotifications];
                });
                
            }}];
        
        /**
         *  主動獲取設備通知是否授權 (iOS 10+)
         */
        [_notificationCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
            
            // 進行判斷做出相應的處理
            if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
                NSLog(@"\n ====== 未選擇是否允許通知");
            } else if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
                NSLog(@"\n ====== 未授權允許通知");
            } else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){
                NSLog(@"\n ====== 已授權允許通知");
            }
        }];
        
        
    } else if (systemVersionNum >= 8.0) { // 適配 iOS_8, iOS_10.0
        
        // iOS 8 Notifications
        // 不會有黃色歎號
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wdeprecated-declarations"
        [application registerUserNotificationSettings:
         [UIUserNotificationSettings settingsForTypes:
          (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
        [application registerForRemoteNotifications];
        
        /*
         // 提出彈窗,授權是否允許通知
         UIUserNotificationSettings * settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
         [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
         
         // 註冊遠程通知 (iOS_8+)
         [[UIApplication sharedApplication] registerForRemoteNotifications];
         
         if ([[UIApplication sharedApplication] currentUserNotificationSettings].types  == UIUserNotificationTypeNone) { //判斷用戶是否打開通知開關
             NSLog(@"沒有打開");
           } else {
             NSLog(@"已經打開");
           }
         */
        
#pragma clang diagnostic pop
    } else {
        
        // iOS < 8 Notifications
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wdeprecated-declarations"
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
        /*
         UIRemoteNotificationType types = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert;
         [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
         
         if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes]  == UIRemoteNotificationTypeNone) { //判斷用戶是否打開通知開關
         }
         */
        
#pragma clang diagnostic pop
    }
}

/**
 *  主動獲取設備通知是否授權 (iOS 10+) 可以單獨調用
 */
- (void)getNotificationSettingStatus {
    [_notificationCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
        if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) {
            NSLog(@"\n ====== User authed.");
        } else {
            NSLog(@"\n ======  User denied.");
        }}];
}


/**
 *  創建並註冊通知category (iOS 10+)
 */
- (void)createCustomNotificationCategory {
    // 自定義 action1 和 action2
    UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action1" title:@"test1" options: UNNotificationActionOptionNone];
    UNNotificationAction *action2 = [UNNotificationAction actionWithIdentifier:@"action2" title:@"test2" options: UNNotificationActionOptionNone];
    // 創建id爲`test_category`的category,並註冊兩個action到category
    // UNNotificationCategoryOptionCustomDismissAction 表明可以觸發通知的 dismiss 回調
    UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"test_category" actions:@[action1, action2] intentIdentifiers:@[] options: UNNotificationCategoryOptionCustomDismissAction];
    // 註冊category到通知中心
    [_notificationCenter setNotificationCategories:[NSSet setWithObjects:category, nil]];
}


/*
 *  APNs註冊成功回調,將返回的deviceToken上傳到CloudPush服務器
 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0) {
    NSLog(@"Upload deviceToken to CloudPush server.");
    [CloudPushSDK registerDevice:deviceToken withCallback:^(CloudPushCallbackResult *res) {
        if (res.success) {
            NSLog(@"\n ====== Register deviceToken success, deviceToken: %@", [CloudPushSDK getApnsDeviceToken]);
        } else {
            NSLog(@"\n ====== Register deviceToken failed, error: %@", res.error);
        } }];
}

/*
 *  APNs註冊失敗回調
 */
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"\n ====== didFailToRegisterForRemoteNotificationsWithError %@", error);
}

#pragma mark SDK Init
- (void)initCloudPush {
    // 正式上線建議關閉
    [CloudPushSDK turnOnDebug];
    // SDK初始化
    [CloudPushSDK asyncInit:testAppKey appSecret:testAppSecret callback:^(CloudPushCallbackResult *res) {
        if (res.success) {
            NSLog(@"\n ====== Push SDK init success, deviceId: %@.", [CloudPushSDK getDeviceId]);
        } else {
            NSLog(@"\n ====== Push SDK init failed, error: %@", res.error);
        }
    }];
}


/**
 *  註冊推送通道 打開 監聽
 */
- (void)listenerOnChannelOpened {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(onChannelOpened:)
                                                 name:@"CCPDidChannelConnectedSuccess"
                                               object:nil];
    
}
/**
 *   推送通道打開回調
 *   @param notification
 */
- (void)onChannelOpened:(NSNotification *)notification {
    NSLog(@"\n ====== 溫馨提示,消息通道建立成功,該通道創建成功表示‘在線’,可以接收到推送的消息");
}



/**
 *  註冊推送消息 到來 監聽
 */
- (void)registerMessageReceive {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(onMessageReceived:)
                                                 name:@"CCPDidReceiveMessageNotification"
                                               object:nil];
}

/**
 *    處理到來推送消息
 *    @param notification
 */
- (void)onMessageReceived:(NSNotification *)notification {
    NSLog(@"\n ====== Receive one message !!!!!!!");
    CCPSysMessage *message = [notification object];
    NSString *title = [[NSString alloc] initWithData:message.title encoding:NSUTF8StringEncoding];
    NSString *body = [[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding];
    NSLog(@"\n ====== Receive message title: %@, content: %@.", title, body);
    NSLog(@"\n ====== 當前線程 %@",[NSThread currentThread]);
    
}

#pragma mark —頁面跳轉
- (void)jumpViewController:(NSDictionary *)tfdic {
    
    NSDictionary *remoteNotification = [tfdic objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    for (NSString *tfStr in remoteNotification) {
        
        // 通知裏面的內容需要包含 " "
        if ([tfStr isEqualToString:@"careline"]) {
            JumpViewController *_viewController =  [[JumpViewController alloc]init];
            UINavigationController *nav= (UINavigationController *)self.window.rootViewController;
            [nav pushViewController:_viewController animated:YES];
        }
    }
}


/**
 *  iOS 10 + 實現兩個代理方法之一。
 *  當APP處於後臺  點擊通知欄通知
 *  觸發通知動作時回調,比如點擊、刪除通知和點擊自定義 action(iOS 10+)
 */
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
    
    NSString *userAction = response.actionIdentifier;
    
    // 點擊通知打開
    if ([userAction isEqualToString:UNNotificationDefaultActionIdentifier]) {
        NSLog(@"\n ====== User opened the notification.");
        // 處理iOS 10通知,並上報通知打開回執
        [self handleiOS10Notification:response.notification];
    }
    // 通知dismiss,category 創建時傳入 UNNotificationCategoryOptionCustomDismissAction 纔可以觸發
    if ([userAction isEqualToString:UNNotificationDismissActionIdentifier]) {
        NSLog(@"\n ====== User dismissed the notification.");
    }
    NSString *customAction1 = @"action1";
    NSString *customAction2 = @"action2";
    
    // 點擊用戶自定義Action1
    if ([userAction isEqualToString:customAction1]) {
        NSLog(@"User custom action1.");
    }
    
    // 點擊用戶自定義Action2
    if ([userAction isEqualToString:customAction2]) {
        NSLog(@"User custom action2.");
    }
    completionHandler();
}


/**
 *  App 處於前臺時收到通知 (iOS 10+ )
 *  iOS 10 + 實現兩個代理方法之一。
 *  只有當應用程序位於前臺時,該方法纔會在委託上調用。如果方法未被執行或處理程序沒有及時調用,則通知將不會被提交。
 *  應用程序可以選擇將通知呈現爲聲音、徽章、警報和/或通知列表中。此決定應基於通知中的信息是否對用戶可見。
 */
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    NSLog(@"\n ====== App 處於前臺時收到通知 (iOS 10+ ) Receive a notification in foregound.");
    
    //音效文件路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PushSound" ofType:@"caf"];
    // 這裏是指你的音樂名字和文件類型
    NSLog(@"path-----------------------%@",path);
    
    //組裝並播放音效
    SystemSoundID soundID;
    NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)filePath, &soundID);
    AudioServicesPlaySystemSound(soundID);
    
    // 處理iOS 10通知,並上報通知打開回執
    [self handleiOS10Notification:notification];
    
    /*
     處理完成後調用 completionHandler ,用於指示在前臺顯示通知的形式
     completionHandler() 功能:可設置是否在應用內彈出通知
     在 iOS 10 中 通知在前臺的顯示設置:
     */
    
    // 1、通知在前臺不顯示
    // 如果調用下面代碼: 通知不在前臺彈出也不在通知欄顯示
    // completionHandler(UNNotificationPresentationOptionNone);
    
    // 2、通知在前臺顯示
    // 如果調用下面代碼: 通知在前臺彈出也在通知欄顯示
    // completionHandler(UNNotificationPresentationOptionAlert);
    
    
    // 3、通知在前臺顯示 並帶有聲音
    // 如果調用下面代碼:通知彈出,且帶有聲音、內容和角標
    completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge);
}

/**
 *  處理App 處於前臺時收到通知 (iOS 10+ )
 */
- (void)handleiOS10Notification:(UNNotification *)notification {
    
    UNNotificationRequest *request = notification.request;
    UNNotificationContent *content = request.content;
    
    NSDictionary *userInfo = content.userInfo;
    // 通知時間
    NSDate *noticeDate = notification.date;
    // 標題
    NSString *title = content.title;
    // 副標題
    NSString *subtitle = content.subtitle;
    // 內容
    NSString *body = content.body;
    // 角標
    int badge = [content.badge intValue];
    // 取得通知自定義字段內容,例:獲取key爲"Extras"的內容
    NSString *extras = [userInfo valueForKey:@"Extras"];
    // 通知角標數清0
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    
    // 同步角標數到服務端 SDK1.9.5 以後才支持
    // [self syncBadgeNum:0];
    
    // 通知打開回執上報
    [CloudPushSDK sendNotificationAck:userInfo];
    
    NSLog(@"\n ====== App 處於前臺時收到通知 (iOS 10+ ) Notification, == date: %@, == title: %@, == subtitle: %@, == body: %@, == badge: %d, == extras: %@.", noticeDate, title, subtitle, body, badge, extras);
}

/* 同步通知角標數到服務端 */
- (void)syncBadgeNum:(NSUInteger)badgeNum {
    [CloudPushSDK syncBadgeNum:badgeNum withCallback:^(CloudPushCallbackResult *res) {
        if (res.success) {
            NSLog(@"\n ====== Sync badge num: [%lu] success.", (unsigned long)badgeNum);
        } else {
            NSLog(@"\n ====== Sync badge num: [%lu] failed, error: %@", (unsigned long)badgeNum, res.error);
        }
    }];
}

// iOS (3_0, 10_0) App 處於前臺,如果收到 遠程通知 則調用該處理方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    // 通過遠程通知進入應用時候
    application.applicationIconBadgeNumber = 0;
    /*
     1、  在 iOS7 上時,只要收到通知,就會調起 didReceiveRemoteNotification
     1.2、當程序處於前臺工作時,這時候若收到消息推送,會調用該這個方法
     1.3、當程序處於後臺運行時,這時候若收到消息推送,如果點擊消息或者點擊消息圖標時,也會調用該這個方法
     2、  但在 iOS_8 上時,只有app前臺運行或充電時,纔會調起didReceiveRemoteNotification
     2.1、並且 iOS_8 得開啓後臺模式下接收遠程通知。工程配置 TARGATES --> Capabilities BackgroundModes -> ON 選擇 RemoteNotification
     */
    
    // 2.2、處理方法:
    if (application.applicationState == UIApplicationStateActive) {
        //前臺時候
        if ([[userInfo objectForKey:@"aps"] objectForKey:@"alert"]!= NULL) {
            //處理情況
        }
    } else {
        //後臺時候
        //這裏定義自己的處理方式
    }
}

// iOS(8_0, 10_0) 當應用程序被用戶從遠程通知中選擇操作時激活,調用該方法處理程序(
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(nonnull void (^)(void))completionHandler {}

// iOS 7+ 不論是前臺還是後臺只要有遠程推送都會調用
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler  NS_AVAILABLE_IOS(7_0) {
    
    NSLog(@"\n ====== iOS 7+ 前臺後臺都會調用");
    
    /*
     建議使用該方法,還有一個作用。根據蘋果給出的文檔,系統給出30s的時間對推送的消息進行處理,此後就會運行CompletionHandler 程序塊。
     在處理這類推送消息(即程序被啓動後接收到推送消息)的時候,通常會遇到這樣的問題 :
     就是當前的推送消息是當前程序正在前臺運行時接收到的,還是說是程序在後臺運行,用戶點擊系統消息通知欄對應項進入程序時而接收到的?這個其實很簡單,用下面的代碼就可以解決:
     */
    
    // 做相應的判斷是前臺還是後臺
    if (application.applicationState == UIApplicationStateActive) {
        
        // 程序當前正處於前臺 如果不做處理裏面不用寫 就可以了
        
        /*
         關於userInfo的結構,參照蘋果的官方結構:
         {
         "aps" : {
         "alert" : "You got your emails.",
         "badge" : 9,
         "sound" : "bingbong.aiff"
         "acme1" : "bar",
         "acme2" : 42
         }
         
         即key aps 對應了有一個字典,裏面是該次推送消息的具體信息。具體跟我們註冊的推送類型有關。另外剩下的一些key就是用戶自定義的了。
         */
        
    } else if (application.applicationState == UIApplicationStateInactive) {
        // 程序處於後臺 做相應的處理
        for (NSString *tfStr in userInfo) {
            if ([tfStr isEqualToString:@"careline"]) {
                JumpViewController *_viewController =  [[JumpViewController alloc]init];
                UINavigationController *nav= (UINavigationController *)self.window.rootViewController;
                [nav pushViewController:_viewController animated:YES];
            }
        }
    }
}


- (void)applicationWillResignActive:(UIApplication *)application {
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    
    NSLog(@" \n ------ App 在後臺運行 點擊 icon 激活的APP ------");
    
    if (application.applicationIconBadgeNumber != 0) {
        
        // 發起請求獲取未讀消息的內容
        
        // 點擊 icon 從後臺進入應用時, 對 badge 的處理
        application.applicationIconBadgeNumber = 0;
        
        // 清除導航欄未讀的通知
        [_notificationCenter removeAllDeliveredNotifications];
        
    }
    
    /* 備註:
     APP在後臺:  如果不是點擊通知欄進入APP, 是通過點擊icon 進入程序是拿不到推送消息的。
     原因是這樣的:如果堆積了多條應用,回調將會變得複雜,而且沒用。
     正確的做法是,服務器要緩存好當前的未讀消息,進入應用的時候去獲取未讀消息。
     */
}

- (void)applicationWillTerminate:(UIApplication *)application { }

@end

 

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