2

Я действительно не знаю, где проблема. Я использую библиотеку ApnsPHP для отправки Push-уведомлений. Я также пробовал другие скрипты, но это тоже не работает.Почему iPhone не получает push-уведомление?

Я создаю push-сертификаты с помощью этого учебника (http://code.google.com/p/apns-php/wiki/CertificateCreation), а также помещаем их на веб-сайт разработчика Apple. Я получаю правый токен от iphone, который я положил в sample_push.php

У меня Macbook Pro 13-дюймовый, середина 2010 года с Mac OS Lion.

vojta:~/dev/www/application$ php sample_push.php 
Fri, 13 Apr 2012 16:23:24 +0200 ApnsPHP[6478]: INFO: Trying ssl://gateway.sandbox.push.apple.com:2195... 
Fri, 13 Apr 2012 16:23:32 +0200 ApnsPHP[6478]: INFO: Connected to ssl://gateway.sandbox.push.apple.com:2195. 
Fri, 13 Apr 2012 16:23:32 +0200 ApnsPHP[6478]: INFO: Sending messages queue, run #1: 1 message(s) left in queue. 
Fri, 13 Apr 2012 16:23:32 +0200 ApnsPHP[6478]: STATUS: Sending message ID 1 [custom identifier: Message-Badge-3] (1/3): 109 bytes. 
Fri, 13 Apr 2012 16:23:33 +0200 ApnsPHP[6478]: INFO: Disconnected. 

Если я выполняю «PHP sample_push.php» Я не получите сообщение об ошибке, но и я не получил никакого толчок уведомление на моем iPhone.

Источник sample_push.php:

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

// Instanciate a new ApnsPHP_Push object 
$push = new ApnsPHP_Push(
    ApnsPHP_Abstract::ENVIRONMENT_SANDBOX, 
    'server_certificates_bundle_sandbox.pem' 
); 

// Set the Root Certificate Autority to verify the Apple remote peer 
$push->setRootCertificationAuthority('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('xxxx'); // i put my token here 

// 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("Message-Badge-3"); 

// Set badge icon to "3" 
//$message->setBadge(3); 

// Set a simple welcome text 
$message->setText('Hello APNs-enabled device!'); 

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

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

// 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(); 
if (!empty($aErrorQueue)) { 
    var_dump($aErrorQueue); 
} 

Я также пытался гораздо более простой скрипт (тоже не работает)

// Put your device token here (without spaces): 
$deviceToken = 'xxxxxxxxxxx'; 

// Put your private key's passphrase here: 
$passphrase = 'pushchat'; 

// Put your alert message here: 
$message = 'My first push notification!'; 

//////////////////////////////////////////////////////////////////////////////// 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

// Open a connection to the APNS server 
$fp = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195', $err, 
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

if (!$fp) 
    exit("Failed to connect: $err $errstr" . PHP_EOL); 

echo 'Connected to APNS' . PHP_EOL; 

// Create the payload body 
$body['aps'] = array(
    'alert' => $message, 
    'sound' => 'default' 
    ); 

// Encode the payload as JSON 
$payload = json_encode($body); 

// Build the binary notification 
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 

// Send it to the server 
$result = fwrite($fp, $msg, strlen($msg)); 

if (!$result) 
    echo 'Message not delivered' . PHP_EOL; 
else 
    echo 'Message successfully delivered' . PHP_EOL; 


// Close the connection to the server 
fclose($fp); 

Я действительно не знаю, что делать. Пожалуйста, помогите мне.

ответ

2

Я решил. Это было потому, что XCode подписал приложение с профилем Provision Profile iOS. После того, как я удалю этот профиль, начнут работать push-уведомления.

+1

Я удаляю весь профиль, но все равно не отвечаю. Есть идеи ? –

+0

@SyedOsama, я столкнулся с той же проблемой. Вы нашли какое-либо решение этой проблемы? – jacobian

+0

@ Якобиан, да, я решил эту проблему. 1) Проверьте, что ваш .pem-файл имеет секретный ключ RSA? –

0

При отправке уведомления о нажатии на яблоко он возвращает вам код состояния. Каков код статуса, который вы получаете? Вы получаете 0 обратно?

Status codes 
0 No errors encountered 
1 Processing error 
2 Missing device token 
3 Missing topic 
4 Missing payload 
5 Invalid token size 
6 Invalid topic size 
7 Invalid payload size 
8 Invalid token 
255 None (unknown) 
+0

Благодарим вас за ответ, но скрипты php используют функцию stream_socket_client, которая не дает мне ответа. Что вы используете на стороне сервера? Я действительно искал что-то, что я также могу отлаживать .... –

+0

Пт, 06 Сен. 2013 13:50:26 +0200 ApnsPHP [4632]: INFO: Попытка ssl: //gateway.push.apple.com: 2195. .. Fri, 06 Sep 2013 13:50:27 +0200 ApnsPHP [4632]: INFO: подключен к ssl: //gateway.push.apple.com: 2195. Пт, 06 сен. 2013 13:50:27 +0200 ApnsPHP [4632]: INFO: отправка очереди сообщений, запуск # 1: 1 сообщение (ы) осталось в очереди. Fri, 06 Sep 2013 13:50:27 +0200 ApnsPHP [4632]: STATUS: Идентификатор отправителя 1 [пользовательский идентификатор: unset] (1/3): 55 байт. Пт, 06 Сен. 2013 13:50:28 +0200 ApnsPHP [4632]: INFO: отключено. Я получил это сообщение, и у меня такая же проблема. –