iOS遠(yuǎn)程推送和推送處理

APNS(Apple Push Notification Service)是蘋果公司提供的消息推送服務(wù)。其原理就是,第三方應(yīng)用將要推送給用戶的信息推送到蘋果服務(wù)器揍障,蘋果服務(wù)器再通過統(tǒng)一的系統(tǒng)接口將這些信息推送到用戶的手機(jī)上。如果對此不舍了解的朋友可以參見這篇文章:一步一步教你做ios 推送

本文著重叫在App端如何處理推送信息。主要涉及一下幾個比較重要的函數(shù)品腹,而這些函數(shù)都是AppDelegate類中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

?做過iOS 開發(fā)的人對這個函數(shù)都會很熟悉,這是在程序結(jié)束啟動红碑,并即將運(yùn)行時調(diào)用的舞吭,通常一些?初始化的工作可以在這個函數(shù)中處理。同樣的析珊,推送的相關(guān)初始化操作也需要在這個部分完成羡鸥。這一部分的工作主要分為兩部分: 推送類型的注冊:
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationAlert];
這行代碼告訴了系統(tǒng),該程序注冊的推送消息類型忠寻,通常包括badge惧浴、聲音以及alert通知。 處理程序沒有啟動時的推送消息: 如果是程序正在運(yùn)行或者說程序正在后臺奕剃,那么這個時候處理推送消息的工作都是在:
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
或者:
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

中完成衷旅。但是如果用戶點(diǎn)擊推送通知的時候程序還沒有被啟動捐腿,這個時候以上兩個函數(shù)都是接收不到用戶的推送通知的,這個時候需要在
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
函數(shù)里面進(jìn)行處理柿顶。而推送消息的相關(guān)信息就存儲在launchOptions這個字典里茄袖。具體參照如下代碼:

 NSDictionary* pushInfo = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
    if (pushInfo)
    {
        NSDictionary *apsInfo = [pushInfo objectForKey:@"aps"];
        if(apsInfo)
        {
            //your code here
        }
    }

- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
- (void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error

為了讓device端可以接收到推送消息,需要將設(shè)備的token傳送到蘋果的服務(wù)器九串,這個token就相當(dāng)于設(shè)備的識別碼绞佩,每一臺蘋果設(shè)備都有唯一的token,蘋果的服務(wù)器就是通過這個token找到對應(yīng)的設(shè)備猪钮,并傳送相應(yīng)地消息品山。這兩個函數(shù)就是在傳送token成功或者失敗后調(diào)用的,用戶在對應(yīng)的函數(shù)里面做一些相應(yīng)地處理烤低。


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

都是程序在運(yùn)行過程中(無論當(dāng)前程序處于前臺還是后臺)接收到推送消息的處理函數(shù)肘交。根據(jù)蘋果的官方文檔,建議大家使用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
另外就是-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^ )(UIBackgroundFetchResult))completionHandler
還有一個作用扑馁。根據(jù)蘋果給出的文檔涯呻,系統(tǒng)給出30s的時間對推送的消息進(jìn)行處理,此后就會運(yùn)行CompletionHandler程序塊腻要。

在處理這類推送消息(即程序被啟動后接收到推送消息)的時候复罐,通常會遇到這樣的問題,就是當(dāng)前的推送消息是當(dāng)前程序正在前臺運(yùn)行時接收到的還是說是程序在后臺運(yùn)行雄家,用戶點(diǎn)擊系統(tǒng)消息通知欄對應(yīng)項進(jìn)入程序時而接收到的效诅?這個其實(shí)很簡單,用下面的代碼就可以解決:

void application:(UIApplication*)application didReceiveRemoteNotification:NSDictionary)userInfo fetchCompletionHandler:((^)UIBackgroundFetchResult)completionHandler{
  if (application.applicationState == UIApplicationStateActive) {
        NSLog(@"執(zhí)行前臺對應(yīng)的操作");
    } else if (application.applicationState == UIApplicationStateInactive) {
        // 后臺進(jìn)入前臺
        NSLog(@"執(zhí)行后臺進(jìn)入前臺對應(yīng)的操作");
     
    } 
####其他代碼
}

關(guān)于userInfo的結(jié)構(gòu)趟济,參照蘋果的官方結(jié)構(gòu):

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
    "acme1" : "bar",
    "acme2" : 42
}

即key aps對應(yīng)了有一個字典乱投,里面是該次推送消息的具體信息。具體跟我們注冊的推送類型有關(guān)顷编。另外剩下的一些key就是用戶自定義的了戚炫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市媳纬,隨后出現(xiàn)的幾起案子双肤,更是在濱河造成了極大的恐慌,老刑警劉巖钮惠,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茅糜,死亡現(xiàn)場離奇詭異,居然都是意外死亡萌腿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門抖苦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毁菱,“玉大人米死,你說我怎么就攤上這事≈樱” “怎么了峦筒?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窗慎。 經(jīng)常有香客問我物喷,道長,這世上最難降的妖魔是什么遮斥? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任峦失,我火速辦了婚禮,結(jié)果婚禮上术吗,老公的妹妹穿的比我還像新娘尉辑。我一直安慰自己,他們只是感情好较屿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布隧魄。 她就那樣靜靜地躺著,像睡著了一般隘蝎。 火紅的嫁衣襯著肌膚如雪购啄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天嘱么,我揣著相機(jī)與錄音狮含,去河邊找鬼。 笑死拱撵,一個胖子當(dāng)著我的面吹牛辉川,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拴测,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼乓旗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了集索?” 一聲冷哼從身側(cè)響起屿愚,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎务荆,沒想到半個月后妆距,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡函匕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年娱据,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盅惜。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡中剩,死狀恐怖忌穿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情结啼,我是刑警寧澤掠剑,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站郊愧,受9級特大地震影響朴译,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜属铁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一眠寿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧红选,春花似錦澜公、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝶防,卻和暖如春甚侣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背间学。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工殷费, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人低葫。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓详羡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘿悬。 傳聞我的和親對象是個殘疾皇子实柠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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