iOS 如何為項(xiàng)目添加消息推送及使用友盟推送記錄

現(xiàn)在為我們的項(xiàng)目添加推送功能有兩種方式

1:使用Token Authentication (p8)方式,也是現(xiàn)在推薦的方式

Token Authentication (p8)是 APNs 新推出的推送鑒權(quán)方式,這種新的方式有很多優(yōu)勢

  • 同一個(gè)賬戶下所有 App 無論是測試 App 還是正式版 App募强,都能使用同一個(gè) key 來發(fā)推送消息和 voice-over-Internet Protocol (VoIP) 消息姿染,不再需要為每個(gè) App 生成一個(gè)證書
  • 生成的 Auth Key 不再有過期時(shí)間赋咽,無需像證書那樣每年需要重新生成一次
  • 生成過程簡單,不需要繁瑣菌湃、易錯(cuò)的證書導(dǎo)出操作

創(chuàng)建Token Authentication (p8)

image.png

點(diǎn)擊keys旁邊的添加,然后我們勾選圖中的選擇遍略,點(diǎn)擊continue
image.png

下載后會(huì)有一個(gè).p8文件惧所,AuthKey_keyxxxxx.p8
image.png

如果我們使用第三方推送,比如友盟绪杏,個(gè)推等下愈,我們還需要Team ID
image.png

這里以友盟推送示列,我們?nèi)ビ衙松吓渲靡幌吕倬茫詈簏c(diǎn)擊確認(rèn)添加势似,如果不出意外,添加成功
image.png

2:使用證書的方式來添加消息推送

1:從CA請(qǐng)求證書

image.png

WechatIMG7.png

2:蘋果開發(fā)者網(wǎng)站創(chuàng)建推送證書僧著,點(diǎn)擊+號(hào)
image.png

我們創(chuàng)建開發(fā)和發(fā)布環(huán)境都支持的證書
image.png

選擇我們要?jiǎng)?chuàng)建推送證書的App ID履因,綁定證書與App的關(guān)系,這個(gè)App就可以實(shí)現(xiàn)消息推送功能
image.png

選擇剛剛創(chuàng)建的CA證書
WechatIMG10.png

創(chuàng)建成功盹愚,下載證書搓逾,并添加到鑰匙串中
image.png

導(dǎo)出.p12文件備用
image.png

3:如果之前創(chuàng)建了App ID,我們需要為此App ID開啟推送

image.png

4:如果已經(jīng)創(chuàng)建描述文件杯拐,需要重新保存

WechatIMG13.png

5:使用證書方式推送霞篡,我們?nèi)ビ衙藶榇朔绞竭M(jìn)行配置

image.png

3:設(shè)置xcode,開啟推送功能

在xcode中為我們的項(xiàng)目打開我們的消息推送功能

image.png

其他消息推送功能也記錄下端逼,關(guān)于app后臺(tái)運(yùn)行的功能

voice over ip 簡稱voip朗兵,需要配置證書,如果你的項(xiàng)目包含語音通話顶滩,類似微信語音視頻功能余掖,可以選擇此項(xiàng),app處于后臺(tái)或者殺死app礁鲁,收到此消息都會(huì)喚醒a(bǔ)pp執(zhí)行一個(gè)方法盐欺,審核需要提供呼叫功能演示視頻
Remote nitifications 靜默推送,推送方式類似消息推送仅醇,不過不會(huì)彈出消息框冗美,app處于后臺(tái)會(huì)被喚醒調(diào)用一個(gè)方法,我們可以在這個(gè)方法中處理一些事情析二,但是殺掉app就收不到此推送
APNS 普通消息推送粉洼,app處于后臺(tái)或者殺死app都能收到节预,但不會(huì)喚醒a(bǔ)pp調(diào)用方法

這里我選擇開啟后臺(tái)的靜默推送

image.png

添加推送的代碼,使用友盟推送

