有誰做了php主動推送的,php實時推送技術

本文目錄一覽:

ios推送消息 用php推送怎麼實現

iOS消息推送的工作機制可以簡單的用下圖來概括:

Provider是指某個iPhone軟件的Push服務器,APNS是Apple Push Notification Service的縮寫,是蘋果的服務器。

上圖可以分為三個階段:

第一階段:應用程序把要發送的消息、目的iPhone的標識打包,發給APNS。

第二階段:APNS在自身的已註冊Push服務的iPhone列表中,查找有相應標識的iPhone,並把消息發送到iPhone。

第三階段:iPhone把發來的消息傳遞給相應的應用程序,並且按照設定彈出Push通知。

1、應用程序註冊消息推送。

2、iOS從APNS Server獲取device token,應用程序接收device token。

3、應用程序將device token發送給PUSH服務端程序。

4、服務端程序向APNS服務發送消息。

5、APNS服務將消息發送給iPhone應用程序。

無論是iPhone客戶端和APNS,還是Provider和APNS,都需要通過證書進行連接。

下面我介紹一下幾種用到的證書。

一、CSR文件

1、生成Certificate Signing Request(CSR)

2、填寫你的郵箱和常用名稱,並選擇保存到硬盤。

點擊繼續:

這樣就在本地生成了一個Push.certSigningRequest文件。

二、p12文件

1、導出密鑰。

2、輸入你的密碼。

這樣就生成了一個Push.p12文件。

三、SSL certificate文件

1、用你付過費的帳號登錄到iOS Provisioning Portal,並新建一個App ID,這個過程可以參考:iOS應用的真機調試,這樣就會生成下面這條記錄:

2、點擊右側的Configure:

3、點擊Development Push SSL Certificate一行後的Configure:

4、點擊Continue:

5、選擇前面生成好的Push.certSigningRequest文件,點擊Generate,出現如下所示的頁面:

6、點擊Continue:

7、點擊Download,並將文件命名為aps_developer_identity.cer。

8、點擊Done,你會發現狀態變成了Enabled:

到現在為止,我們已經生成了三個文件:

1、Push.certSigningRequest

2、Push.p12

3、aps_developer_identity.cer

雙擊aps_developer_dientity.cer 註冊到你的鑰匙串中,這樣你的鑰匙串中就會有

二、準備profile證書,因為推送消息只能再真機上測試,所以要建一個profile證書

點擊”new profile”為上面新建的APP ID建個profile ,成功之後下載*_Dev_Profile.mobileprovision

雙擊將其加入到xcode 的Provisioning Profiles 中,這裡有一點要注意,再將這個加入xcode之前如果之前已經加入過一定要把之前加入的刪掉,如果有多個的話會出錯。

三、工程代碼

到這裡證書已經準備完畢,接下來,我們在xcode中新建一個測試工程,注意設置工程的Bundle Identifier必須與上面建的APP ID 里的相同

在didFinishLaunchingWithOptions 中加入一下代碼

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

{

[self.window makeKeyAndVisible];

[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];

return YES;

}

– (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {

NSLog(@”regisger success:%@”, pToken);

//註冊成功,將deviceToken保存到應用服務器數據庫中

}

– (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

// 處理推送消息

UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@”通知” message:@”我的信息” delegate:selfcancelButtonTitle:@”取消” otherButtonTitles:nil, nil];

;

;

NSLog(@”%@”, userInfo);

}

– (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {

NSLog(@”Regist fail%@”,error);

}

到這裡一切順利的話我們就可以在真機運行了,註冊成功我們會得到iphone 的deviceToken,

My token is:

四、在應用服務器採用php的方式將消息推送給APNS,

1、php連接APNS也是需要證書的,還記得我們上面獲得的幾個證書嗎?打開終端,對上面的證書做如下處理,

cd 進入證書所在目錄

把.cer文件轉換成.pem文件:

$ openssl x509 -in aps_developer_identity.cer -inform der

-out PushChatCert.pem

把私鑰Push.p12文件轉換成.pem文件:

$ openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12

Enter Import Password:

MAC verified OK

Enter PEM pass phrase:

Verifying – Enter PEM pass phrase:

你首先需要為.p12文件輸入passphrase密碼短語,這樣OpenSSL可以讀它。然後你需要鍵入一個新的密碼短語來加密PEM文件。還是使用」pushchat」來作為PEM的密碼短語。你需要選擇一些更安全的密碼短語。

注意:如果你沒有鍵入一個PEM passphrase,OpenSSL將不會返回一個錯誤信息,但是產生的.pem文件裏面將不會含有私鑰。

最後。把私鑰和證書整合到一個.pem文件里:

$ cat PushChatCert.pem PushChatKey.pem ck.pem

為了測試證書是否工作,執行下面的命令:

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

Trying 17.172.232.226…

Connected to gateway.sandbox.push-apple.com.akadns.net.

Escape character is 『^]』.

