web-dev-qa-db-fra.com

Empêcher les demandes de réseau de Facebook Android SDK

Le SDK Android de Facebook envoie toujours une demande réseau à graph.facebook.com lorsqu’il appelle FacebookSdk.sdkInitialize(context) même si aucun élément du SDK n’a encore été utilisé. 

Donc, si nous l'initialisons dans Application.onCreate(), il y aura toujours au moins une requête réseau. Même si le réglage est le suivant: 

 <meta-data
    Android:name="com.facebook.sdk.AutoLogAppEventsEnabled"
    Android:value="false" />

Nous nous sommes penchés sur la question car un utilisateur s’est plaint de ne pas utiliser la connexion Facebook (c’est pourquoi nous avons le SDK de Facebook en premier lieu) et que des "données d’utilisateur" soient toujours transférées vers Facebook. En période deGDPRet d'utilisateurs suspects, il s'agit d'un comportement très défavorable!

Nous appelons maintenant FacebookSdk.sdkInitialize(context) uniquement lorsque l'utilisateur souhaite utiliser le login Facebook (au moment où l'utilisateur clique sur le bouton). De plus, nous avons supprimé le meta-data pour Android:name="com.facebook.sdk.ApplicationId" de la AndroidManifest. Cela empêche la demande réseau initiale, mais le crash suivant apparaît dans la variable CurrentAccessTokenExpirationBroadcastReceiver:

Java.lang.RuntimeException: Unable to start receiver com.facebook.CurrentAccessTokenExpirationBroadcastReceiver: The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first.
at com.facebook.internal.Validate.sdkInitialized(Validate.Java:143)
    at com.facebook.FacebookSdk.getApplicationContext(FacebookSdk.Java:518)
    at com.facebook.AccessTokenManager.getInstance(AccessTokenManager.Java:86)
    at com.facebook.CurrentAccessTokenExpirationBroadcastReceiver.onReceive(CurrentAccessTokenExpirationBroadcastReceiver.Java:34)

Maintenant, il y a plusieurs questions:

  1. Pourquoi Facebook fait-il encore une demande au début? S'ils veulent valider le jeton d'authentification, ils peuvent le faire dès que le SDK est réellement utilisé ...

  2. Facebook connaît-il et tolère-t-il les collisions lorsque sdkInitialize() n'est pas appelé? Parce que je crains que lorsque cette NullPointerException soit supprimée, il y aura d'autres collisions ...

  3. Le plus important: Y a-t-il d'autres moyens d'empêcher les requêtes réseau du SDK de Facebook lorsque ses fonctionnalités ne sont pas utilisées?

20
Marius

J'ai remarqué que le SDK Facebook (au moins dans la version 4.33) ajoute un fournisseur (com.facebook.internal.FacebookInitProvider) dans le manifeste de votre application, qui appelle automatiquement FacebookSdk.sdkInitialize avec le contexte de l'application.

Même si vous avez ajouté:

<meta-data Android:name="com.facebook.sdk.AutoLogAppEventsEnabled" Android:value="false" />

dans votre manifeste, au moins 2 demandes seront adressées à Facebook:

  • une demande de graphique pour obtenir les paramètres de l'application
  • une demande d'événements "fb_sdk_initialize" qui enregistre tous les frameworks Facebook inclus dans votre application

Donc, pour empêcher ces requêtes (que nous ne voulons pas tant que l'utilisateur ne les a pas autorisées (GDPR)), je pense que vous avez fait tout ce que nous devions faire:

  • Ne pas ajouter <meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/facebook_app_id"/> dans le manifeste
  • Ajouter <meta-data Android:name="com.facebook.sdk.AutoLogAppEventsEnabled" Android:value="false"/> dans le manifeste
  • N'initialisez le SDK de Facebook que lorsque vous en avez besoin.

Comme ceci par exemple:

FacebookSdk.setApplicationId(<context>.getString(R.string.facebook_app_id));
FacebookSdk.sdkInitialize(<context>);
AppEventsLogger logger = AppEventsLogger.newLogger(<context>); // I don't use FB Login for my project but app events.

Mais concernant votre crash, je ne sais pas pourquoi cela se produit car il semble que la diffusion "com.facebook.sdk.ACTION_CURRENT_ACCESS_TOKEN_CHANGED" soit envoyée localement.

Néanmoins, je pense que vous pouvez le prévenir en ajoutant ceci à votre manifeste:

<provider
    Android:name="com.facebook.internal.FacebookInitProvider"
    tools:node="remove" />
<receiver
Android:name="com.facebook.CurrentAccessTokenExpirationBroadcastReceiver"
    tools:node="remove" />

Cependant, cela pourrait avoir de mauvaises conséquences avec l'utilisation du SDK de Facebook et je pense que vous devrez fournir (et vous inscrire dans votre manifeste) votre propre BroadcastReceiver:

public class CustomCurrentAccessTokenExpirationBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (AccessTokenManager.ACTION_CURRENT_ACCESS_TOKEN_CHANGED.equals(intent.getAction())) {
            new CurrentAccessTokenExpirationBroadcastReceiver().onReceive(context, intent); // Call it only if you have initialized the Facebook SDK!
        }
    }
}
2
Donkey

Selon Support Facebook ,

Si vous souhaitez désactiver temporairement la collecte automatique d'événements, par exemple pour obtenir le consentement de l'utilisateur final avant de collecter des données, vous pouvez définir la valeur AutoLogAppEventsEnabled sur false dans le fichier AndroidManifest.xml de la balise d'application.

Par exemple: 

<meta-data Android:name="com.facebook.sdk.AutoLogAppEventsEnabled" Android:value="false"/>

Pour réactiver la collecte, par exemple après que l'utilisateur final ait donné son consentement, appelez la méthode setAutoLogAppEventsEnabled() de la classe FacebookSDK.

Par exemple: setAutoLogAppEventsEnabled(true);

Si vous devez suspendre la collecte à nouveau pour une raison quelconque, vous pouvez appeler setAutoLogAppEventsEnabled(false); et la collecte sera suspendue jusqu'à ce que vous la réactiviez.

0
Kedar Tendolkar