iOS開發(fā) - 友盟推送

在iOS 開發(fā)中項(xiàng)目會集成推送功能, 推送的三方很多,如友盟,極光推送.他們的推送原理大致差不多,文檔也寫的很詳細(xì).因公司項(xiàng)目中用到了友盟推送,以實(shí)際項(xiàng)目為例進(jìn)行總結(jié),僅供參考.

1.推送原理:#####

*1.拿到device token - *** App注冊推送 -> 通過設(shè)備向(APNS)蘋果推送服務(wù)器請求device token (圖中上半部分) -> APP 拿到token
2.通過token 發(fā)送推送 - 拿到 token 后,將token 發(fā)送到服務(wù)器 -> 要發(fā)送通知時,服務(wù)器將token 和 message 發(fā)送到APNS -> APNS 推送消息到APP(圖中下半部分)

推送原理

2.配置證書:#####

證書這一塊的話友盟推送文檔中介紹的很詳細(xì),可參考 iOS證書配置指南.
與正常配置證書差不多,不同之處的話有一下三點(diǎn):
1.創(chuàng)建APPid時,要點(diǎn)選Push Notification選項(xiàng)

開啟push 功能

2.創(chuàng)建推送證書,推送證書分為開發(fā)環(huán)境和生產(chǎn)環(huán)境
開發(fā)環(huán)境證書

生產(chǎn)環(huán)境證書
3.導(dǎo)出p12文件,在友盟上傳p12文件#####
友盟上傳p12文件
4.項(xiàng)目集成#####

1.導(dǎo)入SDK
2.引入庫文件


UserNotification.framework

3.配置(可選項(xiàng))
SDK采用ARC管理內(nèi)存,非ARC項(xiàng)目也是默認(rèn)支持
用了-all_load箭窜,可能需要添加libz的庫:
TARGETS -> Build Phases ->Link Binary With Libraries -> + ->libz.dylib
3.打開推送開關(guān)

打開推送開關(guān)
5.添加代碼#####

初始化 iOS 10.0以下

//初始化
[UMessage startWithAppkey:@"your appkey" launchOptions:launchOptions];
//注冊通知
[UMessage registerForRemoteNotifications];

初始化 iOS 10.0

//初始化
[UMessage startWithAppkey:@"your appkey" launchOptions:launchOptions];
//注冊通知
[UMessage registerForRemoteNotifications];
//iOS10必須加下面這段代碼毯焕。
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    //設(shè)置代理
    center.delegate=self;
    //授權(quán)
UNAuthorizationOptions types10=UNAuthorizationOptionBadge|UNAuthorizationOptionAlert|UNAuthorizationOptionSound;
[center requestAuthorizationWithOptions:types10 completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted) {
            //點(diǎn)擊允許
            
        } else {
            //點(diǎn)擊不允許
        }
}];

為通知添加按鈕 iOS 10.0以下

UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
    action1.identifier = @"action1_identifier";
    action1.title=@"打開應(yīng)用";
    action1.activationMode = UIUserNotificationActivationModeForeground;//當(dāng)點(diǎn)擊的時候啟動程序
    
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];  //第二按鈕
    action2.identifier = @"action2_identifier";
    action2.title=@"忽略";
    action2.activationMode = UIUserNotificationActivationModeBackground;//當(dāng)點(diǎn)擊的時候不啟動程序,在后臺處理
    action2.authenticationRequired = YES;//需要解鎖才能處理
    action2.destructive = YES;

UIMutableUserNotificationCategory *actionCategory1 = [[UIMutableUserNotificationCategory alloc] init];
    actionCategory1.identifier = @"category1";//這組動作的唯一標(biāo)示
    [actionCategory1 setActions:@[action1,action2] forContext:(UIUserNotificationActionContextDefault)];
NSSet *categories = [NSSet setWithObjects:actionCategory1, nil];

[UMessage registerForRemoteNotifications:categories];

為通知添加按鈕 iOS 10.0

        UNNotificationAction *action1_ios10 = [UNNotificationAction actionWithIdentifier:@"action1_ios10_identifier" title:@"打開應(yīng)用" options:UNNotificationActionOptionForeground];
        UNNotificationAction *action2_ios10 = [UNNotificationAction actionWithIdentifier:@"action2_ios10_identifier" title:@"忽略" options:UNNotificationActionOptionForeground];
        //UNNotificationCategoryOptionNone
        //UNNotificationCategoryOptionCustomDismissAction  清除通知被觸發(fā)會走通知的代理方法
        //UNNotificationCategoryOptionAllowInCarPlay       適用于行車模式
        
        UNNotificationCategory *category1_ios10 = [UNNotificationCategory categoryWithIdentifier:@"category101" actions:@[action1_ios10,action2_ios10]   intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
        NSSet *categories_ios10 = [NSSet setWithObjects:category1_ios10, nil];
        [center setNotificationCategories:categories_ios10];

接收通知 iOS 10.0以下

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    //關(guān)閉友盟自帶的彈出框
    [UMessage setAutoAlert:NO];
    [UMessage didReceiveRemoteNotification:userInfo];
      //userInfo 中存有接受通知的信息
       self.userInfo = userInfo;
       //判斷APP的狀態(tài)
      if([UIApplication sharedApplication].applicationState = UIApplicationStateActive) {

     }
}