它將嘗試發送一個規則的,不加密的連接到APNS服務。如果你看到上面的反饋,那說明你的MAC能夠到達APNS。按下Ctrl+C 關閉連接。如果得到一個錯誤信息,那麼你需要確保你的防火牆允許2195端口。

然後再次連接,這次用我們的SSL證書和私鑰來設置一個安全的連接:

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195

-cert PushChatCert.pem -key PushChatKey.pem

Enter pass phrase for PushChatKey.pem:

你會看到一個完整的輸出,讓你明白OpenSSL在後台做什麼。如果連接是成功的,你可以鍵入一些字符。當你按下回車後,服務就會斷開連接。如果在建立連接時有問題,OpenSSL將會給你一個錯誤消息,

ck.pem文件就是我們需要得到php連接APNS 的文件,將ck.pem和push.php放入同一目錄上傳到服務器,push.php的代碼如下:

?php

// 這裡是我們上面得到的deviceToken,直接複製過來(記得去掉空格)

$deviceToken = ‘740f4707bebcf74f 9b7c25d4 8e3358945f6aa01da5ddb387462c7eaf 61bb78ad’;

// Put your private key’s passphrase here:

$passphrase = ‘abc123456’;

// Put your alert message here:

$message = ‘My first push test!’;

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();

stream_context_set_option($ctx, ‘ssl’, ‘local_cert’, ‘ck.pem’);

stream_context_set_option($ctx, ‘ssl’, ‘passphrase’, $passphrase);

// Open a connection to the APNS server

//這個為正是的發佈地址

//$fp = stream_socket_client(「ssl://gateway.push.apple.com:2195「, $err, $errstr, 60, //STREAM_CLIENT_CONNECT, $ctx);

//這個是沙盒測試地址,發佈到appstore後記得修改哦

$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);

?

接下來我們訪問

iphone就會接收到一條推送消息了,如果有問題的話就檢查上面的操作步驟,特別是加紅的部分

另外去除標記的方法為,在viewDidApper中加入

int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;

if(badge 0)

{

badge–;

[UIApplication sharedApplication].applicationIconBadgeNumber = badge;

}

如何正確的上傳php主動推送

使用php來做socket服務端目前有兩種,一種是使用php的原生socket實現,如workerman. 還有一種是swoole,swoole是一個php的c擴展。底層使用epool實現,你可以去wiki.swoole.com了解。

~如果你認可我的回答,請及時點擊【採納為滿意回答】按鈕 ~~手機提問的朋友在客戶端右上角評價點【滿意】即可。 ~你的採納是我前進的動力 ~~O(∩_∩)O,記得好評和採納,互相幫助,謝謝。

PHP做HTTP接口如何做到主動推送信息

事件觸發的時候給目標網址發送數據就可以了,如果是定時推送就寫個定時任務。

使用 http_get($url) 或者用 curl 都可以發送數據。具體使用就不多說了,百度很多。

如何在php後端及時推送消息給客戶端

後端代碼

push.php

?php

use Workerman\Worker;

require_once ‘./Workerman/Autoloader.php’;

// 初始化一個worker容器,監聽1234端口

