一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - 輕松搞定iOS遠程消息推送

輕松搞定iOS遠程消息推送

2021-01-28 16:22琿少 IOS

這篇文章主要幫助大家輕松搞定iOS遠程消息推送,討論遠程推送的流程與配置過程,感興趣的小伙伴們可以參考一下

一、引言
ios中消息的推送有兩種方式,分別是本地推送和遠程推送,本地推送在這篇博客中有詳細的介紹 http://www.ythuaji.com.cn/article/136226.html,這里主要討論遠程推送的流程與配置過程。

二、遠程推送機制的原理

1、從一張很火的圖說起
搜索ios遠程推送,你總能看到一張如下的流程示意圖,因為這張圖確實很火,所以我也將它引用在此:

輕松搞定iOS遠程消息推送

這張圖示意的很清晰,大致意思是這樣:你的應用服務端將消息發送到apple的apns服務器,apns服務器將消息推送到指定的iphone,最后由iphone負責將消息推送至你的app。在此先不說這個過程是如何實現的,僅僅看這個流程,你可能會覺得,在你們服務端和客戶端之間增加了一個apple的apns,不是增加開發者的負擔么?其實結果恰恰相反,因為apple對推送的統一管理,使我們開發者的工作變得異常簡單。

2、服務端如何連接到客戶端的

如果你是做android開發的,你一定非常了解長鏈接與心跳包。事實上,大部分的android應用的推送也確實是通過長鏈接來實現的。因為android系統的開放性,app是很容易做到自啟動和后臺長鏈接的,而心跳驗證,就是始終保證長鏈接屬于接通狀態,然后由服務端直接推送消息。如果ios開發者也采用這種思路,就十分困難了,在ios中想要保持一個app服務始終不被系統殺死,我只能說太難了。通過上面的流程圖,對比android的推送思路,我們很容易明白,ios中其實也始終有一個長鏈接,那就是系統本身,這個長鏈接始終與apns服務器相連,然后統一管理所有應用程序的推送。

3、這是ios推送機制的優勢?

下面的這些,只是我個人的一些看法。系統并無優劣,優劣在于個人喜好。

1、因為推送的服務端是appleid的驗證用戶,推送可靠性會高。

2、所有推送消息由apns統一管理,效率高。

3、在客戶端只需系統維護一個長鏈接,節省了用戶流量消耗和手機的性能消耗,并且提高了安全性,使得有惡意推送和流氓軟件的幾率降低。

三、分分鐘讓你的app收到遠程推送

1、工欲善其事、必先利其器——創建推送證書
(1)請求csr文件

在mac應用程序中找到鑰匙串訪問,打開它。

點擊選項欄中的鑰匙串訪問中的證書助理:

輕松搞定iOS遠程消息推送

選擇從證書頒發機構申請證書:

輕松搞定iOS遠程消息推送

填寫電子郵件和名稱,選擇儲存到磁盤,然后繼續。

這時,我們存儲的地方有了這樣一個文件:certificatesigningrequest.certsigningrequest。

(2)導出密鑰文件

打開鑰匙串,會發現多了一對密鑰,名字就是上面你填寫的常用名稱。

我們選擇專用密鑰進行導出,然后設置一個我們自己的密碼:

輕松搞定iOS遠程消息推送

這時候我們又有了一個后綴名為.p12的文件。

(3)創建appid

到https://developer.apple.com的member center:

輕松搞定iOS遠程消息推送

用你付過費的開發者appleid登陸后,選擇certificates:

輕松搞定iOS遠程消息推送

輕松搞定iOS遠程消息推送

如果你的項目已經創建了app id,則可以不用重新創建,但是你創建的app id必須要支持遠程推送。如果還沒有創建,點擊加號,創建一個:

輕松搞定iOS遠程消息推送

之后的界面中app id有兩種類型:explicit和wildcard,分別是特殊的和通配的,我們需要推送功能,這個id不能是通配的,所以我們選擇第一個。

輕松搞定iOS遠程消息推送

這里需要填的的bundle id必須和我們app中的一致:

輕松搞定iOS遠程消息推送

在app id的服務設置中,將push notification勾選上,點擊continue。
分分鐘搞定ios遠程消息推送

之后點擊submit,最后點擊done。這時我們的app ids列表中會出現我們剛才創建的app id。

(4)創建證書

點擊我們剛才創建的app id,你會看到push notification一行為未設定的。我們點擊edit。

輕松搞定iOS遠程消息推送

在push notifications設置里是如下界面,development是開發證書,production是產品證書,我們現在需要測試,所以用development證書,上線時要使用production證書。點擊create certificate。

輕松搞定iOS遠程消息推送

接著點擊continue,如下界面會讓我們選擇一個csr文件,我們第一步創建的文件在這里派上用場了,選擇那個文件,點擊generate。

輕松搞定iOS遠程消息推送

將創建好的證書下載到電腦中:

輕松搞定iOS遠程消息推送

至此,我們已經有了三個文件了,分別是csr文件,.p12文件,.cer文件。要將這三個文件放在同一個目錄下。.cer文件分為測試和產品兩個,需要哪個自行選擇。寫了這么多,我們的準備工作可算是做完了,不要灰心,其實你的推送工作基本上也就做完了。只是申請過程麻煩了一些,但工程的代碼,我們幾乎不用怎么配置。

2、兵馬未動、糧草先行——服務端進行信息推送的設置

(1)處理證書

打開終端cd到我們上面得到的三個文件所在的目錄。

在終端執行如下命令:

$ openssl x509 -in aps_development.cer -inform der -out pushcert.pem

aps_development.cer是剛才生成的.cer文件的文件名。會在當前文件夾中生成一個pem文件,這是我們服務端對應的證書。

再執行如下命令:

