❶ 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] : UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
return YES;
}
- (void)application:(UIApplication *)application :(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];
[alert show];
[alert release];
NSLog(@"%@", userInfo);
}
- (void)application:(UIApplication *)application :(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 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);
?>
接下來我們訪問http://localhost/push/push.php
iphone就會接收到一條推送消息了,如果有問題的話就檢查上面的操作步驟,特別是加紅的部分
另外去除標記的方法為,在viewDidApper中加入
int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
if(badge > 0)
{
badge--;
[UIApplication sharedApplication].applicationIconBadgeNumber = badge;
}
❷ php ios 推送 可以使用curl嗎
<?php
02//
03ini_set('display_errors','on');
04error_reporting(E_ALL);
05
06
07//Apnsconfig
08
09//true-useapnsinproctionmode
10//false-useapnsindevmode
11define("PRODUCTION_MODE",false);
12
13$serverId=1;
14$serverName='my-server-domain.com';
15
16if(PRODUCTION_MODE){
17$apnsHost='gateway.sandbox.push.apple.com';
18}else{
19$apnsHost='gateway.push.apple.com';
20}
21
22$apnsPort=2195;
23if(PRODUCTION_MODE){
24//
25$apnsCert=$_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-development.pem';
26}else{
27//Useaproctionpushcertificate
28$apnsCert=$_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-proction.pem';
29}
30
31
32//---Sendingpushnotification---
33
34//Insertyourdevicetokenhere
35$device_token="<>";//SomeDeviceToken
36
37
38//Notificationcontent
39
40$payload=array();
41
42//Basicmessage
43$payload['aps']=array(
44'alert'=>'testing1,2,3..',
45'badge'=>1,
46'sound'=>'default',
47);
48$payload['server']=array(
49'serverId'=>$serverId,
50'name'=>$serverName
51);
52//
53$payload['data']=array(
54'foo'=>"bar"
55);
56$payload=json_encode($payload);
57
58$streamContext=stream_context_create();
59stream_context_set_option($streamContext,'ssl','local_cert',$apnsCert);
60stream_context_set_option($streamContext,'ssl','passphrase',"");
61
62
63$apns=stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort,$error,$errorString,2,STREAM_CLIENT_CONNECT,$streamContext);
64
65
66$deviceToken=str_replace("","",substr($device_token,1,-1));
67echo$deviceToken;
68$apnsMessage=chr(0).chr(0).chr(32).pack('H*',str_replace('','',$deviceToken)).chr(0).chr(mb_strlen($payload)).$payload;
69fwrite($apns,$apnsMessage);
70
71
72//socket_close($apns);
73fclose($apns);
74
75?>
❸ 如何透過 PHP 發送 Apple Notification Push
在 PHP 的實作上透過 stream_context_create() 函式建立 SSL 連線,再利用 pack() 函式實作上述的規格來傳送 Bytes 資料 (Payload),以下是 PHP 最精簡的發送訊息程式碼,執行後可以順利與 APNS 溝通與發送訊息。各位可以依據需求修改程式來發送 Enhanced 或 Simple 訊息,或者切換 Sandbox 或 Proction 環境。程式範例如下:
<?php
// Proction mode
$certificateFile = 'apns-dis.pem';
$pushServer = 'ssl://gateway.push.apple.com:2195';
$feedbackServer = 'ssl://feedback.push.apple.com:2196';
// Sandbox mode
$certificateFile = 'apns-dev.pem';
$pushServer = 'ssl://gateway.sandbox.push.apple.com:2195';
$feedbackServer = 'ssl://feedback.sandbox.push.apple.com:2196';
// push notification
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $certificateFile);
$fp = stream_socket_client(
$pushServer,
$error,
$errorStr,
100,
STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,
$streamContext
);
// make payload
$payloadObject = array(
'aps' => array(
'alert' => 'Server Time:'.date('Y-m-d H:i:s'),
'sound' => 'default',
'badge' => 3
),
'custom_key' => 'custom_value'
);
$payload = json_encode($payloadObject);
$deviceToken = '';
$expire = time() + 3600;
$id = time();
if ($expire) {
// Enhanced mode
$binary= pack('CNNnH*n', 1, $id, $expire, 32, $deviceToken, strlen($payload)).$payload;
} else {
// Simple mode
$binary= pack('CnH*n', 0, 32, $deviceToken, strlen($payload)).$payload;
}
$result = fwrite($fp, $binary);
fclose($fp);
?>
❹ apple push是什麼
apple push就是蘋果手機的一種推送功能。iPhone Push(推送功能)的工作機制可以簡單的概括為右圖,Provider是指某個iPhone軟體的Push伺服器。 APNS 是Apple Push Notification Service(蘋果推送服務)的縮寫,下文統一使用該縮寫。
iPhone在開啟Push的時候,會連接 APNS建立一條TLS加密鏈接即:SSL/TLS鏈接。每一台正常的iPhone都有一個獨有的設備證書,而APNS也有一個伺服器證書。兩者建立的時候,會驗證彼此的證書有 效性。
(4)phpapplepush擴展閱讀:
Push原理
整個過程可以分為三個階段,下面用大家常用的聊天客戶端BeejiveIM來說明。(BeejiveIM是一款支持多賬戶登錄的支持Push的 iPhone聊天客戶端,支持MSN、Google Talk等)
此時Provider為BeejiveIM伺服器,如果在 BeejiveIM上登陸MSN,其實軟體是先把登錄信息發送到BeejiveIM伺服器,再通過其伺服器來登陸MSN。
因此,當我關 閉了BeejiveIM,BeejiveIM伺服器會繼續為我登陸MSN,此時如果有人對我的MSN賬戶發送了消息,那麼就會觸發Push。此時:
1、BeejiveIM伺服器把要發送的消息、目的iPhone的標識打包,發給APNS。
2、APNS在自身的已注冊Push服務 的iPhone列表中,查找有相應標識的iPhone,並把消息發到iPhone。
3、iPhone把發來的消息傳遞給相應的應用程序, 並且按照設定彈出Push通知。
❺ 怎樣編寫Apple Push Notification伺服器
基本結構:
使用唯一的SSL許可證連接到APNS
循環通過你需要發送到消息
為各消息構建有效載荷
斷開與 APNS的連接
遠程通知數據的流程是單向的。提供者將包括客戶程序設備令牌和有效載荷的數據打包,發送到APNS,然後APNS再將通知發送給最終設備。
限制:
有效載荷限制為256位元組 – 它包括了消息主體以及你希望傳送帶其他屬性。推送通知並不適於傳送大量的數據。例如,我們僅僅傳送一條短消息通知伺服器監視的事件已經被觸發了。
APNS並不提供消息發送成功與否的回饋狀態。一個原因是如果一個設備無法聯系那麼發送給它的消息將被存於隊列中,然而只有最新發送的消息被存於隊列中 – 覆蓋了先前發送但不成功的消息。
推送通知不適合用於發送緊急通知,因為消息僅在設備具有wifi或手機服務連接的情況下才能被發送,這也是為什麼我們推薦與其它方法如email或SMS一起使用的原因。
用來與APNS通訊的SSL許可證(下面將討論)是在程序層生成的。本教程涉及到實現方法僅適於單個iPhone程序,所以如果你有多個程序,那麼你需要修改代碼使之適合於使用多個許可證。
設備令牌:
每條推送消息都必須針對某特定設備。這是通過使用在你的iPhone程序中由APNS產生的唯一deviceToken(設備令牌)來實現的。一旦獲取了此令牌,你需要將其存儲於伺服器而不是你的iPhone程序內。它看上去像這樣:
c9d4c07c fbbc26d6 ef87a44d 53e16983 1096a5d5 fd825475 56659ddd f715defc
在我們的 Server Density iPhone 程序中,我們在程序啟動時調用相應的令牌生成方法,然後通過 HTTP API 調用 傳回給我們的伺服器 。這將使得deviceToken存儲於伺服器的有關用戶的資料庫中,從而我們可以使用它與持有此設備的用戶進行通訊。
反饋服務:
Apple 還提供了一個 反饋服務 ,你應該定期查詢。它提供了一個以前使用過但不再有效的(例如用戶卸載了你的iPhone程序)設備令牌列表。你可以從你的資料庫中刪除這些設備令牌。
許可證:
要進行推送服務的第一件事就是獲取推送許可證。它用來對你通過SSL與APNS通訊進行識別。
在Mac上生成 Apple推送通知SSL許可證:
登錄到 iPhone Developer Connection Portal 並點擊 App IDs
創建一個不使用通配符的 App ID 。通配符 ID 不能用於推送通知服務。例如,我們的iPhone程序ID像這樣: AB123346CD.com.serverdensity.iphone
點擊App ID旁的「Configure」,然後按下按鈕生產 推送通知許可證。根據「向導」指導的步驟生成一個簽名並上傳,最後下載生成的許可證。此步驟在 Apple文檔中 也有談到。
通過雙擊.cer文件將你的 aps_developer_identity.cer 引入Keychain中。
在Mac上啟動 Keychain助手,然後在login keychain中選擇 Certificates分類。你將看到一個可擴展選項「Apple Development Push Services」
擴展此選項然後右擊「Apple Development Push Services」 > Export 「Apple Development Push Services ID123」。保存為 apns-dev-cert.p12 文件。
擴展「Apple Development Push Services」 對「Private Key」做同樣操作,保存為 apns-dev-key.p12 文件。
需要通過終端命令將這些文件轉換為PEM格式:
opensslpkcs12-clcerts-nokeys-outapns-dev-cert.pem-inapns-dev-cert.p12
opensslpkcs12-nocerts-outapns-dev-key.pem-inapns-dev-key.p12
如果你想要移除密碼,要麼在導出/轉換時不要設定或者執行:
opensslrsa-inapns-dev-key.pem-outapns-dev-key-noenc.pem
最後,你需要將鍵和許可文件合成為apns-dev.pem文件,此文件在連接到APNS時需要使用:
catapns-dev-cert.pemapns-dev-key-noenc.pem>apns-dev.pem
將此文件保存為一個易記的名字,你有可能以後會用到它。上述步驟同樣適合於生成產品許可證。
載荷內容:
載荷 格式化為遵循 RFC 4627標準的JSON格式。它由以下幾部分組成:
提示 – 顯示於設備上的文本串
標識 – 設備屏幕中程序圖標上顯示的整數
聲音 – 顯示消息在設備的同時發出的聲音的文本名字
本教程僅處理發送簡單提示文本串,但也可以發送包括諸如顯示自定義按鈕等在內的各種選項的字典集。
創建載荷:
使用 PHP 很容易根據數組並 轉換成 JSON而創建載荷:
$payload['aps']=array('alert'=>'Thisisthealerttext','badge'=>1,'sound'=>'default');
$payload=json_encode($payload);
顯示 $payload 的內容可以看到傳送到APNS 的 JSON字元串:
{
"aps":{"alert":"Thisisthealerttext","badge":1,"sound":"default"}
}
這將使消息顯示於設備上,觸發提升聲音並將「1」置於程序圖標上。默認按鈕「Close」和「View」同時會顯示於彈出窗口上。
對於 Server Density iPhone程序而言,讓用戶按下「View」直接進入產生此提示的伺服器是很重要的,所以我們增加了額外的自定義值:
$payload['aps']=array('alert'=>'Thisisthealerttext','badge'=>1,'sound'=>'default');
$payload['server']=array('serverId'=>$serverId,'name'=>$name);
$output=json_encode($payload);
當用戶按下「View」後,自定義server值將被傳遞到設備中的程序。JSON 值如下:
{
"aps":{"alert":"Thisisthealerttext","badge":1,"sound":"default"},
"server":{"serverId":1,"name":"Servername")
}
256位元組的限制適用於整個載荷,包括自定義字典集。
原生介面
在Server Density中,一旦產生了一條提示,將建立一個載荷並插入隊列中。因此有必要時我們可以同時發送多個載荷。
Apple推薦使用這種方法,因為如果你在發送各載荷時頻繁連接和斷開,APNS有可能會封鎖你的IP。
如Apple 描述:
原生介面使用原生socket,具有二進制內容,採用數據流技術,不產生回饋。
打開連接
打開連接的PHP 5代碼如下:
$apnsHost='gateway.sandbox.push.apple.com';
$apnsPort=2195;
$apnsCert='apns-dev.pem';
$streamContext=stream_context_create();
stream_context_set_option($streamContext,'ssl','local_cert',$apnsCert);
$apns=stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort,$error,$errorString,2,
STREAM_CLIENT_CONNECT,$streamContext);
如果發送錯誤,你可以參考$errorString。它也包括了SSL許可證不正確時的詳細信息。
許可證文件處於執行的PHP代碼的當前工作目錄下,如果需要你可指定其絕對路徑。
注意測試時應該使用開發許可證及sandbox。成品主機名為 gateway.push.apple.com ,而且你必須使用不同的產品許可證。
發送載荷
在此,我們循環整個載荷隊列進行發送。構建發送到APNS的二進制內容簡單示例如下:
$apnsMessage=chr(0).chr(0).chr(32).pack('H*',str_replace('','',$deviceToken)).chr(0).
chr(strlen($payload)).$payload;
fwrite($apns,$apnsMessage)
注意 $deviceToken 是從資料庫中提取並去除空格得到的。我們還應該檢查是否$payload超過256個位元組。
$apnsMessage 包括了正確的二進制載荷,而fwrite 將載荷寫入當前活動的數據流連接中。
完成後,應關閉連接:
socket_close($apns);
fclose($apns);
php-apns
有一個開源伺服器庫php-apns實現了以上所有功能,它依賴於memcached。我們不想使用任何第三方代碼,所以完全自己編寫了自己的伺服器。我們使用自定義cron系統,幾秒鍾運行一次。
❻ ios推送消息 用php推送怎麼實現
php實現ios推送的方法:首先把要發送的消息以及iPhone標識打包,並發送給APNS;然後查找有相應標識的iPhone,並把消息發送到iPhone;最後把發來的消息傳遞給相應的應用程序,並且按照設定彈出Push通知即可。 可以分為三個階段:❼ iPhone的push推送服務是什麼
apple push就是蘋果手機的一種推送功能。iPhone Push(推送功能)的工作機制可以簡單的概括,Provider是指某個iPhone軟體的Push伺服器。❽ 有關php 調用ios push的問題
第一種情況:程序未啟動(也不在後台)。點擊通知欄里的消息會觸發以下方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
可在這個方法里處理通知,代碼如下:
NSDictionary* pushNotification = [launchOptionsobjectForKey:];
如果用戶點擊桌面app的圖標打開程序,只會觸發這個方法
- (void)applicationDidBecomeActive:(UIApplication *)application
這時候是沒辦法得到推送的通知的。
第二種情況:程序運行中(包括在後台),點擊通知欄里的通知,會觸發以下方法
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary*)userInfo{
可在這個方法做相應的處理。