tutorial studio sesion inicio hashes crear con clave app android_sdk_version android facebook facebook-android-sdk

studio - inicio de sesion con facebook android



Prevenir solicitudes de red de Facebook Android SDK (2)

He notado que el SDK de Facebook (al menos en la versión 4.33) agrega un proveedor ( com.facebook.internal.FacebookInitProvider ) en el manifiesto de su aplicación, que automáticamente llama a FacebookSdk.sdkInitialize con el contexto de la aplicación.

Incluso si has añadido:

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

en su manifiesto, al menos 2 solicitudes se harán a Facebook:

  • una solicitud gráfica para obtener la configuración de la aplicación
  • una solicitud de eventos " fb_sdk_initialize " que registra todos los marcos de Facebook que están incluidos en su aplicación

Entonces, para evitar estas solicitudes (que no queremos mientras el usuario no las permita (GDPR)), creo que hiciste todo lo que necesitamos hacer:

  • No agregue <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> en el manifiesto
  • Agregue <meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/> en el manifiesto
  • Solo inicializa el SDK de Facebook cuando lo necesites.

Como este por ejemplo:

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.

Pero con respecto a su bloqueo, no sé por qué sucede ya que parece que la transmisión " com.facebook.sdk.ACTION_CURRENT_ACCESS_TOKEN_CHANGED " se envía localmente.

Sin embargo, creo que puedes evitarlo agregando esto a tu manifiesto:

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

Sin embargo, hacer esto puede tener malas consecuencias con el uso del SDK de Facebook y creo que tendrá que proporcionar (y registrarse en su manifiesto) su propio 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! } } }

El Android SDK de Facebook siempre realiza una solicitud de red a graph.facebook.com cuando llama a FacebookSdk.sdkInitialize(context) incluso si todavía no se ha utilizado nada del SDK.

Entonces, si lo estamos inicializando en Application.onCreate() siempre habrá al menos una solicitud de red. Incluso si el ajuste es el siguiente:

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

Miramos esto más de cerca porque un usuario se quejó de que no está usando el inicio de sesión de Facebook (por lo que en primer lugar tenemos el SDK de Facebook) y aún hay "datos de usuario" transferidos a Facebook. ¡En tiempos de GDPR y usuarios sospechosos, este es un comportamiento muy desfavorable!

Lo que estamos haciendo ahora es llamar a FacebookSdk.sdkInitialize(context) solo cuando el usuario quiere usar el inicio de sesión de Facebook (en el momento en que el usuario hace clic en el botón). Además, eliminamos los meta-data de android:name="com.facebook.sdk.ApplicationId" del AndroidManifest . Esto evita la solicitud de red inicial, pero luego aparece el siguiente bloqueo en el 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)

Ahora hay varias preguntas:

  1. ¿Por qué Facebook sigue haciendo una solicitud al inicio? Si quieren validar el token de autenticación, pueden hacerlo tan pronto como se use realmente el SDK ...

  2. ¿Sabe Facebook y tolera los bloqueos cuando no se llama a sdkInitialize() ? Porque me temo que cuando se elimine esta NullPointerException habrá otros bloqueos ...

  3. Lo más importante: ¿Existen otras formas de evitar las solicitudes de red desde el SDK de Facebook cuando no se usan sus funciones?


Según el soporte de Facebook ,

Si desea desactivar temporalmente la recopilación automática de eventos, por ejemplo, para obtener el consentimiento del usuario final antes de recopilar datos, puede establecer el valor de AutoLogAppEventsEnabled en falso en el AndroidManifest.xml de la aplicación en la etiqueta de la aplicación.

Por ejemplo:

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

Para volver a habilitar la recopilación, por ejemplo, después de que un usuario final otorgue su consentimiento, llame al método setAutoLogAppEventsEnabled() de la clase FacebookSDK.

Por ejemplo: setAutoLogAppEventsEnabled(true);

Si necesita volver a suspender la recopilación por cualquier motivo, puede llamar a setAutoLogAppEventsEnabled(false); y la colección será suspendida hasta que se vuelva a habilitar.