iOS-消息推送之遠(yuǎn)程推送和本地推送

一、原生開發(fā)推送

今天看到一篇很詳細(xì)的關(guān)于推送的相關(guān)文章,一系列的本地推送和遠(yuǎn)程推送都有,收藏下來,以備后用!

推送之基礎(chǔ)篇

推送之進(jìn)階篇1

推送之進(jìn)階篇2

DEMO地址

第一蝙叛、遠(yuǎn)程推送相關(guān)

一、前往開發(fā)者中心配置 推送調(diào)試證書(用于未上線前推送調(diào)試)和推送發(fā)布證書(用于上線后推送)
注冊證書鏈接

二褒颈、將證書的.cer和.p12文件提供給后臺合成.pem文件

三、代碼相關(guān)

    0.點擊工程 - TARGETS - Capabilities - Push Notifications 打開励堡,會在項目中生成一個 工程名.entitlements 文件

    1.在 AppDelegate 中導(dǎo)入 頭文件和協(xié)議

        // 推送
        #ifdef NSFoundationVersionNumber_iOS_9_x_Max
        #import <UserNotifications>
        #endif

        <UNUserNotificationCenterDelegate>

    2.在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法里實現(xiàn) 請求權(quán)限和注冊通知代碼

            // 推送相關(guān)
            if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
                //iOS10特有
                UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
                // 必須寫代理,不然無法監(jiān)聽通知的接收與點擊
                center.delegate = self;
                // 請求用戶權(quán)限
                [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
                    // 點擊允許
                    if (granted) {
                        NSLog(@"注冊成功");
                        [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                            NSLog(@"%@", settings);
                        }];
                    } else {
                        // 點擊不允許
                        NSLog(@"注冊失敗");
                    }
                }];
            }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0){
                //iOS8 - iOS10
                // 申請用戶權(quán)限
                [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]];
                
            }
            
            //此方法不寫 無法調(diào)用接收推送回調(diào)方法 didRegisterForRemoteNotificationsWithDeviceToken
            //注冊遠(yuǎn)程通知
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        
    3.將獲取到的 deviceToken值傳給后臺服務(wù)器堡掏,

            #pragma mark - 推送相關(guān)
            /* 獲取蘋果服務(wù)器返回的 Device Token */
            - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
                NSString *tokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
                NSLog(@"deviceTokenString : %@", tokenString);
        
            // 返給后臺 deviceToken 必須返回
            //    NSString *urlHttp = @"v.showbuy100.com/index.php?r=order/apns";
            //    NSString *urlString = [urlHttp stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
            //    [[MSUAFNRequest sharedInstance] postRequestWithURL:urlString parameters:tokenString withBlock:^(id obj, NSError *error) {
            //        if (!error) {
            //            NSLog(@"------------obj--------------%@",obj);
            //        }else{
            //            NSLog(@"-----------error---------------%@",error);
            //
            //        }
            //    }];
                
            }
            
            /* 獲得Device Token失敗 */
            - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
                NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
            }
            

    4.調(diào)用接收通知的代理方法 (注:前臺模式下暫無法接受推送消息应结,需要退到后臺才會顯示消息)
            /* 接收到推送消息的代理方法 */
            - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
                NSLog(@"-----------接收到了遠(yuǎn)程通知--------------%@",userInfo);
                if (application.applicationState == UIApplicationStateInactive) {
                    NSLog(@"Inactive");
                    completionHandler(UIBackgroundFetchResultNewData);
                    
                } else if (application.applicationState == UIApplicationStateActive){
                    NSLog(@"Active");
                    completionHandler(UIBackgroundFetchResultNewData);
            
                } else if (application.applicationState == UIApplicationStateBackground){
                    NSLog(@"Backround");
                    completionHandler(UIBackgroundFetchResultNewData);
            
                }
            }

        5.iOS10 新增方法
    /* iOS10 以后版本新增代理 關(guān)閉或后臺模式 點擊通知欄會調(diào)用這個方法 */
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
        NSLog(@"iOS10 后新增代理 點擊通知欄會調(diào)用這個方法");
        NSDictionary *dict = response.notification.request.content.userInfo;
        NSLog(@"推送--- %@",dict);
        NSDictionary *dataDic = dict[@"aps"];
    //    NSString *str = dict[@"aps"][@"alert"][@"title"];
        if ([dataDic[@"type"] isEqualToString:@"100"] || [dataDic[@"type"] isEqualToString:@"99"] || [dataDic[@"type"] isEqualToString:@"97"] || [dataDic[@"type"] isEqualToString:@"95"]) {// 100-發(fā)貨提醒:買家提醒買家發(fā)貨 | 99-您出售的商品 XX已完成交易,小貝已將XX元存入您的錢包 | 97-XX 買家購買的XX 商品,已發(fā)起退貨/退款申請,點擊查看詳情>> | 95-XX買家購買的XX 商品已退貨,請注意處理
            [self pushOrderDetailCenterWithPushCode:200];
        } else if ([dataDic[@"type"] isEqualToString:@"98"] || [dataDic[@"type"] isEqualToString:@"94"] || [dataDic[@"type"] isEqualToString:@"93"] ){//98-您購買的xx賣家已發(fā)貨 | 94-您購買的XX商品,賣家已拒絕您的退貨/退款申請,點擊查看詳情>> | 93-您購買的XX商品,賣家已同意您的退貨/退款申請,點擊查看詳情>>
            [self pushOrderDetailCenterWithPushCode:201];
        } else if ([dataDic[@"type"] isEqualToString:@"96"] || [dataDic[@"type"] isEqualToString:@"92"] || [dataDic[@"type"] isEqualToString:@"91"]  ){ // 96-您出售的商品 XX已完成交易,小貝已將XX元存入您的錢包 | 92-您申請退貨的XX商品賣家已簽收,貨款XX元已退回至您的付款賬戶
    
            [self pushMoneyMineWithPushCode:0];
        } else if ([dataDic[@"alert"][@"body"] isEqualToString:@"您有一條新消息"]){
            [self pushMessageWithPushCode:0];
        }
    
        
        NSString *categoryIdentifier = response.notification.request.content.categoryIdentifier;
        NSLog(@"推送2--- %@",categoryIdentifier);
    
    //    if ([categoryIdentifier isEqualToString:@"message"]) {//識別需要被處理的拓展
    //        
    //        if ([response.actionIdentifier isEqualToString:@"回復(fù)"]) {//識別用戶點擊的是哪個 action
    //            
    //            //假設(shè)點擊了輸入內(nèi)容的 UNTextInputNotificationAction 把 response 強(qiáng)轉(zhuǎn)類型
    //            UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse*)response;
    //            //獲取輸入內(nèi)容
    //            NSString *userText = textResponse.userText;
    //            //發(fā)送 userText 給需要接收的方法
    //
    //        } else if ([response.actionIdentifier isEqualToString:@"清除"]){
    //            
    //        }
    //    }
    }
    
    /* iOS10 以后版本新增代理 前臺模式 可顯示通知提示內(nèi)容 */
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
        NSLog(@"iOS10 后新增代理 前臺可顯示通知提示內(nèi)容");
        // 顯示通知
        completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound);
    }

