Firebase Cloud Messaging令牌未生成

时间:2017-10-30 11:07:12

标签: android push-notification firebase-cloud-messaging

AndroidStudio中的FCM设置 - 工具 - Cloud Messaging中的Firebase Assistant设置为Successfully。因此,设置已更正,但未生成令牌。通过MainActivity中的令牌显示在logcat和Config Class中不生成.token,但其显示为null。运行问题继续后卸载的应用程序。我也尝试不同的模拟器,但没有任何解决方案。

MyFirebaseInstanceIDService.java

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";
    @Override
    public void onTokenRefresh() {

        String newToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + newToken);
        Config.TOKEN = newToken;
    }
}

的AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name=".MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

</application>

的build.gradle(项目级)

  dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.google.gms:google-services:3.0.0'
    }

的build.gradle(应用级)

dependencies {

    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.firebase:firebase-messaging:10.0.1'
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.okhttp:okhttp:2.0.0'
}

apply plugin: 'com.google.gms.google-services'

5 个答案:

答案 0 :(得分:3)

在应用中的任何时候,如果需要,您可以使用此代码获取Firebase实例ID令牌:

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

只有在令牌更改时才会执行FirebaseInstanceIdService。 The Firebase documentation州:

  

除以下情况外,实例ID是稳定的:

     
      
  • 应用删除实例ID
  •   
  • 应用程序已在新设备上恢复
  •   
  • 用户卸载/重新安装应用
  •   
  • 用户清除应用数据
  •   

如果您的应用中没有发生这些事情,那么FirebaseInstanceIdService只会在您的应用首次安装在设备上时运行。

答案 1 :(得分:0)

每次运行应用时都不会调用方法onTokenRefresh()。只有在生成新令牌时才会调用它。所以它很少被称为。

但它会在第一次运行中被调用。因此,在方法onTokenRefresh()中,您应该将刷新后的令牌保存在共享首选项中。

因此,当您需要firebase令牌时,您应该从共享首选项中获取它,该首选项始终可用。

现在,您可以通过清除应用数据或卸载并重新安装应用来修复此问题,以便生成新令牌。

答案 2 :(得分:0)

 <service android:name=".MyFirebaseMsgService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

将此添加到清单

答案 3 :(得分:0)

在清单Firebase服务中添加<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>

<service
                android:name=".common.firebase.FirebaseMessagingService"
                android:exported="false">
                <intent-filter>
                    <action android:name="com.google.firebase.MESSAGING_EVENT" />
                    <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
                </intent-filter>
            </service>

答案 4 :(得分:0)

对于高于 18.0.0 的 firebase 版本,FirebaseInstanceId.getInstance().getToken(); 已弃用。

现在我们必须使用以下方法以编程方式获取令牌。

 FirebaseMessaging.getInstance().token.addOnCompleteListener {
                    if (!it.isSuccessful) {
                        return@addOnCompleteListener
                    }
                    
                    val token = it.result
                }