2016-06-15 8 views
15

私のアプリで通知を提供するためにFCMを使用しています。すべてうまくいっていましたが、Android Studio(GooglePlayからではありません)を使用してアプリケーションをインストールすると、最初にトークンがnullになることがわかりました。私は私のアプリケーションを閉じて、それを再起動すると、トークンはもはやnullではありません。この問題の原因とその回避方法を教えてください。Android:最初の実行時にFirebaseトークンがnullです

InstanceIDService:MainActivityで

public class InstanceIDService extends FirebaseInstanceIdService { 

    @Override 
    public void onTokenRefresh() { 

     String token = FirebaseInstanceId.getInstance().getToken(); 
     registerToken(token); 
    } 

    private void registerToken(String token) { 

     OkHttpClient client = new OkHttpClient(); 
     RequestBody body = new FormBody.Builder() 
       .add("Token",token) 
       .build(); 

     Request request = new Request.Builder() 
       .url("url_to_registration_script") 
       .post(body) 
       .build(); 

     try { 
      client.newCall(request).execute(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

<?php 
if (isset($_POST["Token"])) { 

     $_uv_Token=$_POST["Token"]; 
     $conn = mysqli_connect("localhost","user","pass","db") or die("Error connecting"); 
     $q="INSERT INTO users (Token) VALUES ('$_uv_Token') " 
      ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';"; 

    mysqli_query($conn,$q) or die(mysqli_error($conn)); 
    mysqli_close($conn); 
} 
?> 

答えて

22

FirebaseMessaging.getInstance().subscribeToTopic("topic"); 
String token = FirebaseInstanceId.getInstance().getToken(); 
Log.d("TOKEN", token); 

最後のログリターンが

登録スクリプトをアプリがインストールされている場合はnullと初めて起動

トークンは、最初のアプリケーション開始時に非同期にフェッチされます。 onTokenRefresh()FirebaseInstanceIdServiceで呼び出されるのを待ってからトークンにアクセスする必要があります。

+0

私の疑問は、毎回これをFirebaseMessaging.getInstance()。subscribeToTopic( "topic");トークンインスタンスを取得する前に – Ruban

6

エミュレータからアプリケーションをアンインストールして再度実行すると、onTokenRefreshedメソッドが再度呼び出されます。あなたがすでに登録して、あなただけのFCMトークン

String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

は(OnCreateの方法で)MyFirebaseMessagingServiceクラス内の任意の場所を上記の行を追加し、ちょうどトーストやrefreshedTokenをログ知りたいされている天気を確認するには

2

私も同じ問題がありました。私はラン・アクティビティのonCreateにトークンを印刷するためにLogステートメントを与えました。アプリをアンインストールすると、トークンを更新するのに時間がかかります。それがなぜnullになるのですか?トークンをリフレッシュさせるのを少し待たなければなりません。

0

私はちょうど同じ問題に落ち、これは私がそれを固定方法です。あなたの活動の方法のonCreate()のどこかのブロックを呼び出してください。あなたのニーズに応じてトークンを変更する必要があるので、トークンを私のParseサーバーに送信したいと思います。

This isサンプルIが続いた。

private void subscribeUserToParse() { 
     String deviceToken = FirebaseInstanceId.getInstance().getToken(); 
     if (TextUtils.isEmpty(deviceToken)) { 
      Intent intent = new Intent(this, MyFirebaseInstanceIDService.class); 
      startService(intent); 
      return; 
     } 

     User user = UserUtil.retrieveUserFromDB(mRealm); 
     String objectId = user.getParseObjectId(); 
     if (!TextUtils.isEmpty(objectId)) { 
      ParseUtils.subscribeWithUsersObjectId(objectId, deviceToken); 
     } 
    } 
0

私は同じ問題に直面していました。私はSOの投稿や他のフォーラムを見て、私のために働く解決策を見つけました。 FCMのドキュメントには、このメソッドを使用してトークンを取得すると記載されています。

String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope); 

FCMのドキュメント最初の方法について説明します。私は、代わりにこのメソッドを使用し、ポストオンラインが(私は謝罪、私はしばらく前にそれを見つけた1覚えていない)が見つかり

String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

以下のように:

戻るデフォルトFirebaseプロジェクトのマスタートークン。

二つ目は次のように説明されている:インスタンスIDによって識別されるアプリケーションの代わりにアクションを実行するエンティティを認証トークンを返し

。 これは、OAuth2トークンに似ていますが、ユーザーの代わりにアプリケーションインスタンスに適用される点が異なります。 たとえば、FirebaseMessaging経由でアプリケーションにメッセージを送信するために使用できるトークンを取得するには、送信者IDを「FCM」に設定します。

私は最初のメソッド呼び出しがトークンを返すのに時間がかかりますが、まだ回答が見つかりませんでした。お役に立てれば。

0

だけ置き換えますと

String token = instanceID.getToken(); 

を:

String token = instanceID.getToken($SENDER_ID, "FCM"); 

、それが動作します。

+0

ここには$ SENDER_IDとは何ですか? –

+0

FCM送信者IDを取得するには: Firebaseコンソールを開きます。 Firebaseプロジェクトを見つけてプロジェクト名をクリックしてください。 は、設定アイコンをクリックして選択し、「プロジェクトの設定」メニュー 選択「をもらえメッセージング」タブとページ –

+0

こんにちはアラーに送信者IDを使用して、私はこのライブを呼び出すことにより、例外の下に取得しています。 java.io.IOException:MAIN_THREAD try { String Token = FirebaseInstanceId.getInstance()。getToken( ""、 "FCM"); int a = 0; a ++; } catch(IOException e){ e.printStackTrace(); } –

0

私は正しいコードを書いた後に直面最大の問題がある: - ないグーグルの最新バージョンは、ビルドのGradleでサービスを果たし、 だから常にダイアログを設定するにfirebaseで示さグーグル・プレイ・サービスのバージョンを使用

+0

これは本当に提示し、問題を解決しますか? – yakobom

+0

はい、私は昨晩以来、私のコードがfirebaseのトークンを表示していなかったので、私は今、私のバージョン番号をgoogle-play-servicesでアップグレードしています。 –

関連する問題