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:
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 ...
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 ...
Am wichtigsten: Gibt es andere Möglichkeiten, Netzwerkanfragen vom Facebook SDK zu verhindern, wenn dessen Funktionen nicht verwendet werden?
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:
fb_sdk_initialize
", in der alle in Ihrer App enthaltenen Facebook-Frameworks protokolliert werdenUm 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:
<meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/facebook_app_id"/>
hinzu<meta-data Android:name="com.facebook.sdk.AutoLogAppEventsEnabled" Android:value="false"/>
im Manifest hinzuSo 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!
}
}
}
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.