2012-02-07 106 views
1

最后,我发现了沙箱标记,它与生产标记混合在一起,我更新代码,接收来自苹果的错误响应,将沙箱标记发布到苹果时,下一个令牌都失败了......虽然推消息是“$ payload ['aps'] = array('content-available'=> 1);”,苹果会推送消息,但设备不会显示此消息,当我找到错误的,我删除它,并重新测试。Iphone推送通知错误的设备令牌

有苹果推送通知服务的一个有趣的问题: 当我为我的设备后通知发送到苹果的服务器,有一阵子,我的设备将收到通知。 但是,如果我第一次发布错误devicetoken的通知,然后将正确的通知发布到我的设备,我的设备将无响应,就像推送通知被苹果吃掉一样?

这有什么问题?

我使用PHP代码的推送服务,这里是最重要的部分:

$payload['aps'] = array('content-available' => 1); 
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { 
     foreach ($line as $deviceToken) { 
      break; 
     } 

     print_r($deviceToken); 
     $apnsMessage = chr(1) . $time . $time . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload; 
     $ret = fwrite($apns, $apnsMessage); 
     if ($ret !== strlen($apnsMessage)) { 
      echo "push error"; 
     } 

     ob_flush(); 
     flush(); 

     $read = array($apns); 
     $null = null; 
     $changedStreams = stream_select($read, $null, $null, 0, 100000);//wait for 0.1s 

     if ($changedStreams === false) {  
      echo "Error: Unabled to wait for a stream availability"; 
     } elseif ($changedStreams > 0) { 
      print "can't receive any notification behind this token"; 

      $responseBinary = fread($apns, 6); 
      if ($responseBinary !== false || strlen($responseBinary) == 6) { 

       $response = unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary); 
       print_r($response); 
      } 
     } else { 
      //update the success push status in database 
     } 

     print "<br>"; 
    } 

我不知道什么是错,而我也在另一个PHP添加反馈服务,并获得无错令牌来自苹果,因为我的数据库中有很多devicetoken,所以我找不到哪一个是错误的。

有人帮助我,原谅我的英语不好

+0

是“错误deviceToken”有一个正确的格式?苹果如何“长期”“禁止”你? (几个通知或1分钟?) – 2012-02-07 03:29:06

+0

错误devicetoken是我测试应用程序时的沙箱令牌,当我向沙箱发送沙箱令牌时,下一个令牌全部失败。 – carl 2012-02-07 09:11:38

+0

如果以下所有令牌都失败了,那么如何获得“unbanned”?以便您可以再次向Apple发送令牌(错误或正确)? – 2012-02-08 04:55:29

回答

0

假设你$apns以这种方式

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2,STREAM_CLIENT_CONNECT, $streamContext); 

你应该检查$ Errorstring,则找出错误来实现。

或试图关闭套接字每封邮件,看看是否有任何区别

fwrite($apns, $apnsMessage); 
socket_close($apns); 
fclose($apns); 
+0

我也有这些,我只是发布我的代码部分。连接和其他都可以 – carl 2012-02-09 09:58:53