我是一名Android开发人员,所以我对PHP知之甚少。
我们正在Android和IOS开发试卷应用程序。并创建完美的通知功能。但问题是IOS使用Push通知和android使用GCM。而这两个是使用不同的api。
我的问题是如何结合这两个api。我想将这两个api(webservice)合二为一。当管理员上传纸张然后所有用户使用通知天气获取通知它是android或IOS设备。
我该怎么办?非常感谢提前感谢。我正在使用 LINK
这是我的努力
Android API
<?php
require_once('connect.php');
// API access key from Google API's Console
define( 'API_ACCESS_KEY', 'AIzaSyBWcc6ONXvNEHECxzLwFDSDCTKDTjEhfT8' );
//$registrationIds = array( $_GET['id'] );
$conn = new mysqli('host name', 'server name', 'password', 'database name');
$select_qury = "SELECT gcm_registration_id FROM gtu_registration";
$result = $conn->query($select_qury);
$registrationIds = array();
while($row = $result->fetch_assoc()){
array_push($registrationIds, $row['gcm_registration_id']);
}
// prep the bundle
$msg = array
(
'message' => 'here is a message. message',
'title' => 'This is a title. title',
'subtitle' => 'This is a subtitle. subtitle',
'tickerText'=> 'Ticker text here...Ticker text here...Ticker text here',
'vibrate' => 1,
'sound' => 1,
'largeIcon' => 'large_icon',
'smallIcon' => 'small_icon'
);
//Creating a new array fileds and adding the msg array and registration token array here
$fields = array
(
'registration_ids' => $registrationIds,
'data' => $msg
);
//Adding the api key in one more array header
$headers = array
(
'Authorization: key=' . API_ACCESS_KEY,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' );
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 );
//Decoding json from result
$res = json_decode($result);
$flag = $res->success;
//if success is 1 means message is sent
if($flag == 1){
//Redirecting back to our form with a request success
header('Location: index.php?success');
}else{
//Redirecting back to our form with a request failure
header('Location: index.php?failure');
}
echo $result;
IOS API
<?php
$token ='f1088d1c0603218b31b5a26210c4b0e60e4884225235c7f5c2e55c47b937a03d';
$deviceToken = $token; // token dell'iPhone a cui inviare la notifica
// Passphrase for the private key (ck.pem file)
$pass = "mac12345";
// Get the parameters from http get or from command line
$message = 'Notification text';
$badge = 1;
$sound = 'default';
// 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', 'Gtuck.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, 120, STREAM_CLIENT_CONNECT, $ctx);
$payload = json_encode($body);
$msg = chr(0).pack('n',32).pack('H*', str_replace(' ', '', $deviceToken)).pack('n',strlen($payload)).$payload;
print "" . $payload . "\n";
fwrite($fp, $msg);
fclose($fp);
?>
有可能吗?如果有任何建议或其他方式来完成,请告诉我。
答案 0 :(得分:1)
以下代码由我使用,您可以随时改变
根据设备Os
if($gcm_id_array['os'] == 'android')
{
$v[$index] = scs_single_gcm($gcm_id_array['gcm_id'],$message);
$index++;
}else{
$v[$index] = scs_single_gcm_ios($gcm_id_array['gcm_id'],$message);
$index++;
}
ios的功能 scs_single_gcm_ios
function scs_single_gcm_ios($regids,$message)
{
try{
$deviceToken = $regids;
$passphrase = 'Kookdokoo';
$title = $message['title'];
$id = $message['noti_id'];
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$fp = stream_socket_client(
'ssl://gateway.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
$body['aps'] = array(
'alert' => $title,
'sound' => 'default',
'id' =>$id
);
// 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)
$result = 0;
else
$result = 1;
// Close the connection to the server
fclose($fp);
return $result;
}
catch(Exception $e){
$e->getMessage();
}
}
对于android
function scs_single_gcm($regids,$message)
{
if(is_array($regids)){
$fields = array(
'registration_ids' => $regids,
'data' => array( "data" => $message ),
);
}else
{
$fields = array(
'registration_ids' => array($regids),
'data' => array( "data" => $message ),
);
}
// Open connection
$ch = curl_init();
if (FALSE === $ch)
throw new Exception('failed to initialize');
// Set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt( $ch, CURLOPT_URL,url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER,array(key,content_type));
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );
// Execute post
$result = curl_exec($ch);
/*
if (FALSE === $result)
echo curl_error($ch).curl_errno($ch);
// Close connection
curl_close($ch);
if (curl_errno( $ch ) ){
'GCM error: ' . curl_error( $ch );
}
*/
$result = json_decode($result);
$notification = 1;
if($result->success){
$nm = 'push notification success';
$p = 1;
}else{
if($result->results[0]->error == "NotRegistered")
{
$nm = 'push notification success';
$p = 1;
}else{
$nm = 'push notification failed';
$p = 0;
}
}
答案 1 :(得分:0)
我认为这里没问题。您需要设计一种推送令牌存储。此存储的每条记录将包含有关用户设备的信息:push_token(如果是Android设备,则为gcm_registration_id),平台类型(iOS / android),如果您有某个帐户系统,则可能包含user_id。当您获取此表时,您将根据平台属性的值调用相关函数(让我们将它们命名为{"latitude":-25.74486,"longitude":28.18783,"timezone":"Africa/Johannesburg","offset":2,"currently":
{"time":1462871342,"summary":"Foggy","icon":"fog","precipIntensity":0,"precipProbability":0,
"temperature":18.08,"apparentTemperature":18.08,
"dewPoint":9.3,"humidity":0.57,"windSpeed":3.75,"windBearing":351,"visibility":2.78,
"cloudCover":0.23,"pressure":1024.87,"ozone":252.43}}
和 //parse forecast.io message
var weather = JSON.parse(msg.payload);
return weather.currently.temperature;
)。
答案 2 :(得分:0)
//ios push notification script
// database query
if(yourdevice == 'ios')
{
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');
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' => 'incoming123.wav'
);
// 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);
} else {
//Android Notification
define( 'API_ACCESS_KEY', 'AIzaSyBWcc6ONXvNEHECxzLwFDSDCTKDTjEhfT8' );
//$registrationIds = array( $_GET['id'] );
$conn = new mysqli('host name', 'server name', 'password', 'database name');
$select_qury = "SELECT gcm_registration_id FROM gtu_registration";
$result = $conn->query($select_qury);
$registrationIds = array();
while($row = $result->fetch_assoc()){
array_push($registrationIds, $row['gcm_registration_id']);
}
// prep the bundle
$msg = array
(
'message' => 'here is a message. message',
'title' => 'This is a title. title',
'subtitle' => 'This is a subtitle. subtitle',
'tickerText'=> 'Ticker text here...Ticker text here...Ticker text here',
'vibrate' => 1,
'sound' => 1,
'largeIcon' => 'large_icon',
'smallIcon' => 'small_icon'
);
//Creating a new array fileds and adding the msg array and registration token array here
$fields = array
(
'registration_ids' => $registrationIds,
'data' => $msg
);
//Adding the api key in one more array header
$headers = array
(
'Authorization: key=' . API_ACCESS_KEY,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' );
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 );
//Decoding json from result
$res = json_decode($result);
$flag = $res->success;
//if success is 1 means message is sent
if($flag == 1){
//Redirecting back to our form with a request success
header('Location: index.php?success');
}else{
//Redirecting back to our form with a request failure
header('Location: index.php?failure');
}
echo $result;
}
答案 3 :(得分:0)
我在 github 中找到了解决方案
它适用于 Android , IOS 和 Windows 。
感谢joashp。
使用这两个文件。
<强> test.php的强>
<?php
include_once('connect.php');
require_once('notification.php');
$device_type = $_GET['device_type'];
$sql = "SELECT gcm_registration_id from gtu_registration where device_type = 'Android'";
$result = mysqli_query($con, $sql);
while($row = mysqli_fetch_array($result))
{
// $output[] = $row;
// $message = $row['message'];
$gcm_registration = $row['gcm_registration_id'];
// print(json_encode($gcm_registration));
//print(json_encode($gcm_registration));
}
$sql = "SELECT title ,message from gtu_message";
$result = mysqli_query($con, $sql);
while($row = mysqli_fetch_array($result))
{
// $output[] = $row;
$title = $row['title'];
$message = $row['message'];
// print(json_encode($gcm_registration));
//print(json_encode($gcm_registration));
}
$msg_payload = array (
'mtitle' => $title,
'mdesc' => $message,
);
PushNotifications::android($msg_payload, $gcm_registration);
//echo 'Success';
if(!$gcm_registration)
{
echo 'Failure';
}else
{
echo 'Android Success';
}
$query = "select * from gtu_registration where device_type = 'IOS'";
$results = mysqli_query($con, $query);
while($rows = mysqli_fetch_array($results))
{
$gcm_registrations = $rows['gcm_registration_id'];
}
$sql = "SELECT title ,message from gtu_message";
$result = mysqli_query($con, $sql);
while($row = mysqli_fetch_array($result))
{
// $output[] = $row;
// $message = $row['message'];
$message = $row['message'];
$title = $row['title'];
// print(json_encode($gcm_registration));
//print(json_encode($gcm_registration));
}
$msg_payload = array (
'mtitle' => $title,
'mdesc' => $message,
);
PushNotifications::iOS($msg_payload, $gcm_registrations);
if(!$gcm_registrations)
{
echo 'Failure';
} else {
echo 'IOS Success';
}
?>
<强> notification.php 强>
<?php
// Server file
class PushNotifications {
// (Android)API access key from Google API's Console.
private static $API_ACCESS_KEY = 'AIzaSyBWcc6ONXvNEHECxzLwFDSDCTKDTjEhfT8';
// (iOS) Private key's passphrase.
private static $passphrase = 'mac12345';
// (Windows Phone 8) The name of our push channel.
// Change the above three vriables as per your app.
public function __construct() {
exit('Init function is not allowed');
}
// Sends Push notification for Android users
public function android($data, $reg_id) {
$url = 'https://android.googleapis.com/gcm/send';
$message = array(
'title' => $data['mtitle'],
'message' => $data['mdesc'],
'subtitle' => '',
'tickerText' => '',
'msgcnt' => 1,
'vibrate' => 1
);
$headers = array(
'Authorization: key=' .self::$API_ACCESS_KEY,
'Content-Type: application/json'
);
$fields = array(
'registration_ids' => array($reg_id),
'data' => $message,
);
self::useCurl($url, $headers, json_encode($fields));
}
// Sends Push's toast notification for Windows Phone 8 users
public function WP($data, $uri) {
$delay = 2;
$msg = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" .
"<wp:Notification xmlns:wp=\"WPNotification\">" .
"<wp:Toast>" .
"<wp:Text1>".htmlspecialchars($data['mtitle'])."</wp:Text1>" .
"<wp:Text2>".htmlspecialchars($data['mdesc'])."</wp:Text2>" .
"</wp:Toast>" .
"</wp:Notification>";
$sendedheaders = array(
'Content-Type: text/xml',
'Accept: application/*',
'X-WindowsPhone-Target: toast',
"X-NotificationClass: $delay"
);
$response = $this->useCurl($uri, $sendedheaders, $msg);
$result = array();
foreach(explode("\n", $response) as $line) {
$tab = explode(":", $line, 2);
if (count($tab) == 2)
$result[$tab[0]] = trim($tab[1]);
}
return $result;
}
// Sends Push notification for iOS users
public function iOS($data, $devicetoken) {
$deviceToken = $devicetoken;
$ctx = stream_context_create();
// ck.pem is your certificate file
stream_context_set_option($ctx, 'ssl', 'local_cert', 'Gtuck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', self::$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);
// Create the payload body
$body['aps'] = array(
'alert' => array(
'title' => $data['mtitle'],
'body' => $data['mdesc'],
),
'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));
// Close the connection to the server
fclose($fp);
if (!$result)
return 'Message not delivered' . PHP_EOL;
else
return 'Message successfully delivered' . PHP_EOL;
}
private function useCurl( $url, $headers, $fields = null) {
// Open connection
$ch = curl_init();
if ($url) {
// Set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Disabling SSL Certificate support temporarly
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($fields) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
}
// Execute post
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
// Close connection
curl_close($ch);
return $result;
}
}
// Curl
}
?>
这是完美的工作。只需使用您的数据库。