PHPでのプッシュメーリング(AndroidおよびIOS)。 最小限のターンキーソリューション

Gcm



プッシュ通知については、メーリングリストがHabréで何度も書かれています。たとえばherehereですが 、アクションへの直接的なガイドはまだありません。 興味がある場合は、猫の下でお願いします。



デバイストークンを登録する



まず最初に、アプリケーション開発者は登録アドレスを示すマ​​ジックを作成しますが、これは次のようになります:htpp://test.ru/secret/android?Token = valueおよびhtpp://test.ru/secret/ios?Token = value 。

最も注目すべきことは、魔法が失敗したか、高品質ではなかったかもしれないが、単に登録された登録に対する保護がないことです。



入力時に、アプリケーションをインストールするときに来るトークンの値を取得します。わずかな遅延がありますが、文字通り10〜20秒です。 トークンは一意ですが、データベースへの書き込み時に一意性を確認することもできます。



Androidのトークンの例:



APA91bFY-3





IOS:



628a3f4a28bb994bb7c9a4143950d240c6d5a1dab8621e9ed61a2109a074f832





このステップでは、デバイスの登録が完了しました。



通知メール



AppleはAPNSサービスとGoogle GCMを使用しています(C2DMは廃止されていると考えてください、これを覚えておいてください)、ドキュメントを読んだ後、お気に入りのビジネス、つまり自転車の建物に移ることができますが、予算は限られており、既製のソリューションを探し始めました。 適合した最も適切なものはApnsPHPGCMMessageで 、5.3 +と5.4+の両方で動作します。



ライブラリを使用する場合、最も重要なことは、APNSの場合は正しい証明書とシークレットフレーズを取得し、GCMを操作するためのシークレットトークンを取得することです。



GCMの通知を送信するための既製のコードの例、トークンはバッチで送信することをお勧めします。大量でもすぐに動作します。サービスは無効なトークンを返します(ユーザーはアプリケーションを削除しました)。すぐに削除する必要があります。



function fnSendAndroid($tokens, $text, $config) { $sender = new CodeMonkeysRu\GCM\Sender($config['androidTokenAuth']); $message = new CodeMonkeysRu\GCM\Message($tokens, array("message" => $text)); try { $response = $sender->send($message); if ($response->getFailureCount() > 0) { $invalidRegistrationIds = $response->getInvalidRegistrationIds(); foreach($invalidRegistrationIds as $invalidRegistrationId) { //Remove $invalidRegistrationId from DB //    APS91bFY-2CYrriS-Dt6y9_dGHhkPVwy7njqFpfgpzGYlDT4l0SQeqKr-lc1OM0a2DQ33S3EKwy2YJn-upKxOT6rNwgk350xUM3g8VX65rkGocOQX80Ta34pwXo6fyn-usoaGUAm4lzsqbCL-gkzHZZXRX39kUQfnA fnDeleteToken($invalidRegistrationId); } } if ($response->getSuccessCount()) { echo '   ' . $response->getSuccessCount() . ' '; } } catch (CodeMonkeysRu\GCM\Exception $e) { switch ($e->getCode()) { case CodeMonkeysRu\GCM\Exception::ILLEGAL_API_KEY: case CodeMonkeysRu\GCM\Exception::AUTHENTICATION_ERROR: case CodeMonkeysRu\GCM\Exception::MALFORMED_REQUEST: case CodeMonkeysRu\GCM\Exception::UNKNOWN_ERROR: case CodeMonkeysRu\GCM\Exception::MALFORMED_RESPONSE: fnLog('    ' . $e->getCode() . ' ' . $e->getMessage()); break; } } }
      
      







APNSが非常に使いやすいと書いているところはどこでも、原則としてこれは真実です。テストと本番用の証明書があることを考慮すると、証明書、秘密のフレーズ、ルート証明書の必要性に注意を払う必要があります。これらはすべて開発者のアカウントで取得されます



ユーザーは特に迷惑なアプリケーションを削除できるため、送信する前に無効なトークンを削除する必要があります。



 function feedback($config) { $feedback = new ApnsPHP_Feedback( ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION, $config['apn']['sert'] ); $feedback->setProviderCertificatePassphrase($config['apn']['passphrase']); $feedback->setRootCertificationAuthority($config['apn']['RootCertificat']); $feedback->connect(); $aDeviceTokens = $feedback->receive(); if (!empty($aDeviceTokens)) { foreach ($aDeviceTokens as $DeviceToken) { /** *  * [timestamp] => 1406040206 * [tokenLength] => 32 * [deviceToken] => 738d005a11bca268e2f1bffbfed88a456e261020b9277883cde14d9c8f47cde0 */ //'DELETE LOW_PRIORITY FROM tokens WHERE token=:token'; fnLog('Feedback -   ' . $DeviceToken[deviceToken]); } } $feedback->disconnect(); }
      
      







次に、送信自体:



 function fnSendIos($tokens, $text, $config) { $push = new ApnsPHP_Push( ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION, $config['apn']['sert']); // Set the Provider Certificate passphrase $push->setProviderCertificatePassphrase($config['apn']['passphrase']); $push->setRootCertificationAuthority($config['apn']['RootCertificat']); $message = new ApnsPHP_Message(); $listTokens = array(); foreach ($tokens as $token) { $message->addRecipient($token); $listTokens[] = $token; } $push->connect(); $message->setText($text); $push->add($message); $push->send(); $push->disconnect(); $aErrorQueue = $push->getErrors(); if (!empty($aErrorQueue)) { fnLog('  ios - ' . print_r($aErrorQueue, true)); if (is_array($aErrorQueue)) { foreach($aErrorQueue as $error) { if (isset($error['ERRORS']) && is_array($error['ERRORS'])) { foreach ($error['ERRORS'] as $m) { if (isset($m['statusMessage']) && $m['statusMessage'] == 'Invalid token') { $arrayID = $m['identifier'] - 1; if (isset($listTokens[$arrayID])) { //DELETE LOW_PRIORITY FROM tokens WHERE token=:token' fnLog('   ' . $listTokens[$arrayID]); } } } } } } } }
      
      







証明書と混同していない場合、配布は成功します。



これが判明したマンションです。



All Articles