iOS推送測(cè)試——Easy APNs Provider

很多同學(xué)在接入APNS服務(wù)的時(shí)候构捡,十有八九會(huì)遇到不少問題忠聚。尤其是在接某些第三方推送服務(wù)SDK的時(shí)候挠日。這里介紹一下如何使用Easy APNs Provider測(cè)試推送逮京,以后就可以判斷是在哪個(gè)環(huán)節(jié)出了問題了,非常方便腻窒。

推送設(shè)置

要實(shí)現(xiàn)推送需要兩個(gè)前提:

  1. 打開capabilities的push notifications選項(xiàng)


  2. 打開capabilities的background modes中的Remote notifications


當(dāng)然最為重要的還是需要在AppDelegate中寫相關(guān)的代碼昵宇,下面是一個(gè)簡單的例子磅崭,可以在這個(gè)邏輯更改儿子。很多同學(xué)會(huì)遇到為什么什么娶不到token的問題,原因就是或多或少你少了下面的某些代碼砸喻。

推送代碼

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [self registRemoteNotification];
    return YES;
}

- (void)registRemoteNotification {
#ifdef __IPHONE_8_0
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
        
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    } else {
        UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
        
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
    }
    
#else
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
    
#endif
}



#pragma mark - remote Notification

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
    [application registerForRemoteNotifications];
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)devToken {
    
    NSString *devToken_str = [NSString stringWithFormat:@"%@",devToken];
    devToken_str = [self removeSpace:devToken_str];
    devToken_str = [self removeBracket:devToken_str];
    NSLog(@"%@", devToken_str);
    [[NSNotificationCenter defaultCenter] postNotificationName:@"PUSHTOEKN" object:nil userInfo:@{@"token":devToken_str}];
}

- (void) application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
 {
    
    NSLog(@"%@",error);
    
}

//ios 7.0

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    
    NSLog(@"did recevive remote noti userInfo %@ for ios 7 ",userInfo);
    
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    
    /**
     
     *  系統(tǒng)會(huì)估量App消耗的電量柔逼,并根據(jù)傳遞的UIBackgroundFetchResult 參數(shù)記錄新數(shù)據(jù)是否可用
     
     *  調(diào)用完成的處理代碼時(shí),應(yīng)用的界面縮略圖會(huì)自動(dòng)更新
     
     */
    
    NSLog(@"did Receive Remote Notification userInfo %@",userInfo);
    
    switch (application.applicationState) {
            
        case UIApplicationStateActive:
            
            completionHandler(UIBackgroundFetchResultNewData);
            
            break;
            
        case UIApplicationStateInactive:
            
            completionHandler(UIBackgroundFetchResultNewData);
            
            break;
            
        case UIApplicationStateBackground:
            
            completionHandler(UIBackgroundFetchResultNewData);
            
            break;
            
        default:
            
            break;
            
    }
}



- (NSString *)removeSpace:(NSString *)str{
    NSString *r_str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
    return r_str;
}

- (NSString *)removeBracket:(NSString *)str{
    NSString *r_str = [str stringByReplacingOccurrencesOfString:@"<" withString:@""];
    r_str = [r_str stringByReplacingOccurrencesOfString:@">" withString:@""];
    return r_str;
}

測(cè)試工具

這是一個(gè)良心的測(cè)試工具割岛,Mac AppStore下載地址Easy APNs Provider

具體使用頁面:


使用步驟按照界面所標(biāo)注的1——6進(jìn)行愉适,接下來分別介紹。

1. 添加Token

添加Token界面.

建議不要弄什么花里胡哨的癣漆,最好使用手動(dòng)添加维咸。
連接真機(jī)運(yùn)行,打Log獲取deviceToken

#pragma mark 注冊(cè)通知
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken
{
    NSLog(@"deviceToken:%@",deviceToken);
}

注意:輸出的deviceToken是NSData類型的,要的就是這個(gè).
輸出的Log如下:

deviceToken:<9bf8412c 55df912e 12e689f3 4c4a4c72 361262bb efbdf526 e01ebb6d 223a80c9>

把那一串數(shù)字字符組合粘貼出來刪除空格癌蓖,然后復(fù)制粘貼到手動(dòng)添加的框里
注: 1瞬哼、不要token兩端的尖括號(hào) 2、空格刪完之后再添加租副,那個(gè)框框只能放64個(gè)字符,多的會(huì)自動(dòng)刪除

2. 添加證書

一般推送證書有一下三類坐慰。voip相關(guān)的證書可能有些同學(xué)用不到,這也沒關(guān)系用僧。這里講講Token和證書之間的關(guān)系结胀,非常非常重要!T鹧糟港!


15288888918570.jpg
  • Token和推送證書必須配對(duì),也就是Debug下的Token院仿,不能用Release的推送證書着逐;Release下的Token,不能用Debug的推送證書意蛀,
  • 蘋果會(huì)根據(jù)應(yīng)用是開發(fā)包(Debug)還是發(fā)布包(Release)發(fā)送不同的Token耸别。如下圖所示


3. 選擇蘋果APNS地址

Apple提供了Debug和Release的兩個(gè)地址,一個(gè)是gateway.sandbox.push.apple.com县钥,另一個(gè)是gateway.sandbox.push.apple.com秀姐。如下所示

