xcode8簡單集成極光推送

寫在前面

1.推送技術(shù)產(chǎn)生的場景

  • 服務(wù)器端主動性: 客戶端與服務(wù)器交互都是客戶端主動的, 服務(wù)器一般不能主動與客戶端進行數(shù)據(jù)交互, 因為服務(wù)器端無法得知客戶端的 IP 地址 及 狀態(tài);
  • 數(shù)據(jù)實時性: 如果服務(wù)器端有緊急數(shù)據(jù)要傳遞給客戶端, 就必須主動向客戶端發(fā)送數(shù)據(jù);
  • 基本原理: 使客戶端實時獲取服務(wù)器端消息, Pull 方式, 小周期輪詢, 費電費流量; 另一個就是 Push 方式, 服務(wù)器端向客戶端主動推送數(shù)據(jù), 可以省電省流量喘落。
    2.極光推送的原理
  • .net應(yīng)用程序把要發(fā)送的消息、目的iPhone的標(biāo)識打包,發(fā)給APNS颗味。
  • APNS在自身的已注冊Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識的iPhone,并把消息發(fā)到iPhone。
  • iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序问芬, 并且按照設(shè)定彈出Push通知。

項目實現(xiàn)

1.關(guān)于環(huán)境的配置·證書申請寿桨,這個視頻里都有此衅,我相信比我寫出來的好,不懂的可以直接的看這個視頻,在這里就不贅述炕柔。視頻地址如下。
https://community.jiguang.cn/t/topic/6568
2.可能遇到的坑
根據(jù)上面的視頻配置好之后媒佣,可能遇到的坑匕累,下面是我自己配置之后,沒法實現(xiàn)的原因默伍,僅供參考欢嘿。
配置好之后,下面圖片的設(shè)置也糊,如果是這樣就ok了

WechatIMG48.jpeg
WechatIMG49.jpeg
WechatIMG50.jpeg
WechatIMG52.jpeg

只要上面的配置是這樣的狀態(tài)了炼蹦,就可以添加代碼實現(xiàn)推送的功能了

代碼實現(xiàn)

  • 需要導(dǎo)入的頭文件和代理
#import "JPUSHService.h"
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h> // 這里是iOS10需要用到的框架
#endif
@interface AppDelegate ()<JPUSHRegisterDelegate>//新版的需要實現(xiàn)這個代理方法
  • 用到的變量
static NSString *const JPUSHAPPKEY  = @"極光appkey";//極光appkey
static NSString *const channel = @"Publish channel";//固定的
  • 注冊及實現(xiàn)推送的全部代碼
    1.注冊極光推送
 //注冊apns通知
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0)//ios大于10.0
    {
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
        JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
        entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge | UNAuthorizationOptionSound;
        [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
#endif
    }
    else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) // iOS8, iOS9
    {
        //可以添加自定義categories
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
    }
    else // iOS7
    {
        //categories 必須為nil
        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert) categories:nil];
    }
    
    //注冊極光推送
    
    [JPUSHService setupWithOption:launchOptions appKey:JPUSHAPPKEY
                          channel:channel
                 apsForProduction:false
            advertisingIdentifier:nil];
    
    [application setApplicationIconBadgeNumber:0];

2.推送的實現(xiàn)

/**
 JPush
 */
#pragma mark - 注冊推送回調(diào)獲取 DeviceToken
#pragma mark -- 成功并上報DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 注冊成功
    // 極光: Required - 注冊 DeviceToken
    [JPUSHService registerDeviceToken:deviceToken];
}
#pragma mark -- 實現(xiàn)注冊APNs失敗接口
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    // 注冊失敗
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
#pragma mark - iOS10: 收到推送消息調(diào)用(iOS10是通過Delegate實現(xiàn)的回調(diào))
#pragma mark- JPUSHRegisterDelegate
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
// 當(dāng)程序在前臺時, 收到推送彈出的通知
// 當(dāng)程序在前臺時, 收到推送彈出的通知
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
    
    NSDictionary * userInfo = notification.request.content.userInfo;
    
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
    {
        [JPUSHService handleRemoteNotification:userInfo];
        NSString *message = [NSString stringWithFormat:@"will%@", [userInfo[@"aps"] objectForKey:@"alert"]];
        NSLog(@"iOS10程序在前臺時收到的推送: %@", message);
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil, nil];
        [alert show];
    }
    
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要執(zhí)行這個方法,選擇是否提醒用戶狸剃,有Badge掐隐、Sound、Alert三種類型可以設(shè)置
    
    
    
}


