GCMサービスを使用して、サーバーから情報をプッシュしています。ブラウザキーを使用すると、次のような成功メッセージが表示されます。{"multicast_id":4849013215736515938、 "success":1、 "failure":0、 "canonical_ids":0、 "results":[{"message_id" : "0:1348742583011905%2adac3a0f9fd7ecd"}]}が、デバイスで通知を受け取らなかった。サーバーキーを使用すると、nauthorized Error 401と表示されます。私のコードは次のとおりです。
$apiKey = "xxxxx";
$registrationIDs = array("xxxxxxxx");
$message = "testing Process";
$url = 'https://Android.googleapis.com/gcm/send';
$fields = array(
'registration_ids' => $registrationIDs,
'data' => array("message"=>$message),
);
$headers = array(
'Authorization: key=' . $apiKey,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($fields) );
$result = curl_exec($ch);
if(curl_errno($ch)){ echo 'Curl error: ' . curl_error($ch); }
curl_close($ch);
echo $result;
この問題について私を助けてください。前もって感謝します。
サーバーのIPをホワイトリストに登録しましたか?これは、ブラウザキーにはデフォルトでは必要ありませんが、サーバーキーには必要です。
こちらで確認できます:
https://code.google.com/apis/console/#project:[YOUR PROJECT NUMBER]:access
別の回答では、すでにIPアドレスのホワイトリスト登録が提案されていますが、これは一種の明らかなようです。私にとってそれを修正したのは、私のIPv6アドレスをホワイトリストに登録することでした。それが鍵でした!これが他の人の助けになることを願っています。
私はこのスレッドですべてを試しましたが、それでも運はありません。
そこで、有効なAPI(APIと認証-> API、有効なAPI)を確認し、有効になったことに気付きましたGoogle Cloud Messaging for Chrome
not Google Cloud Messaging for Android
。後者を有効にするとすぐに、すぐに機能しました。
適切なAPIが有効になっていることを再確認してください!
多くの人が書いているように、サーバーIPV4とIPV6をホワイトリストに登録する必要があります。 IPV4のみが必要な場合は、これをcurl php initに追加します。
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
私は
$apiKey = "xxxxx"
Androidクライアントアプリに配置したプロジェクト番号(プロジェクトID)のように、サーバーで間違っていましたが、Googleクラウドコンソールからappkeyにする必要があります(アクティブにする場所Google Cloud Android向けメッセージング)
ProjectXXX -> APIs & auth -> Registered Apps -> Web App -> Server Key
-> Api key
私の場合、プラットフォームにデフォルトのプロジェクト「Service Account-project」がありました:「Web」ですが、Hosted Application section
だけがあり、APIキーについての証拠はありませんでした。しかし、4つのセクションを含む「マイアプリ」と呼ばれる新しいWeb Apps
を作成すると、OAuth 2.0 Client ID
、Certificate
、サーバーキー、Browser Key
が最終的に見つかりますAPIキー;-)
それを知らない私だけかもしれませんが、この答えは誰かにも役立つと信じています
オプションを使用してブラウザキーを使用し、新しいブラウザキーを作成し、コードでこのキーを使用します。 https://code.google.com/apis/console/?pli=1#project:42053154xxxx:access
私にとって問題は、APIを有効にする必要があることでした。 APIをセットアップするだけでは十分ではありません。 AndroidのGoogle Cloud Messagingが、APIs-> enabled APIsの有効なAPIに表示されることを確認します。
そうでない場合は、APISの[APIライブラリ]タブをクリックして有効にします。 \
間違いない場合は、APIKEYをbase64でエンコードする必要があります。
また、var_dump($ results)を試して、情報が得られるかどうかを確認してください。
デフォルトとは異なるプロジェクトが必要です。プロジェクトを作成してからキーを作成します。デフォルトのプロジェクトを使用しないでください。
コードを見ると、これはオンラインのどこかに投稿されたphp-gcmサンプルからのものであることがわかります。これは非常に素晴らしいことであり、ブラウザキーとホワイトリストに登録されたIP(IPV6またはbas64 apikeyではない)の両方が機能することを保証できます。
メッセージが表示されない理由は、'data' => array("message"=>$message)
を使用している送信通知関数が「メッセージ」のキーをターゲットにしているためです。これは、保留中のインテントに渡す必要があります。
notification.setLatestEventInfo(context, title, message, intent);
これにより、インテントはこのキーの下に含まれるメッセージを読み取ることができます。メッセージ自体は、以下に貼り付けられたGCMIntentServiceメソッドから取得されます。
@Override
protected void onMessage(Context context, Intent intent) {
Log.i(TAG, "Received message");
String message = intent.getExtras().getString("message");
Log.d(TAG, "The intent contains: " + intent.getExtras());
displayMessage(context, message);
// notifies user
generateNotification(context, message);
}
問題は次のとおりです。1台のステージングサーバーともう1台の運用サーバーの2台のサーバーを使用していました。 Digital Oceanを使用してホストされたステージングサーバーでは、サーバーアプリケーションのキー許可されたIPアドレスにinetアドレスを入力しましたが、正常に機能しました。
ただし、運用サーバーからinetアドレスに変更すると失敗しました。代わりに、これが機能するためにinet6 addr:/ 64 Scope:Globalを使用する必要がありました。同じ問題が発生した場合に値を取得するには、単にifconfigと入力して、上記のエントリを見つけます。許可されたIPアドレスにその値を入力すると、正常に機能します。
この問題が発生した場合、GCM(Googleクラウドメッセージング)を使用していました。ただし、2016年9月以降、GCMのサーバーキーは機能しなくなります。FCM(firebaseクラウドメッセージング)を使用する必要があります。 [設定]パネルの[クラウドメッセージング]タブを使用して、Firebase Consoleでのみ新しいサーバーキーを作成します。 firebaseコンソールconsole.firebase.google.comにアクセスし(まだ使用していませんでした)、プロジェクトのインポートを求められました。突然、この新しいサーバーキーがGCMコンソールに戻りました。 GCMを使用している場合は、そこにリストされている「レガシーキー」を使用します。