$ openssl pkcs12 -nocerts -out pushkey.pem -in key.p12

key.p12是上面生成的.p12文件的文件名。這時終端會讓輸入密碼,這里的密碼就是上面我們設置的密鑰的密碼。輸入密碼后回車,如果密碼正確,會讓我們輸入新密碼(一定切記),輸入兩次后,終端會提示成功創建pushkey.pem文件。

最后一步,將我們生成的兩個pem文件和成為一個:

$ cat pushcert.pem pushkey.pem > ck.pem

(2)測試證書是否可用

在終端執行下面的命令:

$ telnet gateway.sandbox.push.apple.com 2195

等一小會,如果終端顯示下面的情形,則證書正常。

輕松搞定iOS遠程消息推送

然后執行如下命令:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert pushchatcert.pem -key pushkey.pem
輸入密碼后回車顯示如下的結果則連接成功:

輕松搞定iOS遠程消息推送

3、天涯海角、一步之遙——應用程序中的配置

在我們項目的appdelegate中添加如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
double version = [[uidevice currentdevice].systemversion doublevalue];//判定系統版本。
if(version>=8.0f){
 uiusernotificationsettings *settings = [uiusernotificationsettings settingsfortypes:(uiremotenotificationtypebadge|uiremotenotificationtypesound|uiremotenotificationtypealert) categories:nil];
 [[uiapplication sharedapplication] registerusernotificationsettings:settings];
 
 }else{
 uiremotenotificationtype mytypes = uiremotenotificationtypebadge | uiremotenotificationtypealert | uiremotenotificationtypesound;
 [[uiapplication sharedapplication] registerforremotenotificationtypes:mytypes];
 }
}
 
- (void)application:(uiapplication *)application didreceiveremotenotification:(nsdictionary *)userinfo{ // 處理推送消息
 nslog(@"userinfo:%@",userinfo);
 nslog(@"收到推送消息:%@",[[userinfo objectforkey:@"aps"] objectforkey:@"alert"]);
}
- (void)application:(uiapplication *)application didfailtoregisterforremotenotificationswitherror:(nserror *) error {
 nslog(@"registfail%@",error);
}
-(void)application:(uiapplication *)application didregisterforremotenotificationswithdevicetoken:(nsdata *)devicetoken{
 nslog(@"%@",devicetoken);//這里的token就是我們設備要告訴服務端的token碼
}

下面是網上搜的php服務端的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
//這里填寫設備的token碼
$devicetoken = '74314cc9e8f747e2fa96c2c1585c830cdf994de6b453ce9fa1c09ba396b2f9e9';
//這里是密鑰密碼
$passphrase = 'abcabc';
//推送的消息
$message = '這是一條推送消息';
 
////////////////////////////////////////////////////////////////////////////////
 
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');//ck文件
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
 
// open a connection to the apns server
$fp = stream_socket_client(
 'ssl://gateway.sandbox.push.apple.com:2195', $err,
 $errstr, 60, stream_client_connect|stream_client_persistent, $ctx);
 
if (!$fp)
 exit("failed to connect: $err $errstr" . php_eol);
 
echo 'connected to apns' . php_eol;
 
// create the payload body
$body['aps'] = array(
 'alert' => $message,
 'sound' => 'default'
 );
 
// encode the payload as json
$payload = json_encode($body);
 
// build the binary notification
$msg = chr(0) . pack('n', 32) . pack('h*', $devicetoken) . pack('n', strlen($payload)) . $payload;
 
// send it to the server
$result = fwrite($fp, $msg, strlen($msg));
 
if (!$result)
 echo 'message not delivered' . php_eol;
else
 echo 'message successfully delivered' . php_eol;
 
// close the connection to the server
fclose($fp);
 
?>

把上面的php文件和我們的ck文件放在同一目錄下。在終端的當前目錄下,執行如下命令:

$php push.php

如果我們的設備王略正常,就可收到推送的消息了:

 輕松搞定iOS遠程消息推送

四、幾點注意

1、如果終端發送信息時提示密鑰不可訪問之類的錯誤,請檢查是否cd到了當前目錄,如果還存在問題,將密鑰部分從新生成一次。

2、注意php代碼中的字符為英文字符。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://my.oschina.net/u/2340880/blog/413584

延伸 · 閱讀

精彩推薦
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
主站蜘蛛池模板: 国内自拍网红在线自拍综合 | 亚洲精品国产国语 | 暖暖视频免费观看视频中国.韩剧 | 3p文两男一女办公室高h | 免费观看无人区完整版 | 2018成年动漫在线观看 | 亚洲福利 影院 | 国产欧美日韩成人 | 四虎影视4hutv最新地址在线 | 天天干天天爽天天操 | 99久久国产亚洲综合精品 | 国产精品亚洲片在线va | 国产在线视频一区二区三区 | 人人揉揉香蕉 | 毛片区| 国产成人一区二区三区视频免费蜜 | 亚洲a在线视频 | 大陆黄色片 | 国产欧美又粗又猛又爽老 | 无人影院在线播放 | 韩国三级在线播放 | 国产成人a v在线影院 | 4hu影院永久在线播放 | 亚洲视频在线看 | 国产五月天在线 | 国产精品视频第一区二区 | 亚洲国产经典 | 无码中文字幕av免费放 | 天美网站传媒入口网址 | 亚洲嫩模吧粉嫩粉嫩冒白浆 | a色在线 | 男同桌脱我奶罩吸我奶作文 | 亚洲欧美日韩国产精品影院 | 亚洲天堂99 | 啪啪国产视频 | 美女福利视频网站 | 九九久久国产精品免费热6 九九精品视频一区二区三区 | 国产在线看片护士免费视频 | 精品国产在线观看 | a级影视| 日韩国产欧美精品综合二区 |