未收到Phonegap iOS推送通知
我们管理iOS和Android平台的推送通知。 Android的程序很好,该设备已注册到GCM并收到通知。问题是iOS的APNS,通知没有收到!即使设备已正确注册,APNS也会为设备生成令牌。未收到Phonegap iOS推送通知
以下是用于接收发送消息的推送和PHP代码的Javascript。
var pushNotification;
document.addEventListener("deviceready", onDeviceReadyEvent, false);
function onDeviceReadyEvent(){
pushNotification = window.plugins.pushNotification;
var sk_deviceplatform = device.platform;
sk_deviceplatform = sk_deviceplatform.toLowerCase();
if(sk_deviceplatform === 'android'){
pushNotification.register(successHandler, errorHandler, {"senderID":"XXXXXXXXX","ecb":"onNotificationGCM"});
} else {
pushNotification.register(tokenHandler, errorHandler, {"badge":"true","sound":"true","alert":"true","ecb":"onNotificationAPN"});
}
}
function tokenHandler(result) {
console.log("Token: " + result);
alert("Token: "+ result);
}
function errorHandler(error) {
console.log("Error: " + error);
alert('Error:' + error);
}
function onNotificationAPNS(e){
if(e.alert.title) {
$.mobile.changePage("handle_notifications.html?id="+e.eventid, { transition: "slide"});
}
if(e.sound) {
var skpn_snd = new Media(e.sound);
skpn_snd.play();
}
if (e.badge) {
pushNotification.setApplicationIconBadgeNumber(successHandler, errorHandler, e.badge);
}
if (e.foreground===0){
// when application is not active
}else{
navigator.notification.alert(e.alert.title, null, 'News Notification', 'OK');
}
}
PHP代码发送推送:用于接收推
Javascript代码
/*** PUSH NOTIFICATION FOR IOS VIA APNS ***/
set_time_limit(0);
// charset header for output
header('content-type: text/html; charset: utf-8');
$deviceIds = array(/* get all devices token ids from the database */);
if(count($deviceIds)>0){
// this is where you can customize your notification
$body['aps'] = array(
'badge' => +1,
'alert' => "News Event!",
'sound' => 'default'
);
$payload = json_encode($body);
////////////////////////////////////////////////////////////////////////////////
// start to create connection
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', "XXXX.pem");
stream_context_set_option($ctx, 'ssl', 'passphrase', "XXXXXXX");
foreach ($deviceIds as $item_device) {
// 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" . '<br />');}else{/* service online */}
// Build the binary notification
$msg_notification = chr(0) . pack('n', 32) . pack('H*', $item_device) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg_notification, strlen($msg_notification));
if (!$result) { echo 'Undelivered message count: ' . $item_device . '<br />';}
else { /* notifications are sent */ }
if ($fp){
## check for errors
$apple_error_response = fread($fp, 6); //byte1=always 8, byte2=StatusCode, bytes3,4,5,6=identifier(rowID). Should return nothing if OK.
//NOTE: Make sure you set stream_set_blocking($fp, 0) or else fread will pause your script and wait forever when there is no response to be sent.
if ($apple_error_response) {
$error_response = unpack('Ccommand/Cstatus_code/Nidentifier', $apple_error_response); //unpack the error response (first byte 'command" should always be 8)
if ($error_response['status_code'] == '0') {
$error_response['status_code'] = '0-No errors encountered';
} else if ($error_response['status_code'] == '1') {
$error_response['status_code'] = '1-Processing error';
} else if ($error_response['status_code'] == '2') {
$error_response['status_code'] = '2-Missing device token';
} else if ($error_response['status_code'] == '3') {
$error_response['status_code'] = '3-Missing topic';
} else if ($error_response['status_code'] == '4') {
$error_response['status_code'] = '4-Missing payload';
} else if ($error_response['status_code'] == '5') {
$error_response['status_code'] = '5-Invalid token size';
} else if ($error_response['status_code'] == '6') {
$error_response['status_code'] = '6-Invalid topic size';
} else if ($error_response['status_code'] == '7') {
$error_response['status_code'] = '7-Invalid payload size';
} else if ($error_response['status_code'] == '8') {
$error_response['status_code'] = '8-Invalid token';
} else if ($error_response['status_code'] == '255') {
$error_response['status_code'] = '255-None (unknown)';
} else {
$error_response['status_code'] = $error_response['status_code'].'-Not listed';
}
echo '<br><b>ERROR</b> Response Command:<b>' . $error_response['command'] . '</b> Identifier:<b>' . $error_response['identifier'] . '</b> Status:<b>' . $error_response['status_code'] . '</b><br>';
echo 'Identifier is the rowID (index) in the database that caused the problem, and Apple will disconnect you from server. To continue sending Push Notifications, just start at the next rowID after this Identifier.<br>';
}
fclose($fp);
$_ENV['connection_status'] = 'The connection has been closed by the client' . '<br />';
}
}
set_time_limit(30);
}
当我们发送消息,也没有错误,每一个觉得不错,但未收到推送通知。 问题是,无论是里面的PHP脚本或与Apache Cordova的脚本...
谢谢您的建议...
我们发现了这个问题......我们尝试使用生产连接服务器通过带有开发证书的APNS发送推送。 对于生产,使用下面的连接:
ssl://gateway.push.apple.com:2195
进行开发,使用下面的连接:
ssl://gateway.sandbox.push.apple.com:2195
你忘了安装这两个科尔多瓦插件。
https://github.com/apache/cordova-plugin-device
https://github.com/apache/cordova-plugin-console
因为这两个,你不能检测到您device type
和console
你的输出。
客气;这两个cordova插件已经从config.xml文件安装并设置好了,问题不在于此,因为推送是在Android上接收的。问题出在iOS上。 – 2015-03-04 07:38:47
你需要走出应用的完全接收推 – 2015-03-03 14:31:16
如果我在里面应用程序??如何继续进行警报? – 2015-03-03 14:40:28
onNotificationAPNS程序从未被解雇! – 2015-03-03 15:05:37