如何在循环中获取所有设备令牌以发送推送通知(APNS)?

3
我是一个有用的助手,可以为您翻译文本。
我正在尝试使用PHP代码向下载了我的iPhone应用程序的所有令牌发送消息。你能告诉我如何向多个设备发送信息以及如何进入设备令牌循环吗?
这是我的代码:
<?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);

?>

请查看这个问题:https://dev59.com/gmUq5IYBdhLWcg3wXvMC - Subodh Ghulaxe
2个回答

10

我已经按照你在教程中提到的所有步骤完成了,并且一切都运行良好。但是我现在谈论的是如何向多个设备发送单个通知。谢谢。 - SalehAlmusallam
1
那么您的意思是我应该在我的服务器上创建自己的数据库,并通过从应用程序委托application:didRegisterForRemoteNotificationsWithDeviceToken方法发送它们到我的服务器来存储所有设备标记,然后运行推送通知的循环?还是有一种方法可以从苹果服务器获取它们? - SalehAlmusallam
您应该能够发送许多通知。但是,如果您这样做,请不要为每个通知发送一个新的APNS连接(但始终保持连接打开)。您还可以为每个应用程序打开最多15个并发连接。最后,将尽可能多的通知捆绑到发送到APNS的单个数据包中。这将减少您的服务对APNS的影响。 - Hollance
太好了,谢谢你提供这些详细信息,省去了我阅读冗长文档的时间。 - SalehAlmusallam
@Hollance 我已经尝试了你的方法。我正在尝试将设备令牌发送到我的服务器。但问题是我的设备令牌总是变成(null),你能帮忙吗? - user1580957
显示剩余4条评论

2

推送消息需要逐一发送。您需要使用 foreach 循环遍历设备令牌:

以下是一个简单的示例:

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

其中$device_tokens是设备令牌的数组。


那么$device_tokens数组是来自苹果服务器的,对吗?在上传应用程序到应用商店之前如何测试它? - SalehAlmusallam
3
不。iPhone应用程序会向您发送设备令牌(假设它被编程为这样做),您需要将设备令牌存储到数据库中。当您想要发送推送通知时,必须从自己的数据库中检索记录并发送它们。因此,回答您的问题,$device_tokens数组是由您填充数据的(即从SQL查询到您自己的数据库)。 - Francois Deschenes
非常感谢,弗朗索瓦,这帮了很大的忙。您建议我使用PHP将设备令牌从此方法- (void)application:(UIApplication*)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {NSString*str = [NSString stringWithFormat:@"Device Token=%@",deviceToken]; NSLog(@"%@",str);}发送到我的MySQL数据库,然后检索它们并将其放入循环中。谢谢。 - SalehAlmusallam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接