将ios(推送通知)和android(GCM)API(webservice)结合起来进行通知


Combine ios (Push notification) and android (GCM) API (webservice) for notification

我是一名安卓开发人员,所以我对PHP了解不多。

我们正在Android和IOS中开发试卷应用程序。并创建通知功能,其工作非常完美。但问题是IOS使用推送通知,android使用GCM。这两个都使用不同的api。

我的问题是如何将这两个api结合起来。我想把这两个api(webservice)结合在一起。当管理员上传文件时,所有用户都会收到通知,通知是否是android或IOS设备。

我该怎么办?帮助非常感谢提前感谢。我正在使用链接

这是我的努力

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);
?>

这可能吗??如果有任何建议或其他方法可以完成这项工作,请告诉我。

以下代码由我使用,您可以根据自己的方式更改

根据TO设备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++;
            }

iosscs_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();
            }
    }

对于安卓

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;
              }
       }

我认为这里没有问题。您需要设计一种推送令牌存储。该存储的每个记录都将包含有关用户设备的信息:push_token(如果是android设备,则为gcm_registration_id)、平台类型(iOS/android),如果您有一些帐户系统,则可能为user_id。当您获取该表时,您将根据平台属性的值调用相关函数(将它们命名为send_ios_push($token, $msg)send_android_push($reg_id, $msg))。

    //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;
}

我在github中找到了解决方案它适用于AndroidIOSwindows
感谢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';
}
?>

通知.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 
}
?>

这是完美的工作。只需使用数据库即可。