php - 通过 PHP 脚本发送推送通知

标签 php ios objective-c apple-push-notifications

我已经正确设置了我的配置文件和应用程序来接收推送通知,但我在使用PHP 发送通知时遇到了困难。我正在使用下面概述的脚本,但收到此警告:

Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Connection refused).

我对这个问题做了很多研究,但不知道如何解决这个问题。任何想法都会非常有帮助。谢谢大家!

<?php

$message=$_POST['message'];

if ($message)
{

    $device_token = "TOKEN_HERE";

    $payload = '{
    "aps": {
         "badge": 1,
         "alert": "Hello world!",
         "sound": "bingbong.aiff"
    }
}';

$ctx = stream_context_create();
stream_context_set_option ($ctx, 'ssl', 'local_cert', 'PEM_FILE_HERE' );
stream_context_set_option ($ctx, 'ssl', 'passphrase', 'PASSPHRASE_HERE' );
$fp = stream_socket_client ('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 
60, STREAM_CLIENT_CONNECT, $ctx);

if (!$fp) {
print "Failed";
return;
}
else {
print "Sent";
}

$devArray = array();
$devArray[] = $deviceToken;

foreach($devArray as $deviceToken) {
$msg = chr(0) . pack("n",32) . pack ('H*', str_replace(' ', '', $deviceToken)) . pack 
("n",strlen($payload)) . $payload . "n";
print "Sending Message :" . $payload . "n";
fwrite($fp,$msg);
}
fclose($fp);

}
?>
<form action="" method="post">
<input type = "text" name = "message">
<input type = "submit" value = "Send Notification">
</form>

最佳答案

这是一个工作脚本

 class Send_Push_Apple
 {
     public $apnsCert = 'PushProductionCertificatesWithKey.pem';


 function __construct()
  {
 /*
  * Nothing to fo Here
  *   
  * */ 

  }
static function send_push($data=array())
  {

    $payload['aps'] = array('alert' => array('body' => $data['message'])); 
    $payload['aps']['badge'] = 1; 
    $payload['aps']['sound'] = 'default'; 
    $payload = json_encode($payload); 
    //For  development 
    //$deviceToken = '4e6ec248724ef635e#############################';  
    $deviceToken = $data['device_token'];

    //$apnsCert = 'DistPEMCertificate-05-05.pem'; 
    $streamContext = stream_context_create(); 
    //stream_context_set_option($streamContext, 'ssl', 'local_cert',$apnsCert); 
    $apnsCert = 'PushProductionCertificatesWithKey.pem';
    stream_context_set_option($streamContext, 'ssl', 'local_cert',$apnsCert); 

    //ssl://gateway.sandbox.push.apple.com:2195
    $apns = stream_socket_client('ssl://gateway.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext); 

    if (!$apns) {
        print "Failed to connect $error $errorString\n";
        return;
    } else {
        print "Connection OK";
    }

    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload; 


    if(fwrite($apns, $apnsMessage))
    {
        echo "Message send Successfully";
    }
    else
    {
        echo "Message Sending Fail";
    }
    fclose($apns);

    }
}

这里需要考虑 3 个 IMP 事项

1) 必须在服务器上启用端口 2195

2) 特定应用的证书

3) 需要设备 token

关于php - 通过 PHP 脚本发送推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17140427/

相关文章:

ios设置cornerRadius与尾随空格,圆角半径不起作用

objective-c - 为什么可变对象不需要双指针?

javascript - 如何在 chrome/FF/IE PHP 上强制打开 PDF

javascript - 使用 ajax 或 jquery 在 html 索引页面中加载 php 查询文件

javascript - 获取 php 样式表输出并存储为变量

ios - iOS 的 Places API 未启用

javascript - 隐藏和显示 div 单击 a

Xcode 5.1.1 上的 ios 7.0 模拟器

ios - iOS客户端如何获取Youtube API中的Client Secret?

iphone - 从 NSArray 执行 block ?