iOS開發(fā)-發(fā)送和接收推送消息

今天就談論ios開發(fā)中發(fā)送和推送消息的相關(guān)內(nèi)容,接受服務器發(fā)來的推送消息巩踏,首先要生成apple推送的證書奢讨,配置開發(fā)和上傳到app stroe的配置文件读拆,配置移動端項目接收消息的推送篮绰,利用parse rest api和swift發(fā)送推送消息祝懂,最后響應消息推送的交互枫匾。

首先要創(chuàng)建推送證書

創(chuàng)建推送證書部分,需要在apple developer中注冊app id男娄,創(chuàng)建apple push notification service證書震蒋,配置應用程序的app service瞬场,注冊用于調(diào)試的iOS 設備乾巧。

由于推送功能只能運行在真機上句喜,所以需要一個有效的數(shù)字簽名證書。在https://developer.apple.com的頁面中生成這個證書沟于,它需要apple developer身份咳胃,這個身份是需要購買的。

接著要想生成一個推送證書旷太,換需要在自己的mac電腦上生成一個證書簽名請求拙绊。

創(chuàng)建一個cer.png

注意點:在那臺電腦上生成了證書簽名請求(csr文件),那這臺電腦就具備了開發(fā)資格泳秀。只能在這臺電腦上進行真機調(diào)試并上傳到app store上面。

推送證書創(chuàng)建需要一個app id榄攀,所以就在apple developer中注冊一個apple ID:
以圖為例

創(chuàng)建app ID1.png
創(chuàng)建appid2.png

接下來就是創(chuàng)建推送證書:
仍然用圖說明:


創(chuàng)建推送證書1.png
創(chuàng)建推送證書2.png
創(chuàng)建推送證書3.png
創(chuàng)建推送證書4.png

接著把創(chuàng)建好的證書下載下來嗜傅,打開下載好的推送證書。則此時證書就添加到了鑰匙串中了檩赢,可以在我的證書中查看:

鑰匙串查看證書.png

接下來需要導出這個證書吕嘀,一邊在parse云端使用它:

導出證書.png

接下來就是創(chuàng)建真機調(diào)試允許的手機設備

仍然以圖說明(附上入口,按照要求填寫)

注冊真機調(diào)試設備.png

配置app推送開發(fā)的配置文件

配置文件1.png
配置文件2.png
配置文件3.png

接下來可以在自己的cxode中配置創(chuàng)建的證書和文件了

匹配證書和文件.png

接下來用parse來仿照服務器做推送或者百度云推送贞瞒,把p12證書給到服務器偶房。parse官方網(wǎng)址:https://parse.com。 這個demo是按照pase云端進行的推送军浆,換可以用百度云推送或者蘋果自帶的推送服務

配置移動端接收消息的推送

首先應該配置移動應用程序支持推送的功能

定義一個常量判斷用戶應該接受什么樣的消息,注冊接受遠程消息的推送服務

let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()

注冊成功之后會調(diào)用棕洋,系統(tǒng)會自動調(diào)用didRegisterForRemoteNotificationsWithDeviceToken代理方法,通過這個方法的通知令牌為設備生成一個遠程消息的通知服務乒融。如果注冊失敗掰盘,則調(diào)用didFailToRegisterForRemoteNotificationsWithError代理方法。

核心代碼如下

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        let installation = PFInstallation.currentInstallation()
        installation.setDeviceTokenFromData(deviceToken)//令牌存儲到parse云端
        installation.saveInBackgroundWithBlock { (success:Bool, error:NSError?) -> Void in
            print("Registeration successful? \(success)")
            
            if error != nil {
                print("Failed to register \(error?.localizedDescription)")
            }
        }
    }
 /*
     當app收到遠程推送的消息會調(diào)用這個代理方法赞季,
     第一個參數(shù)愧捕,標示的是application對象
     第二個參數(shù),包含遠程消息的信息申钩,顯示的icon 聲音次绘,內(nèi)容,通知標示,自定義數(shù)據(jù)等
     第三個參數(shù)邮偎,完成之后調(diào)用的閉包
 */
    
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
        PFPush.handlePush(userInfo)//app處理消息的方式
        completionHandler(UIBackgroundFetchResult.NewData)//執(zhí)行閉包函數(shù)
    }

換需要設置一下應用程序的配置管跺,支持推送

app配置.png

接下來就可以在parse云端發(fā)送消息了,到此就可以利用parse發(fā)送簡單的推送消息了钢猛。

截下來可以利用parse通道發(fā)送推送伙菜,也可以在應用程序中手動推送消息。那怎樣在應用程序中發(fā)送推送

如何將消息手動推送到用戶訂閱的指定通道命迈,即通過通道來發(fā)送到用戶的手機上贩绕。

思路:設置parse云端推送消息的通道和本地發(fā)送推送消息的通道相同

實現(xiàn)一個demo:當點擊界面的button按鈕時,推送一個消息

