2016-04-04 17 views
0

私は本当にこれで苦労しています。このコードは私によって作られたものではありませんでしたが、私はそれを変更して作品のようにしました。私の目標は、アプリを使用するすべての端末にプッシュ通知を送信できるようにすることです。私はiosとandriodがプログラムされているのでベストを尽くすつもりです。私は整理して、私に与えられたコードを変更して、ただ1つのデバイスに通知を送信するようにしました。複数のデバイスへのiosとAndroidのプッシュ通知

これは、コード

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

?> 

私は$レジに$ deviceTokenにiOSデバイストークンとAndroidデバイストークンを追加し、それが携帯電話に送信されますです。私が変えた唯一の部分は、動作しなかったAppleプッシュ通知部分です。私がそれを変更する前に、リンゴプッシュ通知は$ dev変数を使用し、アンドロイドは$ regiを使用していました。今私は、デバイスのトークンがサーバーに送信されていることを知っているので、私の推測では変数に格納されていないということです。あなたが見ることができる何か問題があります、そして、それらが空であるかどうか見るためにそれらをプリントアウトする方法はありますか?

おかげ

答えて

1

私は、しばらく前にこれを考え出したと私は苦労している他の誰のために共有することになりけれども。また、私は、ユーザーが拒否した場合ことがわかっ

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{ 
#ifdef DEBUG 
    // Update the database with our development device token 
    NSLog(@"IN DEVELOPMENT MODE!!!!!!!"); 
#else 
    // Update the database with our production device token 
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    NSLog(@"content---%@", token); 
    kSetValueForKey(@"device_token", token); 
    [self updateDeviceToken:token]; 

#endif 
} 

<?php 
    include 'conn.php'; 

    if ($_REQUEST['key'] == 'notification') { 

     $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); 
     include 'notifications.php'; 

    } 
    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 if (strlen ($dev) > 25) { 
        $ios[] = $dev; 
       } 
      } 
     } 

     $deviceToken=$_REQUEST['device']; 
     $json=json_decode($deviceToken); 

     //google Push notification 

     // API access key from Google API's Console 
     define('API_ACCESS_KEY', 'AIzaSyCMysH7TySEgdbvRoCLoZk8uFF1x_A3uxg'); 

     //build the message 
     $fields = array 
     (
      'registration_ids' => $regis, 
      'data'    => array('message'=> $message,'count'=>1) 
     ); 

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

     //Apple Push notification 

     // Certificate password: 
     $passphrase = '123456789'; 

     $ctx = stream_context_create(); 
     stream_context_set_option($ctx, 'ssl', 'local_cert', 'ckStudioeast.pem'); 
     stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

     // Open a connection to the APNS server 
     $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); 

     // Create the payload body 
     $body['aps'] = array(
        'alert' => $message, 
        'sound' => 'default', 
        'badge' => '1' 
        ); 

     // Encode the payload as JSON 
     $payload = json_encode($body); 

     // Loop though device tokens 
     foreach($ios as $dev) { 
      if($dev!=''){ 
       // Build the binary notification 
       $msg = chr(0) . pack('n', 32) . pack('H*', $dev) . pack('n', strlen($payload)) . $payload; 
       //Send it to the server 
       $result = fwrite($fp, $msg, strlen($msg)); 
      } 
     } 

     if (!$result) 
      echo 'Message not delivered' . PHP_EOL; 

     // Close the connection to the server 
     fclose($fp); 

     include 'index.php'; 
    } 

?> 

問題はアプリが現像装置は、トークンので、私はこれにXcodeで私のdidRegisterForRemoteNotificationsWithDeviceToken機能を更新したデータベースを送っていたことと思われました0のデバイストークンを自分のデータベースに送信するというプッシュ通知を許可するように要求します。使用されている場合、通知の送信を停止します。だから私は私のPHPファイル内のデバイスのトークンをソートしている私はすべてのトークンを無視するロジックを追加したちょうど0

私はちょうど私が私の$に追加する前に、

if(strlen ($dev) > 65) { 
    $regis[] = $row['device_token']; 
} else { 
    $ios[] = $dev; 
} 

新コード::私は古いコードではありません

た以前のようにIOS配列、あなたはデバイスTOKEを送信する場合私が見つけた主な問題の

if(strlen ($dev) > 65) { 
    $regis[] = $row['device_token']; 
} else if (strlen ($dev) > 25) { 
    $ios[] = $dev; 
} 

一つは、 nを有効な本番デバイストークンではないリンゴ生産プッシュ通知サーバーに送信すると、通知はどのデバイスにも送信されません。これが私が働いていなかった理由と私は余分なロジックを私のPHPコードとObjective-cコードに加えて無効なデバイストークンを全て取り除いています。

これは人々に役立つことを望みます。

0
while ($row = mysql_fetch_array($result1))  //fetch datafrom loop 
{ 
$dev = $row["device_token"]; // your devide token 

if(strlen ($dev) > 65) { // for android 
    $regis[] = $row['device_token'];  
} 
else 
{ 
    $ios[] = $row['device_token'];  // for ios 
} 

} 

foreach($regis as $dev1) { 

$id=$dev1; 

$url = 'https://fcm.googleapis.com/fcm/send'; 

$fields = array (

     'to' => $id, 

     'notification' => array (

     "body" => $mess, 

"icon" =>"icon", 

"sound"=> "" 

     ) 

); 

$fields = json_encode ($fields); 

$headers = array (

     'Authorization: key=' . "---your key---", 

     '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_POSTFIELDS, $fields); 

$result = curl_exec ($ch); 


} 



foreach($ios as $dev) { 

      if($dev!='') 

      { 


$deviceToken=$dev; 



$passphrase = ''; 


// Put your alert message here: 
$message = $mess; 

$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.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

// Create the payload body 

$body['aps'] = array(

    'alert' => array(

'body' => $message, 


    ), 

    'badge' => +1, 

'sound' => 'default', 

'content-available' => '1', 

    ); 
$payload = json_encode($body); 

$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 
$result = fwrite($fp, $msg, strlen($msg)); 

      } 

} 

if (!$result) 

{ 

?> 

<script> 

alert("Push notification is successfully sent"); 

</script> 

<?php 

} 

else 

{ 

?> 
<script> 

alert("Mesaage is successfully sent"); 

</script> 

<?php 

} 

curl_close ($ch); 

fclose($fp); 

} 
関連する問題