2011-06-17 40 views
3

我正在嘗試使用PHP代碼發送給所有下載我的iPhone應用程序的令牌。你能告訴我如何發送到多個設備,以及如何進入設備令牌循環?如何知道所有設備令牌在循環中發送推送通知(APNS)?

這是我的代碼:

<?php 

$deviceToken = ''; // HERE I CAN SEND TO ONE DEVICE 

// Passphrase for the private key (ck.pem file) 
// $pass = ''; 
// Get the parameters from http get or from command line 
$message = $_GET['message'] or $message = $argv[1] or $message = 'MY NOTIFICATION BODY'; 
$badge = (int)$_GET['badge'] or $badge = (int)$argv[2]; 
$sound = $_GET['sound'] or $sound = $argv[3]; 

// Construct the notification payload 
$body = array(); 
$body['aps'] = array('alert' => $message); 

if ($badge) 
    $body['aps']['badge'] = $badge; 
if ($sound) 
    $body['aps']['sound'] = $sound; 
/* End of Configurable Items */ 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'apns-dev.pem'); 
// assume the private key passphase was removed. 
// stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); 
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60,STREAM_CLIENT_CONNECT, $ctx); 
if (!$fp) { 
print "Failed to connect $err $errstrn"; 
return; 
} 
else { 
print "Connection OK\n"; 
} 

$payload = json_encode($body); 
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) .  pack("n",strlen($payload)) . $payload; 
print "sending message :" . $payload . "\n"; 
fwrite($fp, $msg); 
fclose($fp); 

?> 
+0

檢查這個問題http://stackoverflow.com/q/14563097/1868660 –

回答

10

我寫了一篇關於推送通知的教程。我建議你閱讀它,以便你更好地理解你應該做什麼: http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12

+0

我已經完成了所有你在你的優秀教程中提到的,它工作正常,但我在這裏談論發送單個通知到多個設備。謝謝 – SalehAlmusallam

+0

你應該考慮他們多個通知。每個設備都需要收到自己的通知。因此,如果您按照我的教程所做的操作,併爲數據庫中的每條通知發送一條記錄,那麼如果要將相同的通知發送到100臺設備,則會在數據庫中放置100條記錄。如果這是你經常做的事情 - 發送完全相同的通知給多個設備 - 那麼不同的數據庫結構可能會更有意義。 – Hollance

+1

所以你說我應該在我的服務器上創建自己的數據庫,並通過從應用程序委託應用程序發送它們來存儲所有設備令牌:didRegisterForRemoteNotificationsWithDeviceToken方法到我的服務器,然後運行循環進行推送通知?或者有一種方法可以獲得他們從蘋果服務器? – SalehAlmusallam

2

推送消息必須逐個發送。你必須通過設備令牌使用foreach循環來循環:

這裏有一個簡單的例子:

foreach ($device_tokens as $device_token) 
{ 
    // Send device token a message here. 
} 

哪裏$device_tokens是設備令牌的數組。

+0

所以$ device_tokens數組來自蘋果服務器,這是真的嗎?在我將應用程序上傳到應用程序商店之前如何測試它? – SalehAlmusallam

+3

@SalehAlmusallam - 不。iPhone應用程序會向您發送設備令牌(假設它已被編程)這取決於你將設備令牌存儲在數據庫中,當你想發送推送通知時,你必須從你自己的數據庫中提取記錄併發送它們,所以爲了回答你的問題,$ device_tokens數組適合你填充數據(即從一個SQL查詢到你自己的數據庫) –

+0

偉大的弗朗索瓦,幫助了很多,所以你建議我發送設備標記從這個方法' - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken :(NSData *)deviceToken { NSString * str = [NSString stringWithFormat:@「Device Token =%@」,deviceToken]; NSLog(@「%@」,str); }'到我的MySQL數據庫使用PHP,然後檢索它們,把它們放在一個循環。謝謝 – SalehAlmusallam