// Push功能配置
    UMessageRegisterEntity * entity = [[UMessageRegisterEntity alloc] init];
    entity.types = UMessageAuthorizationOptionBadge|UMessageAuthorizationOptionAlert|UMessageAuthorizationOptionSound;
    if (@available(iOS 10.0, *)) {
        // 如果要在iOS10顯示交互式的通知属韧,必須注意實(shí)現(xiàn)以下代碼
        UNNotificationAction *action1_ios10 = [UNNotificationAction actionWithIdentifier:@"action1_identifier" title:@"打開應(yīng)用" options:UNNotificationActionOptionForeground];
        UNNotificationAction *action2_ios10 = [UNNotificationAction actionWithIdentifier:@"action2_identifier" title:@"忽略" options:UNNotificationActionOptionForeground];
        
        //UNNotificationCategoryOptionNone
        //UNNotificationCategoryOptionCustomDismissAction  清除通知被觸發(fā)會(huì)走通知的代理方法
        //UNNotificationCategoryOptionAllowInCarPlay       適用于行車模式
        UNNotificationCategory *category1_ios10 = [UNNotificationCategory categoryWithIdentifier:@"category1" actions:@[action1_ios10, action2_ios10] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
        NSSet *categories = [NSSet setWithObjects:category1_ios10, nil];
        entity.categories = categories;
        
        [UNUserNotificationCenter currentNotificationCenter].delegate = self;
    }else {
        // 如果你期望使用交互式(只有iOS 8.0及以上有)的通知安拟,請(qǐng)參考下面注釋部分的初始化代碼
        UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
        action1.identifier = @"action1_identifier";
        action1.title=@"打開應(yīng)用";
        action1.activationMode = UIUserNotificationActivationModeForeground;//當(dāng)點(diǎn)擊的時(shí)候啟動(dòng)程序
        
        UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];  //第二按鈕
        action2.identifier = @"action2_identifier";
        action2.title=@"忽略";
        action2.activationMode = UIUserNotificationActivationModeBackground;//當(dāng)點(diǎn)擊的時(shí)候不啟動(dòng)程序,在后臺(tái)處理
        action2.authenticationRequired = YES;//需要解鎖才能處理宵喂,如果action.activationMode = UIUserNotificationActivationModeForeground;則這個(gè)屬性被忽略糠赦;
        action2.destructive = YES;
        UIMutableUserNotificationCategory *actionCategory1 = [[UIMutableUserNotificationCategory alloc] init];
        actionCategory1.identifier = @"category1"; //這組動(dòng)作的唯一標(biāo)示
        [actionCategory1 setActions:@[action1, action2] forContext:(UIUserNotificationActionContextDefault)];
        NSSet *categories = [NSSet setWithObjects:actionCategory1, nil];
        entity.categories = categories;
    }
    [UMessage registerForRemoteNotificationsWithLaunchOptions:launchOptions Entity:entity completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted) {
            DLog(@"注冊(cè)消息通知成功");
        }else {
            
        }
    }];

// 注冊(cè)消息推送成功,收到token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //獲取終端設(shè)備標(biāo)識(shí)锅棕,這個(gè)標(biāo)識(shí)需要通過接口發(fā)送到服務(wù)器端愉棱,服務(wù)器端推送消息到APNS時(shí)需要知道終端的標(biāo)識(shí),APNS通過注冊(cè)的終端標(biāo)識(shí)找到終端設(shè)備哲戚。
    NSLog(@"推送的token %@",[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
                  stringByReplacingOccurrencesOfString: @">" withString: @""]
                 stringByReplacingOccurrencesOfString: @" " withString: @""]);
//    DLog(@"推送的token %@", currentDeviceToken);
    [UMessage registerDeviceToken:deviceToken];
}

// ios10以下 前臺(tái)收到推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    DLog(@"推送消息 didReceiveRemoteNotification")
}
// ios10以下 后臺(tái)收到消息推送
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [UMessage setAutoAlert:NO];
    DLog(@"推送消息 didReceiveRemoteNotification fetchCompletionHandler");
    if([[[UIDevice currentDevice] systemVersion] intValue] < 10){
        [UMessage didReceiveRemoteNotification:userInfo];
    }
    completionHandler(UIBackgroundFetchResultNewData);
}

//iOS10新增:處理前臺(tái) *收到通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler API_AVAILABLE(ios(10.0)){
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        // 不要開啟彈出框
        [UMessage setAutoAlert:NO];
        // 應(yīng)用處于前臺(tái)時(shí)的遠(yuǎn)程推送接受
        // 必須加這句代碼
        [UMessage didReceiveRemoteNotification:userInfo];
    }else{
        //應(yīng)用處于前臺(tái)時(shí)的本地推送接受
    }
    DLog(@"推送消息 userNotificationCenter willPresentNotification");
    completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);
}