同樣APNS地址和證書也必須匹配。

4. 設(shè)置推送內(nèi)容

支持推送的內(nèi)容有標(biāo)題若贮、內(nèi)容省有、未讀數(shù)(圖標(biāo))、聲音谴麦。比較遺憾的是沒有支持iOS10之后可以推送圖片視圖等入口蠢沿。不過對(duì)于一般推送而言已經(jīng)夠了。

不要被這里的圖標(biāo)所迷惑了匾效,其實(shí)這里的圖標(biāo)就是所謂的未讀數(shù)舷蟀。

注意一下Content-Avaliable:


5.發(fā)送推送

在發(fā)送之前一定要在步驟3的時(shí)候,連接到APNS地址

如果一切正常的情況下面哼,會(huì)在下面的信息框中提示:

正在連接到gateway.sandbox.push.apple.com
已連接至服務(wù)器野宜,正在驗(yàn)證身份...
身份已驗(yàn)證,您可以發(fā)送推送消息了魔策。

推送已嘗試發(fā)送至test匈子,APN識(shí)別:0x0BC5816B

當(dāng)然,如果你證書和服務(wù)器不匹配闯袒,則會(huì)提示:

正在連接到gateway.push.apple.com
已連接至服務(wù)器虎敦,正在驗(yàn)證身份...
身份已驗(yàn)證游岳,您可以發(fā)送推送消息了。
服務(wù)端主動(dòng)斷開連接其徙,這可能是由于證書錯(cuò)誤吭历,發(fā)送的數(shù)據(jù)錯(cuò)誤,網(wǎng)絡(luò)錯(cuò)誤等原因引起的擂橘。

如果你的token和證書不匹配晌区,則會(huì)提示:

正在連接到gateway.sandbox.push.apple.com
已連接至服務(wù)器,正在驗(yàn)證身份...
身份已驗(yàn)證通贞,您可以發(fā)送推送消息了朗若。
推送已嘗試發(fā)送至test,APN識(shí)別:0x22E82902
嘗試發(fā)送推送到test失敗昌罩,錯(cuò)誤描述:無效的設(shè)備Token哭懈,APN識(shí)別:0x22E82902
服務(wù)端主動(dòng)斷開連接,這可能是由于證書錯(cuò)誤茎用,發(fā)送的數(shù)據(jù)錯(cuò)誤遣总,網(wǎng)絡(luò)錯(cuò)誤等原因引起的。

6. 斷開連接

一般在想要換證書或者服務(wù)器地址的時(shí)候才需要斷開轨功,進(jìn)而重新建立連接旭斥。

可能遇到的問題

process launch failed

Debug環(huán)境運(yùn)行沒問題,Release環(huán)境會(huì)彈出以下提示:

解決辦法古涧,在Release的環(huán)境下去掉斷點(diǎn)即可垂券,參照下圖:

注:Debug executable 意思是是否可以斷點(diǎn)執(zhí)行,Release模式下不可以打斷點(diǎn)羡滑,所以這項(xiàng)要勾掉菇爪,勾掉之后不會(huì)影響Log的輸出。

token不匹配

一般在我們?cè)谏蟼鞣?wù)端token的時(shí)候會(huì)標(biāo)識(shí)當(dāng)前的環(huán)境是debug還是release環(huán)境下的token柒昏。我們簡稱devtype凳宙,0代表release,1代表debug职祷。那么在特別注意在debug環(huán)境下一定要傳1氏涩,release環(huán)境下傳0。而實(shí)際項(xiàng)目中往往有多個(gè)開關(guān)控制環(huán)境堪旧,比如調(diào)用的API的削葱、傳遞token的。千萬不要忘了其中一個(gè)淳梦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昔字,隨后出現(xiàn)的幾起案子爆袍,更是在濱河造成了極大的恐慌首繁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陨囊,死亡現(xiàn)場(chǎng)離奇詭異弦疮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蜘醋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門胁塞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人压语,你說我怎么就攤上這事啸罢。” “怎么了胎食?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵扰才,是天一觀的道長。 經(jīng)常有香客問我厕怜,道長衩匣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任粥航,我火速辦了婚禮琅捏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘递雀。我一直安慰自己午绳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布映之。 她就那樣靜靜地躺著拦焚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杠输。 梳的紋絲不亂的頭發(fā)上赎败,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音蠢甲,去河邊找鬼僵刮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鹦牛,可吹牛的內(nèi)容都是我干的搞糕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼曼追,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窍仰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起礼殊,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤驹吮,失蹤者是張志新(化名)和其女友劉穎针史,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碟狞,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啄枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了族沃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片频祝。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脆淹,靈堂內(nèi)的尸體忽然破棺而出常空,到底是詐尸還是另有隱情,我是刑警寧澤未辆,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布窟绷,位于F島的核電站,受9級(jí)特大地震影響咐柜,放射性物質(zhì)發(fā)生泄漏兼蜈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一拙友、第九天 我趴在偏房一處隱蔽的房頂上張望为狸。 院中可真熱鬧,春花似錦遗契、人聲如沸辐棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漾根。三九已至,卻和暖如春鲫竞,著一層夾襖步出監(jiān)牢的瞬間辐怕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工从绘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寄疏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓僵井,卻偏偏與公主長得像陕截,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子批什,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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