#pragma mark- JPUSHRegisterDelegate
// 程序關(guān)閉后, 通過點擊推送彈出的通知
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
    {
        [JPUSHService handleRemoteNotification:userInfo];
        
       // 這個是程序打開之后會有一個彈框的提示
                NSString *message = [NSString stringWithFormat:@"did%@", [userInfo[@"aps"] objectForKey:@"alert"]];
                NSLog(@"iOS10程序關(guān)閉后通過點擊推送進入程序彈出的通知: %@", message);
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil,nil];
                [alert show];
    }
    
    completionHandler();  // 系統(tǒng)要求執(zhí)行這個方法
}
#endif

結(jié)語

  • 上面的關(guān)于環(huán)境的配置之類的還請看視頻和官方的文檔钞馁,文檔里面的都很詳細
  • 我這里做的效果是推送的條數(shù)的角標(biāo)是1虑省,當(dāng)打開app的時候,這個角標(biāo)就會消失僧凰,如果角標(biāo)想和具體的推送的條數(shù)一樣探颈,還需要后臺的配合
  • 這里做的就是全部的推送,沒有標(biāo)簽训措,后續(xù)會更新伪节,針對不同用戶的推送。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绩鸣,一起剝皮案震驚了整個濱河市怀大,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呀闻,老刑警劉巖叉寂,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異总珠,居然都是意外死亡屏鳍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門局服,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钓瞭,“玉大人,你說我怎么就攤上這事淫奔∩轿校” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸭丛。 經(jīng)常有香客問我竞穷,道長,這世上最難降的妖魔是什么鳞溉? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任瘾带,我火速辦了婚禮,結(jié)果婚禮上熟菲,老公的妹妹穿的比我還像新娘看政。我一直安慰自己,他們只是感情好抄罕,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布允蚣。 她就那樣靜靜地躺著,像睡著了一般呆贿。 火紅的嫁衣襯著肌膚如雪嚷兔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天做入,我揣著相機與錄音谴垫,去河邊找鬼。 笑死母蛛,一個胖子當(dāng)著我的面吹牛翩剪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彩郊,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼前弯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秫逝?” 一聲冷哼從身側(cè)響起恕出,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎违帆,沒想到半個月后浙巫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡刷后,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年的畴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尝胆。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡丧裁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出含衔,到底是詐尸還是另有隱情煎娇,我是刑警寧澤二庵,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站缓呛,受9級特大地震影響催享,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哟绊,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一因妙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匿情,春花似錦兰迫、人聲如沸信殊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涡拘。三九已至玲躯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳄乏,已是汗流浹背跷车。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留橱野,地道東北人朽缴。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像水援,于是被迫代替她去往敵國和親密强。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 不同版本極光推送SDK集成各有差異蜗元,集成時一定要注意版本號或渤,樓主已將博文更新成最新的SDK JPush v3.0....
    i順頌時宜閱讀 7,853評論 37 170
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)奕扣,斷路器薪鹦,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 首先用cocoapods導(dǎo)入 pod 'JPush' 然后在AppDelegate引用 // 引入JPush功能所...
    MoneyLee閱讀 2,060評論 0 1
  • @(〓〓 iOS-實用技術(shù))[遠程/本地推送] 作者: Liwx 郵箱: 1032282633@qq.com 目...
    Liwx閱讀 5,105評論 8 67
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐惯豆,SD...
    Isspace閱讀 6,711評論 10 16