FirebaseInstanceIdService getToken返回null [英] FirebaseInstanceIdService getToken returning null

查看:55
本文介绍了FirebaseInstanceIdService getToken返回null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将FCM通知添加到我的应用中,但是出于某种原因

Im trying to add FCM notifications to my app, but for some reason

FirebaseInstanceId.getInstance().getToken();

返回空值.

由于我没有获得任何堆栈跟踪信息,所以我最好的猜测是FirebaseInstanceIdService无法正常工作

Since im not getting any stacktrace my best guess is that FirebaseInstanceIdService is not working

  • Google Play服务版本:9.6.1
  • Firebase消息传递版本:9.6.1
  • 从FirebaseConsole添加了json配置文件(尝试了一个文件,其中包含2个客户端,其中一个用于调试,一个用于发布版本),每个文件分别用于两个版本

Iw在模块gradle脚本的底部应用了google services插件 项目根目录gradle脚本中包含的google服务

Iw applied google services plugin at the bottom of my modules gradle script Included google services in projects root gradle script

从正式文档中创建了2个服务:

Created 2 services from the officail docs:

public class MyFirebaseInsanceIDService  extends FirebaseInstanceIdService {

private static final String TAG = "MyFirebaseIIDService";

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    PreferencesHelper.putSharedPreferencesString(Constants.User.PUSH_NOTIFICATIONS, refreshedToken);

    Log.e("TOKEN", "Token: " + FirebaseInstanceId.getInstance().getToken());
}

}

清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.fc.test">

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

<application
    android:name="fctest"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="${appName}${appNameSuffix}"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:node="replace">

    <service
        android:name="com.fc.test.MyFirebaseInsanceIDService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

    <service
        android:name="com.fc.test.MyFirebaseMessagingService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <activity
        android:name="com.fc.test.view.splash.Splash"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.CenterAnimation">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

</application>

root Gradle:

root Gradle:

buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        //noinspection GradleDynamicVersion
        classpath 'io.fabric.tools:gradle:1.+'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "http://dl.bintray.com/drummer-aidan/maven" }
        maven { url "https://maven.fabric.io/public" }
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://jitpack.io" }
    }
}

ext {
    buildToolsVersion = '24.0.1'
    compileSdkVersion = 24
    minSdkVersion = 15
    targetSdkVersion = 24
    supportLibraryVersion = '24.2.1'
}

和模块Gradle的主要部分

and the main part of the modules Gradle

    dependencies {
    final PLAY_SERVICES_VERSION = '9.6.1'
    final SUPPORT_LIBRARY_VERSION = '24.2.1'
    final RETROFIT_VERSION = '2.1.0'
    final DAGGER_VERSION = '2.5'
    final DEXMAKER_VERSION = '1.4'
    final HAMCREST_VERSION = '1.3'
    final ESPRESSO_VERSION = '2.2.1'
    final RUNNER_VERSION = '0.4'
    final BUTTERKNIFE_VERSION = '8.1.0'
    def daggerCompiler = "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
    def jUnit = "junit:junit:4.12"
    def mockito = "org.mockito:mockito-core:1.10.19"
    // App Dependencies
    compile "com.google.android.gms:play-services-gcm:$PLAY_SERVICES_VERSION"
    compile "com.google.firebase:firebase-messaging:$PLAY_SERVICES_VERSION"
    compile "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:recyclerview-v7:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:cardview-v7:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:support-annotations:$SUPPORT_LIBRARY_VERSION"
    compile "com.android.support:support-v4:$SUPPORT_LIBRARY_VERSION"
    compile "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION"
    compile "com.squareup.retrofit2:converter-gson:$RETROFIT_VERSION"
    compile "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_VERSION"
    compile "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION"
    compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
        transitive = true;
    }
}
apply plugin: 'com.google.gms.google-services

  • 请注意,我在根应用程序标记中使用了tools:node="replace".
  • 是否可能没有将FirebaseInstanceIdService添加到清单中,因为它与我的FirebaseInstanceService具有相同的意图过滤器?

    • Note that im using tools:node="replace" in my root application tag. Is it possible that FirebaseInstanceIdService is not added to the manifest since it has the same intent filter as mine FirebaseInstanceService and thus not being called?
    • 所以我的问题是官方文档或我的实现中是否存在某些问题,应导致Instance令牌为空?

      So my question here would be is there something wrong it the official docs or in my implementation that should cause the Instance token to be null?

      推荐答案

      在通过FCM的旧实现进行挖掘并生成清单后,我现在可以说清单合并是问题所在.

      After digging up thru old implementations of FCM and generated manifests, I can now say that manifest merger is the problem.

      此问题的解决方案是将这些类手动添加到应用清单中

      Solution for this problem is adding these classes to the apps manifest manualy

       <activity
              android:name="com.google.android.gms.common.api.GoogleApiActivity"
              android:exported="false"
              android:theme="@android:style/Theme.Translucent.NoTitleBar" />
      
          <meta-data
              android:name="com.google.android.gms.version"
              android:value="@integer/google_play_services_version" />
      
          <service
              android:name="com.google.firebase.messaging.FirebaseMessagingService"
              android:exported="true" >
              <intent-filter android:priority="-500" >
                  <action android:name="com.google.firebase.MESSAGING_EVENT" />
              </intent-filter>
          </service>
      
          <receiver
              android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
              android:exported="true"
              android:permission="com.google.android.c2dm.permission.SEND" >
              <intent-filter>
                  <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                  <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
      
                  <category android:name="com.fc.debug" />
              </intent-filter>
          </receiver>
      
      
          <receiver
              android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
              android:exported="false" />
          <!--
      
          -->
          <service
              android:name="com.google.firebase.iid.FirebaseInstanceIdService"
              android:exported="true" >
              <intent-filter android:priority="-500" >
                  <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
              </intent-filter>
          </service>
      
          <provider
              android:name="com.google.firebase.provider.FirebaseInitProvider"
              android:authorities="com.fc.debug.firebaseinitprovider"
              android:exported="false"
              android:initOrder="100" />
      
          <receiver
              android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
              android:enabled="true" >
              <intent-filter>
                  <action android:name="com.google.android.gms.measurement.UPLOAD" />
              </intent-filter>
          </receiver>
      
          <service
              android:name="com.google.android.gms.measurement.AppMeasurementService"
              android:enabled="true"
              android:exported="false" />
      

      这篇关于FirebaseInstanceIdService getToken返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