接收通知 iOS 10.0

//處理前臺收到通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
    NSDictionary * userInfo = notification.request.content.userInfo;
  //判斷是否為遠(yuǎn)程推送的通知類型
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        //應(yīng)用處于前臺時的遠(yuǎn)程推送接受
        //關(guān)閉友盟自帶的彈出框
        [UMessage setAutoAlert:NO];
        //必須加這句代碼
        [UMessage didReceiveRemoteNotification:userInfo];
        
    }else{
        //應(yīng)用處于前臺時的本地推送接受
    }
    //當(dāng)應(yīng)用處于前臺時提示設(shè)置,需要哪個可以設(shè)置哪一個
    completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);
}

//iOS10新增:處理后臺點(diǎn)擊通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
    NSDictionary * userInfo = response.notification.request.content.userInfo;
  //判斷是否為遠(yuǎn)程推送的通知類型
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        //應(yīng)用處于后臺時的遠(yuǎn)程推送接受
        //必須加這句代碼
        [UMessage didReceiveRemoteNotification:userInfo];
        
    }else{
        //應(yīng)用處于后臺時的本地推送接受
    }
    
}

6.調(diào)試#####

獲取devicetoken,這個devicetoken 會在測試模式中添加設(shè)備使用

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

    //用戶可以在這個方法里面獲取devicetoken
//    NSLog(@"%@",[NSString  stringWithFormat:@"%@",[NSData dataWithData:deviceToken]]);
    NSLog(@"%@",[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
                  stringByReplacingOccurrencesOfString: @">" withString: @""]
                 stringByReplacingOccurrencesOfString: @" " withString: @""]);
    NSString *deviceStr = [NSString stringWithFormat:@"%@",[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
                                                               stringByReplacingOccurrencesOfString: @">" withString: @""]
                                                              stringByReplacingOccurrencesOfString: @" " withString: @""]];
    NSLog(@"%@", deviceStr);

打印出這個devicetoken后,就可以進(jìn)入友盟推送
1.進(jìn)入友盟推送點(diǎn)擊以添加好的設(shè)備

友盟推送登錄頁面

2.點(diǎn)擊測試模式菜單,點(diǎn)擊添加設(shè)備按鈕添加設(shè)備
添加設(shè)備

3.填寫測試推送的內(nèi)容
1

測試內(nèi)容中的參數(shù)和設(shè)備推送按鈕標(biāo)識符,根據(jù)自己的項(xiàng)目填寫就好

2634794-9c8adbb5a8147cf4.png

點(diǎn)擊立即發(fā)送后的測試結(jié)果如下

IMG_0002.PNG

IMG_0004.PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纳猫,一起剝皮案震驚了整個濱河市婆咸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芜辕,老刑警劉巖尚骄,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侵续,居然都是意外死亡倔丈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門状蜗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來需五,“玉大人,你說我怎么就攤上這事轧坎『暧剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵缸血,是天一觀的道長蜜氨。 經(jīng)常有香客問我,道長属百,這世上最難降的妖魔是什么记劝? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮族扰,結(jié)果婚禮上厌丑,老公的妹妹穿的比我還像新娘。我一直安慰自己渔呵,他們只是感情好怒竿,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扩氢,像睡著了一般耕驰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上录豺,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天朦肘,我揣著相機(jī)與錄音,去河邊找鬼双饥。 笑死媒抠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咏花。 我是一名探鬼主播趴生,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苍匆?” 一聲冷哼從身側(cè)響起刘急,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浸踩,沒想到半個月后叔汁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡民轴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年攻柠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片后裸。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡瑰钮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出微驶,到底是詐尸還是另有隱情浪谴,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布因苹,位于F島的核電站苟耻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扶檐。R本人自食惡果不足惜凶杖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望款筑。 院中可真熱鬧智蝠,春花似錦、人聲如沸奈梳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攘须。三九已至漆撞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間于宙,已是汗流浹背浮驳。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捞魁,地道東北人抹恳。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像署驻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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

  • 極光推送: 1.JPush當(dāng)前版本是1.8.2旺上,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐瓶蚂,SD...
    Isspace閱讀 6,724評論 10 16
  • 注:此文只現(xiàn)在已經(jīng)不能適配iOS10了,iOS10推送采用了新的方法宣吱,做iOS9及以下的系統(tǒng)可讀此篇文章窃这。 最近公...
    TIME_for閱讀 33,292評論 85 322
  • 前言 我們在實(shí)現(xiàn)推送功能的時候,更需要了解下推送的原理機(jī)制征候,這樣我們在發(fā)現(xiàn)問題時候才好定位到問題的解決辦法杭攻。 推送...
    進(jìn)無盡閱讀 3,856評論 0 5
  • 概述 在多數(shù)移動應(yīng)用中任何時候都只能有一個應(yīng)用程序處于活躍狀態(tài),如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,521評論 1 8
  • 今天背了單詞 在公司也背了疤坝! 健身了 和宇琪吃了火鍋 約了明天去姑姑家 幫貝貝弄了電腦兆解,解決一個持續(xù)很久的小煩惱
    rrreason閱讀 167評論 0 0