2014-10-09 109 views
4

我试图在生产环境中发送推送通知,但它不起作用。下面是我正在尝试的代码,它会超时。没有错误,没有例外被抛出。 这有什么问题?APNS PHP推送通知不起作用。获取超时

注意:当我使用沙盒(ENVIRONMENT_SANDBOX)和开发证书文件发送推送通知时,它可以工作。但生产证书文件和ENVIRONMENT_PRODUCTION不起作用。

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

/** 
* @param string $device_token unique device token 
* @param string $custom_message message that needs to be pushed 
* @param string $push_service which service to use (ApnsPHP/UrbanAirship) 
* 
* @return bool 
* @throws ApnsPHP_Exception 
* @throws ApnsPHP_Message_Exception 
* @throws ApnsPHP_Push_Exception 
* @throws Exception 
*/ 
function send_apple_push_notification_test($device_token, $custom_message, $push_service = 'ApnsPHP') { 

    if (empty($device_token) || empty($custom_message)) { 
     return false; 
    } 

    // Report all PHP errors 
    error_reporting(-1); 

    // Adjust to your time-zone 
    date_default_timezone_set('America/New_York'); 

    // Using Autoload all classes are loaded on-demand 
    require_once 'includes/ApnsPHP/Autoload.php'; 

    try { 

     // Instantiate a new ApnsPHP_Push object 
     $push = new ApnsPHP_Push(
      ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION, '/home/xxxxx/public_html/wp-content/themes/yyyyyy/includes/ApnsPHP-pem/AppPushNotify.pem' 
     ); 

     // Set the Root Certificate Authority to verify the Apple remote peer 
     $push->setRootCertificationAuthority('/home/xxxxx/public_html/wp-content/themes/yyyyyy/includes/ApnsPHP-pem/Entrust_Root_Certification_Authority.pem'); 

     // Connect to the Apple Push Notification Service 
     $push->connect(); 

     // Instantiate a new Message with a single recipient 
     $message = new ApnsPHP_Message_Custom((string) $device_token); 

     // Set a custom identifier. To get back this identifier use the getCustomIdentifier() method 
     // over a ApnsPHP_Message object retrieved with the getErrors() message. 
     $message->setCustomIdentifier("xxxyyyzzz-" . time()); 

     // Set a simple welcome text 
     $message->setText((string) $custom_message); 

     // Play the default sound 
     $message->setSound(); 

     // Set the expiry value to 30 seconds 
     $message->setExpiry(60); 

     // Set the "View" button title. 
     $message->setActionLocKey('See the message.'); 

     // Add the message to the message queue 
     $push->add($message); 

     // Send all messages in the message queue 
     $push->send(); 

     // Disconnect from the Apple Push Notification Service 
     $push->disconnect(); 

     // Examine the error message container 
     $aErrorQueue = $push->getErrors(); 
     print_r($aErrorQueue); 

     return true; 

    } catch (Exception $e) { 
     print_r($e->getMessage()); 
    } 

    return false; 
} 

echo "start"; 
send_apple_push_notification_test('20fcc5090eb1f539ac0fddd345r4d0c50e5bca071b742d3d9833f16dd97adeb', 'Test Msg for Production'); 
+0

这看起来像一个很好的问题,但我怀疑有很多PHP开发人员需要经验来回答它。希望我能帮上忙。 – JSON 2014-10-15 16:43:17

+0

这有帮助吗? http://stackoverflow.com/questions/19031862/apnsphp-push-notifications-working-in-development-but-not-in-production – andy 2014-10-16 19:50:57

+0

审阅它。 Thx Andy。 – Subharanjan 2014-10-17 13:09:31

回答

1

要使用生产环境,您的应用程序必须使用您的分发证书进行签名。测试这种方法的唯一方法是提交到App Store并下载App Store版本的应用程序;或使用AdHoc构建。当您的应用程序使用您的开发证书进行签名时,您无法使用生产推送环境。

如果您已经完成了所有这些工作,请确保您没有对从开发环境获得的生产环境使用相同的设备令牌。他们会有所不同。

+0

是的,我完成了两个。使用生产证书并生成带有生产细节的设备令牌。最初,我正在使用设备令牌的开发与生产.pem文件,这是抛出错误。现在,我已经制作了带有制作细节的设备标记和.pem文件,但它没有抛出任何错误/异常,而是在一段时间后超时。 – Subharanjan 2014-10-17 13:07:38

+0

你使用的是一个AdHoc构建?这是使用生产证书进行测试的唯一方法。否则它将无法工作。 – i40west 2014-10-17 17:03:38

+0

我已经尝试开发,adhoc和商店。 :(仍然没有工作,为什么不抛出任何错误??(headbang) – Subharanjan 2014-10-20 07:53:45