2016-08-16 145 views
1

我们有一个内置PHP的应用程序,它向Android和iOS发送推送通知。我们的问题是,iOS中有一些设备ID似乎完全停止了我们脚本中所有其他iOS推送通知的发送,他们甚至说它们已经没有错误地发送,但之后它会停止循环中的所有通知。iOS应用程序推送通知

如果我们从我们的数据库中删除有问题的设备ID,则发送脚本适用于违规设备后的所有设备。这很奇怪,似乎无法弄清楚为什么。

有没有人有这方面的经验?与发送到不存在的设备ID有关吗?是否会阻止苹果完成特定连接上的脚本?

这里是我们在PHP脚本发送(这除了适用于所有设备从奇流氓设备ID):

$tHost = 'gateway.push.apple.com'; 
    $tPort = 2195; 
    $tCert = "path_to_our_cert.pem"; 
    $tPassphrase = 'passphrase'; 

    $tAlert = $this->title; //assign a title 
    $tBadge = 8; 
    $tSound = 'default'; 
    $tPayload = $this->body_plain; //assign a body 

      // Create the message content that is to be sent to the device. 
    $tBody['aps'] = array ('alert' => $tAlert,'badge' => $tBadge,'sound' => $tSound,); 
    $tBody ['payload'] = $tPayload; 
    $tBody = json_encode ($tBody); 

    $tContext = stream_context_create(); 
    stream_context_set_option ($tContext, 'ssl', 'local_cert', $tCert); 
    stream_context_set_option ($tContext, 'ssl', 'passphrase', $tPassphrase); 
    $tSocket = stream_socket_client ('ssl://'.$tHost.':'.$tPort, $error, $errstr, 30, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $tContext); 

    if (!$tSocket) exit ("APNS Connection Failed: $error $errstr" . PHP_EOL); 
    //Loop through all devices to send 
    foreach($this->device->devices as $item){ 
     if($item->os != "iOS") continue;     
     if(session::getAdministratorStaffSchoolID() != $item->school_id) continue; 
     $tToken = $item->device_id;//assign the device id 
     $tMsg = chr (0) . chr (0) . chr (32) . pack ('H*', $tToken) . pack ('n', strlen ($tBody)) . $tBody; 
      $tResult = fwrite ($tSocket, $tMsg, strlen ($tMsg)); 
    } 

    fclose ($tSocket); 

有没有人有这方面的任何想法?

非常感谢

回答

1

所以,只是一个想法,但你使用传统格式发送通知:

$tMsg = chr (0) . chr (0) . chr (32) . pack ('H*', $tToken) . pack ('n', strlen ($tBody)) . $tBody; 

并且:

错误响应。使用传统格式,如果您发送通知 以某种方式格式错误的数据包(例如,有效负载超过 ),则规定的限制APN将通过切断连接进行响应。它 没有说明为什么拒绝通知。增强型 格式可让提供商使用任意 标识符标记通知。如果出现错误,APN将返回一个包,该包将 将错误代码与标识符相关联。此响应使 供应商能够找到并纠正格式错误的通知。

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Appendixes/LegacyFormat.html

所以也许APNS只是未落你联系?这就是为什么所有剩余的通知实际上没有通过。仔细看看这些有效载荷。也许是转向新格式的好时机。

0

任何错误发生时(无效的设备令牌,畸形有效载荷等)AFAIK的APN将尽快关闭连接。发送Push的代码需要做好准备,从这种情况中恢复,重新连接并重新启动工作。

看看那里的3rdParty库来为你执行这个工作。你将依靠社区工作。

我可以推介Pushy它是用Java编写的。我用它在2个不同的项目中,我可以说它工作正常,它是一个非常活跃的项目(有很多讨论和更新)。

我不知道其中的任何使用PHP,但有可能是一个