wake-up-neo.com

Verhindern Sie Netzwerkanfragen von Facebook Android SDK

Das Android Facebook SDK fordert beim Aufruf von FacebookSdk.sdkInitialize(context) immer eine Netzwerkanforderung an graph.facebook.com, auch wenn noch kein SDK verwendet wurde. 

Wenn wir es also in der Application.onCreate() initialisieren, gibt es immer mindestens eine Netzwerkanforderung. Auch wenn die Einstellung wie folgt ist: 

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

Wir haben uns dies genauer angeschaut, weil ein Nutzer sich darüber beschwert hat, dass er den Facebook-Login nicht verwendet (weshalb wir das Facebook-SDK in erster Linie haben) und trotzdem "Benutzerdaten" an Facebook übertragen werden. In Zeiten vonGDPRund verdächtigen Benutzern ist dies ein sehr ungünstiges Verhalten!

Was wir jetzt tun, ruft FacebookSdk.sdkInitialize(context) nur auf, wenn der Benutzer den Facebook-Login verwenden möchte (zu dem Zeitpunkt, zu dem der Benutzer auf die Schaltfläche klickt). Außerdem haben wir den meta-data für Android:name="com.facebook.sdk.ApplicationId" aus dem AndroidManifest entfernt. Dies verhindert die anfängliche Netzwerkanfrage, aber es kommt zu folgendem Absturz in der 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)

Nun gibt es mehrere Fragen:

  1. Warum fordert Facebook zu Beginn noch eine Anfrage? Wenn sie das Auth-Token validieren möchten, können sie es tun, sobald das SDK wirklich verwendet wird ...

  2. Kennt und toleriert Facebook Abstürze, wenn sdkInitialize() nicht aufgerufen wird? Da ich befürchte, wenn diese NullPointerException entfernt wird, kommt es zu weiteren Abstürzen ...

  3. Am wichtigsten: Gibt es andere Möglichkeiten, Netzwerkanfragen vom Facebook SDK zu verhindern, wenn dessen Funktionen nicht verwendet werden?

20
Marius

Ich habe festgestellt, dass das Facebook-SDK (zumindest in Version 4.33) einen Provider (com.facebook.internal.FacebookInitProvider) im Manifest Ihrer App hinzufügt, der automatisch FacebookSdk.sdkInitialize mit dem Anwendungskontext aufruft.

Auch wenn Sie hinzugefügt haben:

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

in Ihrem Manifest werden mindestens 2 Anfragen an Facebook gesendet:

  • eine Diagrammanfrage, um App-Einstellungen zu erhalten
  • eine Ereignisanfrage "fb_sdk_initialize", in der alle in Ihrer App enthaltenen Facebook-Frameworks protokolliert werden

Um diese Anfragen zu verhindern (die wir nicht möchten, solange der Benutzer sie nicht zulässt (GDPR)), haben Sie meiner Meinung nach alles getan, was wir tun müssen:

  • Fügen Sie dem Manifest nicht <meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/facebook_app_id"/> hinzu
  • Fügen Sie <meta-data Android:name="com.facebook.sdk.AutoLogAppEventsEnabled" Android:value="false"/> im Manifest hinzu
  • Initialisieren Sie das Facebook SDK nur, wenn Sie es benötigen.

So zum Beispiel:

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.

Aber was Ihren Absturz angeht, weiß ich nicht, warum es passiert, da die Sendung "com.facebook.sdk.ACTION_CURRENT_ACCESS_TOKEN_CHANGED" lokal gesendet wird.

Ich denke jedoch, dass Sie dies verhindern können, indem Sie dies zu Ihrem Manifest hinzufügen:

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

Dies kann jedoch bei der Verwendung von Facebook SDK schlechte Folgen haben, und ich denke, Sie müssen Ihren eigenen BroadcastReceiver bereitstellen (und sich in Ihrem Manifest registrieren):

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

Laut Facebook-Support ,

Wenn Sie die automatische Ereigniserfassung vorübergehend deaktivieren möchten, z. B. um die Zustimmung des Endbenutzers einzuholen, bevor Sie Daten erfassen, können Sie den Wert von AutoLogAppEventsEnabled in der Anwendung AndroidManifest.xml der Anwendung auf false setzen.

Zum Beispiel: 

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

Rufen Sie die setAutoLogAppEventsEnabled()-Methode der FacebookSDK-Klasse auf, um die Sammlung erneut zu aktivieren, z. B. nachdem ein Endbenutzer die Zustimmung erteilt hat.

Zum Beispiel: setAutoLogAppEventsEnabled(true);

Wenn Sie die Sammlung aus irgendeinem Grund erneut unterbrechen müssen, können Sie setAutoLogAppEventsEnabled(false); aufrufen. Die Sammlung wird solange ausgesetzt, bis sie erneut aktiviert wird.

0
Kedar Tendolkar