基于客戶端APNs項目實踐

背景:最近連續幾周被項目中的APNS實現所折騰,服務器和客戶端都存在坑,服務器升級導致一堆bug,修復完后客戶端這邊收到消息通知但是不符合業務邏輯,在項目經理再三溝通和協調的下,在服務器和客戶端同事們的全力排查代碼邏輯終于完成此功能點。

一、實現原理:

蘋果推送的實現原理就是有一個觸發者(服務器)觸發用戶關聯信息,通過APNs精確傳遞到用戶的設備上,具體以消息推送的形式呈現出來。

實現原理示意圖

二、項目實踐

1、客戶端項目配置

在項目對應target欄目中capabilities的Push Notifications打開。

在項目對應target欄目中General Signing(release)選擇你要發布的證書

2、 客戶端代碼

在AppDelegate.m文件中需要做如下配置

2.1注冊遠程推送

這里需要兼容iOS10、iOS8、iOS8以下系統注冊遠程推送

-(void)registerForRemoteNotification

{

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {

#ifdef __IPHONE_10_0

//進行用戶權限的申請

[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge|UNAuthorizationOptionSound|UNAuthorizationOptionAlert|UNAuthorizationOptionCarPlay completionHandler:^(BOOL granted, NSError * _Nullable error) {

//在block中會傳入布爾值granted,表示用戶是否同意

if (granted) {

//如果用戶權限申請成功,設置通知中心的代理

[UNUserNotificationCenter currentNotificationCenter].delegate = self;

}

}];

#endif

}

UIApplication *application = [UIApplication sharedApplication];

if([application respondsToSelector:@selector(registerUserNotificationSettings:)]){

UIUserNotificationType notificationTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil];

[application registerUserNotificationSettings:settings];

}

#if !TARGET_IPHONE_SIMULATOR

//ios8 注冊APNS

if ([application respondsToSelector:@selector(registerForRemoteNotifications)]){

[application registerForRemoteNotifications];

}else{//ios8以下

UIRemoteNotificationType notificationTypes = UIRemoteNotificationTypeBadge |

UIRemoteNotificationTypeSound |

UIRemoteNotificationTypeAlert;

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:notificationTypes];

}

#endif

}

2.2注冊遠程推送返回代理

注冊遠程推送成功

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

將注冊成功的deviceToken 注冊到推送服務器中,可以獲取到一個唯一的標志碼

注冊遠程推送失敗

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

將error 傳給相關模塊執行再次申請注冊遠程推送

2.3獲取到遠程推送的幾個場景

需要兼容IOS 7以及IOS7以上系統

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

#ifdef __IPHONE_7_0

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler

?其中userInfo是由推送服務器發的內容

aps =? ? {

alert = "sdhsflsflsaksakaskgkasglkasdjglkadsglknasdgdksal";//推送內容

badge = 3;//應用右上角數字

sound = "msg.mp3";//推送的聲音

};

//一下是服務器自定義的json數據格式

}

/*__IOS_AVAILABLE(10.0)? 必須使用xcode8

App在前臺的時候收到推送執行的回調方法*/

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler

/*__IOS_AVAILABLE(10.0)? 必須使用xcode8

App在后臺的時候,點擊推送信息,進入App后執行的 回調方法*/

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler

業務邏輯就是將收到的遠程推送的內容(自定義字段表示內容)展現在該app中。

三、總結

所謂總結就是分享我自己從這個坑里爬出來的感受

我所負責的app有兩個推送模式,遠程推送和本地IM推送,我負責遠程推送,他負責本地IM消息管理,其實推送devicetoken已經在IM那邊已經注冊了,但是我還重復注冊了一次,因為我之前的項目沒有集成IM,所以就順理成章按照之前的做法做了,得到的結果就是我可以收到遠程推送,就是我同事負責的消息管理模塊沒有任何關于我遠程推送的消息記錄,后來經過調試發現遠程推送和本地推送的標識碼不一樣,解決方法是以IM注冊為主,遠程推送和本地消息管理共用一個標識碼進行業務上操作。

其實這個問題本身不是一個很大的問題,關鍵在于開發人員雙方溝通不夠順暢,當時項目經理開了一個電話會議后將所涉及的開發人員召集在一起全力解決。

代碼實現結果其實是團隊溝通成效的體現。

參考文獻

1.《APNs Overview》https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1

2.《Maintaining Your Signing Identities and Certificates》https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html

3.《Payload Key Reference》https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html#//apple_ref/doc/uid/TP40008194-CH17-SW1

4.《手把手教你配置蘋果APNS推送服務》https://my.oschina.net/hejunbinlan/blog/494721

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容

  • 不同版本極光推送SDK集成各有差異,集成時一定要注意版本號,樓主已將博文更新成最新的SDK JPush v3.0....
    i順頌時宜閱讀 7,887評論 37 170
  • 推送通知 注意:這里說的推送通知跟NSNotification有所區別 NSNotification是抽象的,不可...
    iOS開發攻城獅閱讀 4,278評論 1 13
  • 極光推送: 1.JPush當前版本是1.8.2,其SDK的開發除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,759評論 10 16
  • 許多集成的步驟個推官網都有了,這里只寫關于推送的遠程推送和本地通知的步驟和代碼。APP在后臺時:走蘋果的APNS通...
    AllureJM閱讀 2,739評論 1 9
  • 說到遠程推基本上任何一個app都會用到,下面就說一下關于iOS遠程推送的一些需要做的事情. 1.配置證書. (1)...
    LoserJay閱讀 420評論 0 0