【问题标题】:How to know all devices tokens to send push notification (APNS) in a loop?如何知道所有设备令牌以循环发送推送通知(APNS)?
【发布时间】:2011-09-17 11:51:38
【问题描述】:

我正在尝试使用 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);

?>

【问题讨论】:

标签: php iphone notifications push apple-push-notifications


【解决方案1】:

我写了一篇关于推送通知的教程。我建议你阅读它,这样你会更好地理解你应该做什么: http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12

【讨论】:

  • 我已经完成了您在精彩教程中提到的所有内容,并且效果很好,但我在这里谈论的是向多个设备发送单个通知。谢谢
  • 您应该将它们视为多个通知。每个设备都需要接收自己的通知。因此,如果您按照我的教程所做的并在数据库中为您希望发送的每个通知添加一条记录,如果您想向 100 台设备发送相同的通知,您将在数据库中放入 100 条记录。如果这是您经常做的事情——向多个设备发送完全相同的通知——那么不同的数据库结构可能更有意义。
  • 所以你是说我应该在我的服务器上创建我自己的数据库并通过将它们从应用程序委托 application:didRegisterForRemoteNotificationsWithDeviceToken 方法发送到我的服务器来存储所有设备令牌,然后运行一个循环推送通知?或者有办法从苹果服务器获取它们?
  • 正确。当您的应用程序安装在用户的设备上时,它会将令牌发送到您的服务器。您的服务器需要以某种方式跟踪这些令牌,例如在数据库中。然后,当您需要向这些令牌推送通知时,您可以从数据库中获取它们并向每个令牌发送通知。无法从 Apple 获取设备令牌列表,您需要自己收集这些令牌。 (顺便说一句,您只能发送到装有您的应用程序的设备。如果您发送的通知过多而无法发送,Apple 可能会将您的证书列入黑名单。)
  • 非常感谢 Hollance,太好了。我将每 2-3 天向所有客户发送一次推送通知,这是否太多了?我找不到任何关于我可以发送多少而不被列入黑名单的文章。
【解决方案2】:

推送消息必须一一发送。您必须使用 foreach 循环来遍历设备令牌:

这是一个简单的例子:

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

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

【讨论】:

  • 所以 $device_tokens 数组来自苹果服务器,是真的吗?上传应用到应用商店之前如何测试?
  • @SalehAlmusallam - 不。iPhone 应用程序将向您发送设备令牌(假设它已被编程为这样做),并且由您将设备令牌存储在数据库中。当您想要发送推送通知时,您必须从您自己的数据库中提取记录并发送它们。因此,为了回答您的问题,$device_tokens 数组供您填充数据(即从 SQL 查询到您自己的数据库)。
  • 伟大的弗朗索瓦,帮助很大,所以你建议我使用 PHP 将设备令牌从这个方法 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken]; NSLog(@"%@",str); } 发送到我的 MySQL 数据库,然后检索它们,将它们放在一个循环中。谢谢
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多