阻止来自Facebook Android SDK的网络请求

时间:2018-07-16 13:32:56

标签: android facebook facebook-android-sdk

即使未使用任何SDK,Android Facebook SDK始终会在调用graph.facebook.com时向FacebookSdk.sdkInitialize(context)发出网络请求。

因此,如果我们在Application.onCreate()中对其进行初始化,将始终至少有一个网络请求。即使设置如下:

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

我们已经仔细研究了这一点,因为用户抱怨他没有使用Facebook登录名(这就是为什么我们首先使用Facebook SDK的原因),并且仍然有“用户数据”传输到Facebook。在 GDPR 和可疑用户的时代,这是非常不利的行为!

我们现在所做的只是在用户想要使用Facebook登录名时(在用户单击按钮时)才调用FacebookSdk.sdkInitialize(context)。此外,我们从meta-data中删除了android:name="com.facebook.sdk.ApplicationId"的{​​{1}}。这样可以防止出现初始网络请求,但是AndroidManifest中会出现以下崩溃:

CurrentAccessTokenExpirationBroadcastReceiver

现在有几个问题:

  1. 为什么Facebook在开始时仍在发出请求?如果他们想验证auth令牌,则可以在真正使用SDK后立即执行。

  2. 在不调用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) 时Facebook是否知道并容忍崩溃?因为我担心删除此sdkInitialize()后会发生其他崩溃...

  3. 最重要的:在不使用Facebook SDK功能的情况下,还有其他方法可以阻止来自Facebook SDK的网络请求吗?

2 个答案:

答案 0 :(得分:4)

我注意到Facebook SDK(至少在4.33版中)在您的应用清单中添加了一个提供程序(com.facebook.internal.FacebookInitProvider),该提供程序会自动在应用程序上下文中调用FacebookSdk.sdkInitialize

即使添加了:

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

在您的清单中,至少会向Facebook发出2个请求:

  • 获取应用程序设置的图形请求
  • 事件请求“ fb_sdk_initialize”记录了应用程序中包含的所有Facebook框架

因此,为了防止这些请求(只要用户不允许,我们就不再希望它们(GDPR)),我认为您已完成了我们需要做的所有事情:

  • 请勿在清单中添加<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
  • 在清单中添加<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/>
  • 仅在需要时初始化Facebook SDK。

例如:

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.

但是对于您的崩溃,我不知道为什么会这样,因为广播“ com.facebook.sdk.ACTION_CURRENT_ACCESS_TOKEN_CHANGED”似乎是在本地发送的。

尽管如此,我认为您可以通过将其添加到清单中来阻止它:

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

但是,这样做可能会对使用Facebook SDK产生不良后果,我认为您将必须提供(并在清单中注册)您自己的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!
        }
    }
}

答案 1 :(得分:0)

根据Facebook Support

如果您想暂时禁用自动事件收集,例如在收集数据之前获得最终用户的同意,则可以在应用程序标签的应用程序AndroidManifest.xml中将AutoLogAppEventsEnabled的值设置为false。

例如:

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

要重新启用收集(例如在最终用户同意后),请调用FacebookSDK类的setAutoLogAppEventsEnabled()方法。

例如:setAutoLogAppEventsEnabled(true);

如果出于任何原因需要再次暂停收集,则可以调用setAutoLogAppEventsEnabled(false);,并且收集将被暂停,直到重新启用它为止。