code

Firebase onTokenRefresh ()가 호출되지 않았습니다.

codestyles 2020. 11. 3. 08:04
반응형

Firebase onTokenRefresh ()가 호출되지 않았습니다.


내에서 MainActivity내 로그에, 나는 사용하여 토큰을 볼 수 FirebaseInstanceId.getInstance().getToken()있으며, 생성 된 토큰을 표시합니다. 그러나 내에서 것 같아 MyFirebaseInstanceIDService그것이 확장 FirebaseInstanceIdService의가 onTokenRefresh()이 기능에 토큰이 처음 여기서 생성되는 것을 말한 경우, 호출되지 않습니다. 나는 sendRegistrationToServer()그것이 왜 들어 가지 않는지 알고 싶어하는 이유 onTokenRefresh()입니다.

내 코드는 다음과 같습니다.

public class MyFirebaseInstanceIDService  extends FirebaseInstanceIdService {


@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

        sendRegistrationToServer(refreshedToken);
    }
}

FirebaseInstanceIdService의 onTokenRefresh는 새 토큰이 생성 될 때만 호출됩니다. 앱이 이전에 설치되어 토큰을 생성 한 경우 onTokenRefresh가 호출되지 않습니다. 앱을 제거하고 다시 설치하여 새 토큰을 강제로 생성하면 onTokenRefresh가 호출됩니다.

또한 FirebaseInstanceIdService가 AndroidManifest.xml에 올바르게 정의되어 있는지 확인하십시오.

매니페스트 파일에서.

 <service
        android:name="com.bnt.etailers.fcm.MyFireBaseInstanceIDService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

    <service
        android:name="com.bnt.etailers.fcm.GCMNotificationIntentService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

FirebaseInstanceIdService 클래스

public class MyFireBaseInstanceIDService extends FirebaseInstanceIdService {


private static final String TAG = MyFireBaseInstanceIDService.class.getSimpleName();

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    if (refreshedToken!=null) {
        SettingPreferences.setStringValueInPref(this, SettingPreferences.REG_ID, refreshedToken);
    }
    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]

/**
 * Persist token to third-party servers.
 *
 * Modify this method to associate the user's FCM InstanceID token with any server-side account
 * maintained by your application.
 *
 * @param token The new token.
 */
private void sendRegistrationToServer(String token) {
    // Add custom implementation, as needed.
}}

FirebaseMessagingService 클래스.

public class GCMNotificationIntentService extends FirebaseMessagingService {
// Sets an ID for the notification, so it can be updated


public GCMNotificationIntentService() {
    super();
}


@Override
public void onMessageReceived(RemoteMessage message) {

}}

나는 당신과 같은 문제가있었습니다. 내 실수는 다음과 같습니다 . AndroidManifest.xml 파일 <service><application>태그 외부에 태그를 배치했습니다 .

이제 내 모습은 다음과 같습니다.

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

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

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

그리고 문제없이 작동합니다.


예, 이것은 때때로 발생할 수 있습니다.

fcm ID를 얻으려면 다음 방법을 호출하십시오.

    try {
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
        } catch (Exception e) {
            e.printStackTrace();
        }

제 경우에는 매니페스트에 인터넷 권한을 추가하는 것을 잊었습니다.

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

대부분의 사람들이이 실수를하지 않기를 바랍니다.


먼저 기기 또는 에뮬레이터에서 앱을 제거하여 앱을 다시 설치해보십시오. 그런 다음 새 토큰을 생성하므로 onTokenRefresh ()가 다시 호출됩니다.


try {
    FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
    e.printStackTrace();
}

onCreate토큰을 삭제 하는 방법.


추가했는지 확인하십시오

플러그인 적용 : 'com.google.gms.google-services'

이것은 app.gradle 파일의 맨 아래에 있습니다.


제 경우에는 모든 것을 시도했지만 전화 onTokenRefresh를받지 않았습니다. 그런 다음 WiFi를 변경 하고 다른 네트워크에 연결합니다 . 이제 작동했습니다 !!. 이전 Wi-Fi는 인터넷 연결이 양호합니다. 왜 그런 일이 발생했는지 모르겠습니다. 이것은 누군가를 도울 수 있습니다.


