未收到 Phonegap iOS 推送通知

Posted

技术标签:

【中文标题】未收到 Phonegap iOS 推送通知【英文标题】:Phonegap iOS push notifications not received 【发布时间】:2015-03-03 14:14:26 【问题描述】:

我们为 iosandroid 平台管理推送通知。 Android的程序很好,设备已注册到GCM并收到通知。问题出在 iOS 的 APNS 上,没有收到通知!甚至设备已正确注册,并且 APNS 为该设备生成了一个令牌。

以下是接收推送的javascript和发送消息的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代码:

/*** 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>&nbsp;&nbsp;&nbsp;Identifier:<b>' . $error_response['identifier'] . '</b>&nbsp;&nbsp;&nbsp;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 脚本...

感谢您的建议...

【问题讨论】:

您需要完全退出应用才能收到推送 如果我在应用程序中?如何继续发出警报? onNotificationAPNS 程序从未被触发! 您在离开应用时收到推送通知了吗?如果是这样,当您在应用程序中时,在此方法中捕获通知“- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo”,然后在 alertview 中显示通知。 推送通知永远不会被触发也不会被接收,即使是php代码也没有返回任何错误! 【参考方案1】:

你忘记安装这两个cordova插件了。

https://github.com/apache/cordova-plugin-device

https://github.com/apache/cordova-plugin-console

因为这两个,你无法检测到你的device typeconsole 你的输出。

【讨论】:

请;这两个 Cordova 插件已经从 config.xml 文件中安装和设置,问题不在于那个,因为推送是在 Android 上接收的。问题出在 iOS 上。【参考方案2】:

我们发现了问题...我们尝试使用生产连接服务器通过带有开发证书的 APNS 发送推送。 对于生产,请使用以下连接:

ssl://gateway.push.apple.com:2195

对于开发,请使用以下连接:

ssl://gateway.sandbox.push.apple.com:2195

【讨论】:

以上是关于未收到 Phonegap iOS 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

phonegap build:没有收到 ios 推送通知

Phonegap 推送通知可能吗?

通过 FCM 发送时未收到推送通知,但在 IOS 上通过 APN 发送时收到

iOS,电话间隙推送插件('通知')未触发

Phonegap 推送通知类未找到错误

当应用程序在Phonegap(cordova)的后台状态下收到推送通知时增加徽章编号,