Discuz iOS應(yīng)用開發(fā) (bigApp iOS源碼分析 - Remote Notification)

源代碼中沒有發(fā)現(xiàn)Remote Notification的代碼械馆。
代碼中有發(fā)現(xiàn)JPush相關(guān)的引用嫉柴,但JPush庫(kù)并沒有引用厌杜。考慮可能是之前使用了JPush计螺,但后面刪除了期奔。
BigApp源碼中有JPush相關(guān)的PHP代碼,因此考慮之前是使用JPush來實(shí)現(xiàn)iOS端的推送的危尿。

Todo:

  • 調(diào)查JPush的使用
  • 調(diào)查JPush相關(guān)的PHP代碼的使用

發(fā)現(xiàn)了一份最新的iOS客戶端源碼呐萌,帶JPush相關(guān)的設(shè)置,fork到https://github.com/Inspirelife96/Discuz_IOS 谊娇。

新代碼肺孤,從工程文件的變化來看罗晕,添加了JPush和SMS。
Diff了一下其他代碼的變化赠堵,修正了發(fā)帖崩潰的代碼小渊,還有就是添加了分享的代碼。

5/24 更新
看來bigApp確實(shí)使用了JPush茫叭,但最新的源碼只是添加了JPush的注冊(cè)代碼酬屉,但并沒有和用戶綁定。

我們需要做的是:

  1. 向JPush Server注冊(cè)Device Token揍愁。
  2. 綁定Device Token和用戶的UserName (UserId呐萨?)
  3. 修改Badge的值(?根據(jù)推送來源分類莽囤?修改會(huì)困難谬擦?)

剩下的交給服務(wù)器端來做,需要根據(jù)UserName和JPushServer通信向指定的Device推送信息朽缎。

【極光推送】給指定用戶發(fā)送消息

接下來就是各種配置了:
https://developer.apple.com官網(wǎng)要做的事:

  1. 申請(qǐng)app id (例如com.xxxxxxx.bigapp)惨远。記得開Push Notification選項(xiàng)
  2. 配置Push Notificaiton的開發(fā)和生產(chǎn)證書。導(dǎo)出相應(yīng)的.p12文件话肖。
  3. 配置項(xiàng)目對(duì)應(yīng)的開發(fā)和生產(chǎn)Provisioning 文件北秽。

極光https://www.jiguang.cn需要做的事:

  1. 注冊(cè)并添加一個(gè)新的應(yīng)用
  2. 配置iOS的推送信息。需要用到上面的.p12文件最筒。
配置iOS的推送信息.png

具體的流程可以參考這里iOS最新極光推送詳解

客戶端開發(fā)
參考官方文檔https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new/贺氓,稍微做了下整合。

  1. 暫時(shí)是手動(dòng)添加的是钥,希望以后能改成cocoapods
  2. iOS8適配掠归,開啟Push Notification 功能。
  3. iOS9適配悄泥, 開啟jpush.cn http白名單
  4. iOS10適配虏冻, UserNotifications

代碼

  • 添加Delegate
@interface AppDelegate ()<JPUSHRegisterDelegate>

@end
  • 添加初始化APNs代碼以及添加初始化JPush代碼,適配iOS10弹囚,封裝在下面這個(gè)函數(shù)并在-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions調(diào)用
 - (void)setupJPush:(NSDictionary *)launchOptions {
    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
    entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
    [self registerForRemoteNotification];
    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
    
    [JPUSHService setupWithOption:launchOptions appKey:@"56acc62e21172eafa0c54091"
                          channel:@"iOS"
                 apsForProduction:NO
            advertisingIdentifier:nil];
}
/**
 * 初始化UNUserNotificationCenter
 */
- (void)registerForRemoteNotification {
    // iOS10 兼容
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
        // 使用 UNUserNotificationCenter 來管理通知
        UNUserNotificationCenter *uncenter = [UNUserNotificationCenter currentNotificationCenter];
        // 監(jiān)聽回調(diào)事件
        [uncenter setDelegate:self];
        //iOS10 使用以下方法注冊(cè)厨相,才能得到授權(quán)
        [uncenter requestAuthorizationWithOptions:(UNAuthorizationOptionAlert+UNAuthorizationOptionBadge+UNAuthorizationOptionSound)
                                completionHandler:^(BOOL granted, NSError * _Nullable error) {
                                    [[UIApplication sharedApplication] registerForRemoteNotifications];
                                    //TODO:授權(quán)狀態(tài)改變
                                    NSLog(@"%@" , granted ? @"授權(quán)成功" : @"授權(quán)失敗");
                                }];
        // 獲取當(dāng)前的通知授權(quán)狀態(tài), UNNotificationSettings
        [uncenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
            NSLog(@"%s\nline:%@\n-----\n%@\n\n", __func__, @(__LINE__), settings);
            /*
             UNAuthorizationStatusNotDetermined : 沒有做出選擇
             UNAuthorizationStatusDenied : 用戶未授權(quán)
             UNAuthorizationStatusAuthorized :用戶已授權(quán)
             */
            if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
                NSLog(@"未選擇");
            } else if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
                NSLog(@"未授權(quán)");
            } else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) {
                NSLog(@"已授權(quán)");
            }
        }];
    }
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        UIUserNotificationType types = UIUserNotificationTypeAlert |
        UIUserNotificationTypeBadge |
        UIUserNotificationTypeSound;
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
        
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        UIRemoteNotificationType types = UIRemoteNotificationTypeBadge |
        UIRemoteNotificationTypeAlert |
        UIRemoteNotificationTypeSound;
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
    }