//在注冊推送成功之后的代理里方法中設置用戶的通道壶愤,即標示parse 云通道淑倾。

 installation.addUniqueObject("Swift", forKey: "channels")

點擊button時的操作:

@IBAction func sendButtonTapped(sender: AnyObject) {
        if messageTextField.text!.isEmpty {
            return
        }
        
        let data = ["alert": messageTextField.text!, "badge": "Increment"]
        let channels = ["Swift"]
        
        let push = PFPush()
        push.setData(data)
        push.setChannels(channels)//設置他的通道與云端相同

        
        push.sendPushInBackgroundWithBlock { (success:Bool, error:NSError?) -> Void in
            if success {
                print("消息發(fā)送成功!")
            }else {
                print(error?.localizedDescription)
            }
        }
    }

響應消息推送的交互征椒,即點擊推送消息后執(zhí)行的相關(guān)操作

通過一個點擊推送消息打開不同的視圖控制器為例進行說明娇哆,新增加2個視圖控制器:圖片視圖控制器和音頻控制視圖,當點擊的是圖片視圖的推送消息勃救,打開圖片視圖控制器碍讨,反之打開另一個

思路:根據(jù)云端(服務端)發(fā)送的json格式來判斷,讓其格式和客戶端溝通好蒙秒,發(fā)送一個約定好的json格式勃黍,根據(jù)返回的格式進行處理

這里就是返回一個字典格式{“photoid”:”111”,”alert”:””}或者是{“ve di did”:”111”,”alert”:””},根據(jù)返回的是photoid晕讲,還是video ID進行不同的跳轉(zhuǎn)
核心代碼

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
        PFPush.handlePush(userInfo)
        
        if let photoId = userInfo["photoId"] as? NSString {
            print(photoId)
            
            let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
            
            let photoViewController = mainStoryboard.instantiateViewControllerWithIdentifier("PhotoViewController") as! PhotoViewController
            let viewControllerNav = UINavigationController(rootViewController: photoViewController)
            self.window?.rootViewController = viewControllerNav
        }else if let videoId = userInfo["videoId"] as? NSString {
            print(videoId)
            
            let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
            
            let videoViewController = mainStoryboard.instantiateViewControllerWithIdentifier("VideoViewController") as! VideoViewController
            let viewControllerNav = UINavigationController(rootViewController: videoViewController)
            self.window?.rootViewController = viewControllerNav
        }else {
            PFPush.handlePush(userInfo)
        }
        
        completionHandler(UIBackgroundFetchResult.NewData)
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末覆获,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瓢省,更是在濱河造成了極大的恐慌弄息,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勤婚,死亡現(xiàn)場離奇詭異摹量,居然都是意外死亡,警方通過查閱死者的電腦和手機蛔六,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來具钥,“玉大人掌动,你說我怎么就攤上這事【焐洌” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冗茸。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任堪侯,我火速辦了婚禮芽死,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己炭剪,他們只是感情好媒鼓,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布站玄。 她就那樣靜靜地躺著再登,像睡著了一般锉矢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天全跨,我揣著相機與錄音渺杉,去河邊找鬼碌上。 笑死蔓纠,一個胖子當著我的面吹牛辑畦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腿倚,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼纯出,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敷燎?” 一聲冷哼從身側(cè)響起暂筝,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硬贯,沒想到半個月后焕襟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡饭豹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年鸵赖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拄衰。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡它褪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翘悉,到底是詐尸還是另有隱情茫打,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布妖混,位于F島的核電站老赤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏制市。R本人自食惡果不足惜诗越,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望息堂。 院中可真熱鬧,春花似錦块促、人聲如沸荣堰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽振坚。三九已至,卻和暖如春斋扰,著一層夾襖步出監(jiān)牢的瞬間渡八,已是汗流浹背啃洋。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屎鳍,地道東北人宏娄。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像逮壁,于是被迫代替她去往敵國和親孵坚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理窥淆,服務發(fā)現(xiàn)卖宠,斷路器,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • 作者:Gabriel Theodoropoulos忧饭,原文鏈接扛伍,原文日期:2016-01-27譯者:bestswif...
    梁杰_numbbbbb閱讀 1,267評論 1 14
  • 前言:現(xiàn)在第三方推送也很多 ,比如極光词裤,融云刺洒,信鴿,其原理也是相同利用APNS推送機制 亚斋,前段公司讓做自己的推送作媚,...
    _方丈閱讀 21,383評論 15 133
  • “推送通知?喔帅刊,不纸泡!”。是的赖瞒,這就是我被叫去實現(xiàn)一個 iOS 應用中的推送通知功能時女揭,腦海中閃過的第一念頭栏饮,而且我...
    王小賓閱讀 2,761評論 0 2
  • 塞了張51單片機教學光盤進去結(jié)果光驅(qū)提醒我要放一張光盤 塞別的盤進去吧兔,六級資料,成功讀取了 網(wǎng)球教學那張 設備管理...
    亢龍有悔閱讀 162評論 0 0