结合ios(推送通知)和android(GCM)API(webservice)进行通知 [英] Combine ios (Push notification) and android (GCM) API (webservice) for notification

查看:72
本文介绍了结合ios(推送通知)和android(GCM)API(webservice)进行通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一名安卓开发者,所以我对 PHP 了解不多.

I am a android developer so i don't know that much about PHP.

我们正在 Android 和 IOS 中开发试卷应用.并创建通知功能,它完美地工作.但问题是 IOS 使用推送通知,而 android 使用 GCM.这两个使用不同的api.

we are developing exam paper app in Android and IOS. and create notification functionality its works perfectly. But problem is IOS use Push notification and android use GCM. And these two are use different api.

我的问题是如何结合这两个api.我想将这两个 api(webservice)合二为一.当管理员上传文件时,所有用户都会使用通知天气收到通知,它是 android 或 IOS 设备.

My question is how to combine these two api. I want to combine this two api (webservice) in one. When admin upload paper then all user get notify using notification weather it is android or IOS device.

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

What should i do? Help much appreciate thanks in advance. i am using this 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);
?>

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

Is it possible or not?? if any suggestion or other way to get this done please tell me.

推荐答案

我在 中找到了解决方案github它适用于 AndroidIOSwindows.
感谢 joashp.

I Found the solution in github And it's for Android , IOS and windows.
Thanks to 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 

}
?>

它的工作完美.只需使用您的数据库.

And it's work perfect. just use your database.

这篇关于结合ios(推送通知)和android(GCM)API(webservice)进行通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