prosource

Firebase Messaging에서 모든 항목을 한 번에 구독 취소

probook 2023. 6. 7. 22:59
반응형

Firebase Messaging에서 모든 항목을 한 번에 구독 취소

한 번에 모든 주제에서 구독을 취소할 수 있는 방법이 있습니까?

Firebase Messaging을 사용하여 구독 중인 일부 항목에서 푸시 알림을 받고 있는데, 어떻게든 모든 항목에서 구독을 하나씩 취소하지 않고 구독을 취소해야 합니다.그게 가능한가요?

인스턴스 API를 사용하여 지정된 토큰에 가입된 사용 가능한 모든 항목을 쿼리하고 모든 항목에서 가입 취소를 여러 요청을 호출할 수 있습니다.

하지만, 만약 당신이 모든 주제로부터 받는 것을 멈추고 싶다면, 그리고 토큰이 전혀 유용하지 않다면, 당신은 전화할 수 있습니다.FirebaseInstanceId.getInstance().deleteInstanceId()(reference: deleteInstanceId() 및 잠재적 IOException에 대한 try/catch로 둘러쌉니다.) 인스턴스 ID를 재설정하고 새 인스턴스 ID 및 토큰에서 새 항목을 구독할 수 있습니다.

이것이 누군가에게 도움이 되기를 바랍니다.

InstanceId 및 기타 항목을 삭제하지 않으려면 버그 구현 가능성이 매우 높기 때문에 로컬 데이터베이스 또는 원격 데이터베이스에 저장할 때 구독한 항목 중 일부가 누락되지 않도록 해야 합니다.

먼저 구독한 모든 주제를 가져옵니다.

    var options = BaseOptions(headers: {'Authorization':'key = YOUR_KEY'});
    var dio = Dio(options);
    var response = await dio.get('https://iid.googleapis.com/iid/info/' + token,
                             queryParameters: {'details': true});
    Map<String, dynamic> subscribedTopics = response.data['rel']['topics'];

여기서 키 가져오기: Firebase 콘솔 -> 당신의 프로젝트 -> 프로젝트 설정 -> 클라우드 메시징 -> 서버 키

토큰을 다음과 같이 가져옵니다.

var firebaseMessaging = FirebaseMessaging();
String token;
firebaseMessaging.getToken().then((value) {
  token = value;
});

이제 모든 항목에서 구독을 취소합니다.

  Future<void> unsubscribeFromAllTopics() async {
    for (var entry in subscribedTopics.entries) {
      await Future.delayed(Duration(milliseconds: 100)); // throttle due to 3000 QPS limit
      unawaited(firebaseMessaging.unsubscribeFromTopic(entry.key)); // import pedantic for unawaited
      debugPrint('Unsubscribed from: ' + entry.key);
    }
  }

모든 코드는 다트에 있습니다.

인스턴스 ID에 대한 자세한 내용은 https://developers.google.com/instance-id/reference/server 을 참조하십시오.

이것이 최선의 방법은 아니지만 효과가 있다는 것을 압니다!모든 항목의 목록을 데이터베이스에 저장한 후 사용자가 로그아웃할 때 모든 항목에서 등록 취소할 수 있습니다.

final FirebaseMessaging messaging= FirebaseMessaging.getInstance();
      FirebaseDatabase.getInstance().getReference().child("topics").addChildEventListener(new ChildEventListener() {
          @Override
          public void onChildAdded(DataSnapshot dataSnapshot, String s) {
              String topic  = dataSnapshot.getValue(String.class);
              messaging.unsubscribeFromTopic(topic);
}...//rest code

환경설정에서 등록된 항목의 개인 목록을 유지합니다.

그렇게 어렵지 않다.제가 하는 일은 다음과 같습니다.

public class PushMessagingSubscription {

  private static SharedPreferences topics;

  public static void init(ApplicationSingleton applicationSingleton) {
    topics = applicationSingleton.getSharedPreferences("pushMessagingSubscription", 0);
  }

  public static void subscribeTopic(String topic) {
    if (topics.contains(topic)) return; // Don't re-subscribe
    topics.edit().putBoolean(topic, true).apply();

    // Go on and subscribe ...
  }


  public static void unsubscribeAllTopics() {
    for (String topic : topics.getAll().keySet()) {
      FirebaseMessaging.getInstance().unsubscribeFromTopic(topic);
    }
    topics.edit().clear().apply();
    // FirebaseInstanceId.getInstance().deleteInstanceId();
  }
}

Java 사용자의 경우:

주제별로 수행하려면 다른 답변을 참조하고 FCM 푸시 알림 수신을 중지하려면 다음을 수행합니다.

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            FirebaseInstanceId.getInstance().deleteInstanceId();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

배치했습니다.deleteInstanceId()멈추기 위한 별도의 실마리로java.io.IOException: MAIN_THREAD W/System.err로 포장된try / catch처리할IOException.

Firebase.messaging.deleteToken()

2021년에 대한 실제 답변입니다.

우리는 사용할 수 있습니다.unsubcribeAllTopics아래와 같이 서버 측에서.

예,

interface GetTopics {
  rel: {topics: {[key: string]: any}}
}

/**
 * Unsubcribe all topics except one topic
 * 
 * Example response of `https://iid.googleapis.com/iid/info/${fcmToken}?details=true`
 * {
    "applicationVersion": "...",
    "application": "...",
    "scope": "*",
    "authorizedEntity": "...",
    "rel": {
        "topics": {
            "TOPIC_KEY_STRING": { // topic key
                "addDate": "2020-12-23"
            }
        }
    },
    "appSigner": "...",
    "platform": "ANDROID"
}
 */
export const unsubcribeAllTopics = async (
  fcmTokens: string | string[],
  exceptTopic?: string,
) => {
  const headers = {
    'Content-Type': 'application/json',
    Authorization: `key=${process.env.FCM_SERVER_KEY}`,
  }

  const url = `https://iid.googleapis.com/iid/info/${fcmTokens}?details=true`

  try {
    const response = await fetch(url, {method: 'GET', headers: headers})
    const result: GetTopics = await response.json()
    const keys = Object.keys(result.rel.topics)

    keys.forEach(key => {
      key !== exceptTopic &&
        messaging()
          .unsubscribeFromTopic(fcmTokens, key)
          .catch(error => {
            console.error('error', {data: error})
          })
    })
  } catch (error) {
    console.error('error', {data: error})
  }
}

https://gist.github.com/JeffGuKang/62c280356b5632ccbb6cf146e2bc4b9d

만약 당신이 모든 주제에서 구독을 취소하고 싶다면 float을 사용하세요.

  final FirebaseMessaging _fcm = FirebaseMessaging();
  _fcm.deleteInstanceID().then((value){
                print('deleted all'+value.toString());
              });
try {
    FirebaseInstallations.getInstance().delete()
} catch (e: IOException) {

}

언급URL : https://stackoverflow.com/questions/38212123/unsubscribe-from-all-topics-at-once-from-firebase-messaging

반응형