#pragma clang diagnostic pop
}
  • 注冊(cè)APNs成功并上報(bào)DeviceToken
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    /// Required - 注冊(cè) DeviceToken
    [JPUSHService registerDeviceToken:deviceToken];
}
  • 其他回調(diào)函數(shù)
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
    // Required
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler(UNNotificationPresentationOptionAlert); // 需要執(zhí)行這個(gè)方法,選擇是否提醒用戶鸥鹉,有Badge蛮穿、Sound、Alert三種類型可以選擇設(shè)置
}

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    // Required
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler();  // 系統(tǒng)要求執(zhí)行這個(gè)方法
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    
    // Required, iOS 7 Support
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    
    // Required,For systems with less than or equal to iOS6
    [JPUSHService handleRemoteNotification:userInfo];
}

#pragma mark - 實(shí)現(xiàn)注冊(cè)APNs失敗接口(可選)
///=============================================================================
/// @name 實(shí)現(xiàn)注冊(cè)APNs失敗接口(可選)
///=============================================================================

/**
 * also used in iOS10
 */
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"%s\n[無法注冊(cè)遠(yuǎn)程提醒, 錯(cuò)誤信息]\nline:%@\n-----\n%@\n\n", __func__, @(__LINE__), error);
}

測(cè)試log輸出:成功在JPush Server上進(jìn)行了注冊(cè)

屏幕快照 2017-05-23 下午7.28.06.png

利用JPush的測(cè)試工具進(jìn)行測(cè)試毁渗,可以看到收到了推送的消息


Bitmap.png

剩下的事:

  • 用戶登錄時(shí)或自動(dòng)登錄時(shí)將UserName綁定這個(gè)registrationID践磅。
  • 用戶退出登錄時(shí)將UserName和這個(gè)registrationID解除綁定。
  • 其余的交給服務(wù)器端處理【囊欤現(xiàn)在不清楚BigApp插件的php代碼是否已經(jīng)可以順利的進(jìn)行推送府适。

服務(wù)器端開發(fā)
Todo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羔飞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子檐春,更是在濱河造成了極大的恐慌逻淌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疟暖,死亡現(xiàn)場(chǎng)離奇詭異卡儒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)俐巴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門骨望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窜骄,你說我怎么就攤上這事锦募“谕停” “怎么了邻遏?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)虐骑。 經(jīng)常有香客問我准验,道長(zhǎng),這世上最難降的妖魔是什么廷没? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任糊饱,我火速辦了婚禮,結(jié)果婚禮上颠黎,老公的妹妹穿的比我還像新娘另锋。我一直安慰自己,他們只是感情好狭归,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布夭坪。 她就那樣靜靜地躺著,像睡著了一般过椎。 火紅的嫁衣襯著肌膚如雪室梅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天疚宇,我揣著相機(jī)與錄音亡鼠,去河邊找鬼。 笑死敷待,一個(gè)胖子當(dāng)著我的面吹牛间涵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榜揖,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼勾哩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼股耽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钳幅,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤物蝙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后敢艰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诬乞,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年钠导,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了震嫉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牡属,死狀恐怖票堵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逮栅,我是刑警寧澤悴势,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站措伐,受9級(jí)特大地震影響特纤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侥加,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一捧存、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧担败,春花似錦昔穴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至岖研,卻和暖如春卿操,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孙援。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工害淤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拓售。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓窥摄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親础淤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崭放,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)哨苛、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,126評(píng)論 4 61
  • 知道《目送》是很多年以前了币砂,讀過了《親愛的安德烈》建峭、《孩子你慢慢來》,卻遲遲沒有靜下心來讀一讀《目送》决摧。大抵是因?yàn)?..
    淺萌想念閱讀 590評(píng)論 0 2
  • 回溯項(xiàng)目還可以亿蒸,不完善還沒有進(jìn)度百分比先保存著 其他平臺(tái)的一些demohttps://code.hcharts.c...
    北方蜘蛛閱讀 23,365評(píng)論 6 2
  • 先知:女士們、先生們:歡迎來到生命之泉掌桩,大家盡情享受泉水的溫暖边锁,感受生命的樂趣!世界雖已和平波岛,但環(huán)境不容樂觀茅坛,人們...
    壺上春秋閱讀 355評(píng)論 0 0
  • 人的喜好都是偏向于喜歡看動(dòng)起來的東西贡蓖,同樣字幕添加特效也會(huì)更生動(dòng)。下面介紹一下幾種字幕特效的奇葩用法隔躲。 特效多層疊...
    人稱小太陽(yáng)閱讀 371評(píng)論 0 0