【发布时间】:2016-04-04 16:48:42
【问题描述】:
我真的很挣扎。这段代码不是由我创建的,但我已经更改了它,所以它有点工作。我的目标是让它能够向所有使用该应用程序的设备发送推送通知。我是一个ios和andriod编程的,所以我会尽力而为。我已经清理并更改了提供给我的代码,以便它现在只向一个设备发送通知。
这是代码
<?php
include 'conn.php';
if ( $_REQUEST['key'] == 'notification' ) {
include 'notifications.php';
$message = $_REQUEST['text'];
$text = mysql_real_escape_string( $_REQUEST['text'] );
$start = $_REQUEST['start'];
$end = $_REQUEST['end'];
$date = date( "Ymd", strtotime( $_REQUEST['date'] ) );
$callus = $_REQUEST['callus'];
$in = "INSERT INTO `notifications` (`date`, `start_time`, `end_time`, `text`, `call_us`) VALUES ('$date', '$start', '$end', '$text', '$callus');";
mysql_query($in);
} else {
$message = mysql_real_escape_string( $_REQUEST['text'] );
$time = date( 'Y-m-d H:i:s' );
$in = "INSERT INTO `alerts` (`text`, `time`) VALUES ('$message', '$time');";
mysql_query( $in );
$sel="SELECT * FROM `users` GROUP by device_token";
$rs = mysql_query( $sel ) or die('');
if ( mysql_num_rows( $rs ) != 0 ) {
while( $row=mysql_fetch_array( $rs ) ) {
$regi = array();
$regi[] = $row['device_token'];
$dev = $row['device_token'];
if( strlen ( $dev ) > 65 ) {
$regis[] = $row['device_token'];
} else {
$ios[] = $dev;
}
}
}
$url = 'https://android.googleapis.com/gcm/send';
$fields = array( 'registration_ids' => $regis, 'data' => array( 'message'=>$message,'count'=>1 ) );
$headers = array(
'Authorization: key=AIzaSyCMysH7TySEgdbvRoCLoZk8uFF1x_A3uxg',
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode ( $fields ) );
$result = curl_exec( $ch );
curl_close ( $ch );
//Apple Push notification
// This this a fake device id:
$deviceToken = "5d8b3165fc03645d23c2651badd69f07d028aee801acf1d25a4d230882156755";
// fake password:
$passphrase = '123456789';
$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.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',
'badge' => '1'
);
// 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);
}
include 'index.php';
?>
我将 ios 设备令牌添加到 $deviceToken 并将 android 设备令牌添加到 $regi,它将发送到手机。我唯一更改的部分是 Apple 推送通知部分不起作用。在我更改它之前,苹果推送通知使用的是 $dev 变量,而 android 使用的是 $regi。现在我知道启动应用程序时设备令牌正在发送到服务器,所以我的猜测是它们没有存储在变量中。您是否可以看到任何问题以及如何打印它们以查看它们是否为空?
谢谢
【问题讨论】:
标签: android ios push-notification