四、注意點

    1.iOS7以后配置文件 Xcode會自動生成泉唁,所以配置文件不需要6炝洹(前往 開發(fā)者中心 - Account - Certificates, Identifiers & Profiles - Provisioning Profiles - All 查看是否有多余的配置文件)

    2.推送出現(xiàn)問題原因有三種可能 ,

        1)證書不對   檢驗證書可以通過后臺是否可以跟蘋果服務(wù)器對接亭畜,若能對接說明證書正確扮休,若不能對接證書很大幾率出現(xiàn)問題

        2)deviceToken不對  檢驗deviceToken,可以打印出來拴鸵,如果在出現(xiàn)不卸載不重裝系統(tǒng)情況下玷坠,值不發(fā)生變化說明 deviceToken值正確N仙Α(注:APP應(yīng)用卸載會造成 deviceToken值發(fā)生變化 ,不會發(fā)生變化的是UUID)

        3)后臺錯誤 (接口不對應(yīng)八堡,服務(wù)器地址問題樟凄,.pem文件配置錯誤)

    3.遠(yuǎn)程推送 在前臺模式接收不到消息,只有退到后臺模式才會接受到消息兄渺,- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler  方法才會調(diào)用缝龄!

    4.申請用戶權(quán)限后,切記需要注冊遠(yuǎn)程通知 挂谍! 如果不注冊遠(yuǎn)程通知叔壤,獲取deviceToken的方法 didRegisterForRemoteNotificationsWithDeviceToken 不會調(diào)用,注冊代碼如下:

            [[UIApplication sharedApplication] registerForRemoteNotifications];

二口叙、個推 - 第三方

1.集成和Appdelegate代碼參考個推文檔中心說明炼绘!

個推文檔

2.注意點

    1)手動集成導(dǎo)入包的時候,注意文字 :“**將GtSdkLib目錄拷貝到項目工程目錄下庐扫,導(dǎo)入GtSdkLib文件夾:**”  饭望!跟百度API一樣,需要先把SDK拖到項目本地工程中形庭,在 addfile到項目中铅辞!

    1)注意 TARGET 里面的 Linked Frameworks and libraries 里面的庫!切記不能出現(xiàn) GTExtensionSDK.framework 萨醒,一旦出現(xiàn)就會出現(xiàn)77個重復(fù)報錯問題斟珊!嚴(yán)格遵守下列圖片中的各類庫添加!
EB7D0F34-9751-4E51-9AD7-388A361850B0.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末富纸,一起剝皮案震驚了整個濱河市囤踩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晓褪,老刑警劉巖堵漱,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涣仿,居然都是意外死亡勤庐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門好港,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愉镰,“玉大人,你說我怎么就攤上這事钧汹≌商剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵拔莱,是天一觀的道長碗降。 經(jīng)常有香客問我隘竭,道長备恤,這世上最難降的妖魔是什么集侯? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任叠纷,我火速辦了婚禮条舔,結(jié)果婚禮上飞崖,老公的妹妹穿的比我還像新娘徙瓶。我一直安慰自己山宾,他們只是感情好拢蛋,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布笔咽。 她就那樣靜靜地躺著搔预,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叶组。 梳的紋絲不亂的頭發(fā)上拯田,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音甩十,去河邊找鬼船庇。 笑死,一個胖子當(dāng)著我的面吹牛侣监,可吹牛的內(nèi)容都是我干的鸭轮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼橄霉,長吁一口氣:“原來是場噩夢啊……” “哼窃爷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姓蜂,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤按厘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钱慢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逮京,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年束莫,在試婚紗的時候發(fā)現(xiàn)自己被綠了造虏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡麦箍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陶珠,到底是詐尸還是另有隱情挟裂,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布揍诽,位于F島的核電站诀蓉,受9級特大地震影響栗竖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渠啤,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一狐肢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沥曹,春花似錦份名、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壶栋,卻和暖如春辰如,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贵试。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工琉兜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毙玻。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓豌蟋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淆珊。 傳聞我的和親對象是個殘疾皇子夺饲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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