재설치가 나를 위해 트릭을했습니다!


인터넷에 연결할 수없는 기기에서 애플리케이션을 실행할 때 MyFirebaseInstanceIDService가 호출되지 않는 것을 경험했습니다. 이런 식으로 onTokenRefresh ()가 호출되지 않습니다. 따라서 업데이트 된 FirebaseToken을 가져 오기 위해 애플리케이션을 실행하는 동안 기기가 인터넷에 연결되어 있어야합니다.

또한 이전 앱을 제거하고 업데이트 된 토큰을 가져 오기 위해 다시 설치 하십시오. 등록 토큰은 다음과 같은 경우 변경됩니다.

1) 앱이 인스턴스 ID를 삭제합니다.

2) 앱이 새 장치에 복원됩니다.

3) 사용자가 앱을 제거 / 재설치합니다.

4) 사용자가 앱 데이터를 삭제합니다.


호출되지 않은 onTokenRefresh 메톤을 호출하지 않는 데에는 몇 가지 이유가 있습니다. 나는 그것을 나열하고 하나씩 언급했습니다.

  1. 인터넷 권한을 추가했는지 확인하십시오

  2. 프로젝트의 앱 디렉토리 내부에 Google 콘솔에서 생성되는 google-services.json 파일을 추가했는지 확인하십시오.

여기에 이미지 설명 입력

  1. 모듈 Gradle 파일 (일반적으로 app / build.gradle)에서 파일 하단에 플러그인 적용 줄을 추가하여 Gradle 플러그인을 활성화합니다.
apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ...
  implementation 'com.google.firebase:firebase-core:16.0.4'

  // Getting a "Could not find" error? Make sure you have
  // added the Google maven respository to your root build.gradle
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

4) 프로젝트 레벨 build.gridle 파일에 플레이 서비스 클래스 경로 추가

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:4.1.0' // google-services plugin
    }
}

allprojects {
    // ...
    repositories {
        // ...
        google() // Google's Maven repository
    }
}

5) Make sure you have added those service in the AndroidManifes file inside application tag

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

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

6) onToken refresh is called when token refresh and when install the app for the first so make sure you have deleted the app manually or clear the data

7) Make sure you have extends the FirebaseMessagingService in your service class

[Note : If its not working only for specific version for example android kitkat version then try to change the fcm version.]


I've been struggling with that for over an hour, then I changed the following code and it suddenly worked.

handle your refreshedToken as such:

String refreshedToken;
    try {
        refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
        Localytics.setPushRegistrationId(refreshedToken);
    } catch (Exception e) {
        Log.d(TAG, "Refreshed token, catch: " + e.toString());
        e.printStackTrace();
    }

Try adding android:exported="true"> to both MyFirebaseMessagingService and MyFirebaseInstanceIDService in manifest so it looks like that:

<service
        android:name="com.localytics.android.sample.fcm.MyFirebaseMessagingService"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

    <service
        android:name="com.localytics.android.sample.fcm.MyFirebaseInstanceIDService"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

Uninstall your app, Install again, worked. Tested on real device.

android:exported="true" is a default option so you can also remove that entirely and it will be set to true.

Also if you want to call onTokenRefresh more explicitly, you can simply call that anywhere in your code:

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

You don't have to rely on broadcast being received any more


나는 같은 문제가 있었다. 어떤 이유로 내 장치를 (kitkat 4.4.2)얻을 수 없습니다 onTokenRefresh(). 내 인터넷 연결이 완벽했고 Google Play 서비스가 최신 상태였으며 firebase가 작동하는 데 필요한 모든 조건이 충족되었습니다. 내 코드는 장치 5.0.0이상 에서 완벽하게 작동했습니다 . 이 문제를 해결하기 위해 장치를 공장 설정으로 재설정해야하고 응용 프로그램이 작동하기 시작했습니다. 나는 그것이 힘든 측정이라는 것을 알고 있지만 누군가에게 도움이 될 수도 있습니다. onTokenRefresh()호출되지 않는 문제 또는 다른 응용 프로그램과의 충돌이 있어야합니다 . 행운을 빕니다!

참고 URL : https://stackoverflow.com/questions/37451395/firebase-ontokenrefresh-is-not-called

반응형