//iOS10新增:處理后臺(tái) *點(diǎn)擊通知的代理方法(后臺(tái)靜默推送會(huì)調(diào)用此方法)
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)){
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    if (@available(iOS 10.0, *)) {
        if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
            //應(yīng)用處于后臺(tái)時(shí)的遠(yuǎn)程推送接受
            //必須加這句代碼
            [UMessage didReceiveRemoteNotification:userInfo];
        }else{
            //應(yīng)用處于后臺(tái)時(shí)的本地推送接受
        }
    } else {
        // Fallback on earlier versions
    }
    DLog(@"推送消息 userNotificationCenter didReceiveNotificationResponse");
}

4:遇到的坑奔滑,關(guān)于使用友盟推送遇到的問題記錄

使用友盟推送時(shí),當(dāng)我們使用development證書調(diào)試時(shí)顺少,無法收到推送的消息朋其,推送失敗如下device-token全部失敗

image.png

我們可以發(fā)現(xiàn)下圖中,debug下選擇的development證書的ID與TeamID不相同
development

我們看看release下選擇的distribution證書ID和TeamID是相同的
distribution

嘗試在debug下使用distribution證書脆炎,真機(jī)無法運(yùn)行起來
image.png

解決辦法1:將程序打包成Ad hoc安裝梅猿,這樣就可以收到消息推送
解決辦法2:使用測試消息推送的工具,比如Pusher秒裕,測試工具需要選擇證書推送的情況下才能使用

image.png

5:記錄下消息推送的格式

iOS10之前的格式

{  
   "aps":{  
      "alert":"內(nèi)容",
      "badge":1,
      "sound":"default",
      "userinfo":{"username":"tom"}
   }
}

iOS 10及之后(iOS7袱蚓、iOS8、iOS9可通用此模板)

{  
   "aps":{  
      "alert":{  
         "title":"標(biāo)題", // iOS7几蜻、8設(shè)置無效喇潘,iOS9一般設(shè)置為appName
         "subtitle":"子標(biāo)題", // 一般使用title就能滿足需求
         "body":"內(nèi)容"
      },
      "badge":1, //角標(biāo)數(shù)
      "sound":"default", //聲音
      "userinfo":{ //通知內(nèi)容信息
           "playid":"123",
           "username":"tom",
           "sex":1
      }
   }
}
參考文章:

https://leancloud.cn/docs/ios_push_cert.html#hash1133282448
https://developer.umeng.com/docs/66632/detail/66734
https://blog.csdn.net/zykccss/article/details/58259240

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梭稚,隨后出現(xiàn)的幾起案子颖低,更是在濱河造成了極大的恐慌,老刑警劉巖弧烤,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忱屑,死亡現(xiàn)場離奇詭異,居然都是意外死亡暇昂,警方通過查閱死者的電腦和手機(jī)莺戒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來急波,“玉大人从铲,你說我怎么就攤上這事♂Q拢” “怎么了食店?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赏寇。 經(jīng)常有香客問我吉嫩,道長,這世上最難降的妖魔是什么嗅定? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任自娩,我火速辦了婚禮,結(jié)果婚禮上渠退,老公的妹妹穿的比我還像新娘忙迁。我一直安慰自己,他們只是感情好碎乃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布姊扔。 她就那樣靜靜地躺著,像睡著了一般梅誓。 火紅的嫁衣襯著肌膚如雪恰梢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天梗掰,我揣著相機(jī)與錄音嵌言,去河邊找鬼。 笑死及穗,一個(gè)胖子當(dāng)著我的面吹牛摧茴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埂陆,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼苛白,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焚虱?” 一聲冷哼從身側(cè)響起丸氛,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎著摔,沒想到半個(gè)月后缓窜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谍咆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年禾锤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摹察。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恩掷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出供嚎,到底是詐尸還是另有隱情黄娘,我是刑警寧澤峭状,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站逼争,受9級(jí)特大地震影響优床,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜誓焦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一胆敞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杂伟,春花似錦移层、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至越平,卻和暖如春匪燕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喧笔。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來泰國打工帽驯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人书闸。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓尼变,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浆劲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫌术,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

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