$worker = new Worker(‘websocket://0.0.0.0:1234’);

// 這裡進程數必須設置為1

$worker-count = 1;

// worker進程啟動後建立一個內部通訊端口

$worker-onWorkerStart = function($worker)

{

// 開啟一個內部端口,方便內部系統推送數據,Text協議格式 文本+換行符

$inner_text_worker = new Worker(‘Text://0.0.0.0:5678’);

$inner_text_worker-onMessage = function($connection, $buffer)

{

global $worker;

// $data數組格式,裏面有uid,表示向那個uid的頁面推送數據

$data = json_decode($buffer, true);

$uid = $data[‘uid’];

// 通過workerman,向uid的頁面推送數據

$ret = sendMessageByUid($uid, $buffer);

// 返回推送結果

$connection-send($ret ? ‘ok’ : ‘fail’);

};

$inner_text_worker-listen();

};

// 新增加一個屬性,用來保存uid到connection的映射

$worker-uidConnections = array();

// 當有客戶端發來消息時執行的回調函數

$worker-onMessage = function($connection, $data)use($worker)

{

// 判斷當前客戶端是否已經驗證,既是否設置了uid

if(!isset($connection-uid))

{

// 沒驗證的話把第一個包當做uid(這裡為了方便演示,沒做真正的驗證)

$connection-uid = $data;

/* 保存uid到connection的映射,這樣可以方便的通過uid查找connection,

* 實現針對特定uid推送數據

*/

$worker-uidConnections[$connection-uid] = $connection;

return;

}

};

// 當有客戶端連接斷開時

$worker-onClose = function($connection)use($worker)

{

global $worker;

if(isset($connection-uid))

{

// 連接斷開時刪除映射

unset($worker-uidConnections[$connection-uid]);

}

};

// 向所有驗證的用戶推送數據

function broadcast($message)

{

global $worker;

foreach($worker-uidConnections as $connection)

{

$connection-send($message);

}

}

// 針對uid推送數據

function sendMessageByUid($uid, $message)

{

global $worker;

if(isset($worker-uidConnections[$uid]))

{

$connection = $worker-uidConnections[$uid];

$connection-send($message);

return true;

}

return false;

}

// 運行所有的worker(其實當前只定義了一個)

Worker::runAll();

啟動後端服務

php push.php start -d

前端接收推送的js代碼

var ws = new WebSocket(‘ws://127.0.0.1:1234’);

ws.onopen = function(){

var uid = ‘uid1’;

ws.send(uid);

};

ws.onmessage = function(e){

alert(e.data);

};

後端推送消息的代碼

// 建立socket連接到內部推送端口

$client = stream_socket_client(‘tcp://127.0.0.1:5678’, $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);

// 推送的數據,包含uid字段,表示是給這個uid推送

$data = array(‘uid’=’uid1’, ‘percent’=’88%’);

// 發送數據,注意5678端口是Text協議的端口,Text協議需要在數據末尾加上換行符

fwrite($client, json_encode($data).”\n”);

// 讀取推送結果

echo fread($client, 8192);

這裡的uid不一定是用戶的id,也可以理解為任務id即 taskid

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/199271.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 19:15
下一篇 2024-12-04 19:15

相關推薦

  • Python熱重載技術

    Python熱重載技術是現代編程的關鍵功能之一。它可以幫助我們在程序運行的過程中,更新代碼而無需重新啟動程序。本文將會全方位地介紹Python熱重載的實現方法和應用場景。 一、實現…

    編程 2025-04-29
  • Python包絡平滑技術解析

    本文將從以下幾個方面對Python包絡平滑技術進行詳細的闡述,包括: 什麼是包絡平滑技術? Python中使用包絡平滑技術的方法有哪些? 包絡平滑技術在具體應用中的實際效果 一、包…

    編程 2025-04-29
  • 微信小程序重構H5技術方案設計 Github

    本文旨在探討如何在微信小程序中重構H5技術方案,以及如何結合Github進行代碼存儲和版本管理。我們將從以下幾個方面進行討論: 一、小程序與H5技術對比 微信小程序與H5技術都可以…

    編程 2025-04-28
  • parent.$.dialog是什麼技術的語法

    parent.$.dialog是一種基於jQuery插件的彈出式對話框技術,它提供了一個方便快捷的方式來創建各種類型和樣式的彈出式對話框。它是對於在網站開發中常見的彈窗、提示框等交…

    編程 2025-04-28
  • HTML sprite技術

    本文將從多個方面闡述HTML sprite技術,包含基本概念、使用示例、實現原理等。 一、基本概念 1、什麼是HTML sprite? HTML sprite,也稱CSS spri…

    編程 2025-04-28
  • Python工作需要掌握什麼技術

    Python是一種高級編程語言,它因其簡單易學、高效可靠、可擴展性強而成為最流行的編程語言之一。在Python開發中,需要掌握許多技術才能讓開發工作更加高效、準確。本文將從多個方面…

    編程 2025-04-28
  • 開源腦電波技術

    本文將會探討開源腦電波技術的應用、原理和示例。 一、腦電波簡介 腦電波(Electroencephalogram,簡稱EEG),是一種用於檢測人腦電活動的無創性技術。它通過在頭皮上…

    編程 2025-04-27
  • 阿里Python技術手冊

    本文將從多個方面對阿里Python技術手冊進行詳細闡述,包括規範、大數據、Web應用、安全和調試等方面。 一、規範 Python的編寫規範對於代碼的可讀性和可維護性有很大的影響。阿…

    編程 2025-04-27
  • TaintGraphTraversal – 使用數據流分析技術解決污點問題

    TaintGraphTraversal是一種數據流分析技術,旨在解決應用程序中污點問題。通過在程序中跟蹤數據流和標記數據源,TaintGraphTraversal可以確定哪些數據被…

    編程 2025-04-27
  • 網絡數據爬蟲技術用法介紹

    網絡數據爬蟲技術是指通過一定的策略、方法和技術手段,獲取互聯網上的數據信息並進行處理的一種技術。本文將從以下幾個方面對網絡數據爬蟲技術做詳細的闡述。 一、爬蟲原理 網絡數據爬蟲技術…

    編程 2025-04-27

發表回復

登錄後才能評論