Отправить push-уведомление группе - PullRequest
0 голосов
/ 23 декабря 2011

Я не уверен, как отправить push-уведомление на несколько токенов.С моим сценарием кажется, что отправка push-уведомления только одному ... согласно Apple, было бы лучше иметь одно открытое соединение, держать его открытым и отправлять сообщения, когда это необходимо.Не уверен, как это сделать на моем php-сервере ...

$payload['aps'] = array('alert' => "New Cave report for ".$caveName,'badge' => 1, 'sound' => 'default');
$payload['condition'] = array('conditionID' => $ccID, 'caveName' => $caveName);
$payload = json_encode($payload);

// Connection Part
$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsPort = 2195;
$apnsCert = '/var/www/web543/files/apns-dev.pem';

if (!file_exists($apnsCert) )
{
    echo "Certification file not found!";
} else
{
    $streamContext = stream_context_create();
    stream_context_set_option($streamContext,'ssl','local_cert',$apnsCert);

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

    if ( !$apns )
    {
        echo "Connection Failed!".$errorString;
    } else
    {
        $db->query("SELECT DISTINCT token FROM notifications WHERE userID != '{$userID}'");
        if ($db->num_rows()>0) 
        {
            while ($db->next_record())
            {
                $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $db->f('token'))) . chr(0) . chr(strlen($payload)) . $payload;
                if ( fwrite($apns, $apnsMessage) === FALSE )
                {
                    echo "Can not write";
                }
            }
        }
    }

    fclose($apns);
}

некоторые выходные данные $ apnsMessage

Token: 5a984922e19eab54f78fd54e24d5b02a3d30ccdbbeee34aadbdacaa687ee1261 Message: Z˜I"áž«T÷ÕN$Õ°*=0ÌÛ¾î4ªÛÚʦ‡îa†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}
Token: c607acc70bd4885bf56f3b4827523023bf93a1d644626768ab0304bb3b4414dc Message: ƬÇÔˆ[õo;H'R0#¿“¡ÖDbgh«»;D܆{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}
Token: 785ec3128972bd3d4c3e6fa1eeead97b73b0696e2361339a2467e6ba775b83ea Message: x^Ér½=L>o¡îêÙ{s°in#a3š$gæºw[ƒê†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}
Token: c592487e3c71e921d0b7a825b66ed5e58070fee709131535ac391f14febbcfdc Message: Å’H~Token: 061bc20ba3a0fc17c689e052b42b5789f502a52d43180ea114e3212077045315 Message: £ üƉàR´+W‰õ¥-C¡ã! wS†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}
Token: 26fb66fef67a122ca456f106363115285d4d7156e7c8ab6e51bd5bfa9bab2d03 Message: &ûfþöz,¤Vñ61(]MqVçÈ«nQ½[ú›«-†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}

Ответы [ 3 ]

1 голос
/ 28 декабря 2011

Хорошо. Я нашел проблему.

При компиляции в качестве отладки он будет отправляться только на первое устройство при использовании сертификации DEV. Если я использую развертывание как Ad-Hoc, я должен использовать Prod Servers и Prod Certificates.

Теперь все работает.

0 голосов
/ 23 декабря 2011

Да, вы не должны делать и разрывать сокетное соединение каждый раз, когда вам нужно отправить пуш. Установив соединение через сокет, вы можете написать любое количество push-сообщений на любое количество устройств. Какую именно проблему вы наблюдаете? Ваше сокетное соединение прерывается?

Посмотрите на этот вопрос, если вам нужна дополнительная помощь: Как отправить Push-уведомление на несколько устройств?

0 голосов
/ 23 декабря 2011

Я думаю, что вы должны запускать этот скрипт в цикле в соответствии с количеством токенов.

Значит сначала получить массив токенов, а затем в соответствии с количеством сделать цикл.Затем возьмите один токен устройства из индекса 0 и запустите этот скрипт.Затем выберите другой токен по индексу 1 и снова запустите этот сценарий.

Чтобы отправить push-уведомление на несколько устройств, вы каждый раз подключаетесь к серверу Apple, закрываете соединение, снова открываете и отправляете.1005 *

...