【问题标题】:Prevent network requests from Facebook Android SDK阻止来自 Facebook Android SDK 的网络请求
【发布时间】:2018-07-16 13:32:56
【问题描述】:

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

所以如果我们在Application.onCreate() 中初始化它,总会有至少一个网络请求。即使设置如下:

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

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

我们现在所做的是仅在用户想要使用 Facebook 登录时(在用户单击按钮时)调用 FacebookSdk.sdkInitialize(context)。此外,我们从AndroidManifest 中删除了android:name="com.facebook.sdk.ApplicationId"meta-data。这可以防止初始网络请求,但随后在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)

现在有几个问题:

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

  2. sdkInitialize() 未被调用时,Facebook 是否知道并容忍崩溃?因为我担心当这个NullPointerException 被删除时会出现其他崩溃...

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

【问题讨论】:

  • 看起来他们目前正在为 iOS 解决类似的问题:developers.facebook.com/bugs/2049684891939638 Android 现在也有一个问题:developers.facebook.com/bugs/1228749923934453
  • 您使用的是什么版本的 sdk,以及您如何避免调用 FacebookSdk.sdkInitialize。我正在使用com.facebook.android:facebook-core:4.34.0,它是通过应用程序启动调用的,我在Application.onCreate 中不需要任何代码。清单 AutoLogAppEventsEnabled 标志不会阻止 fb 拨打电话。它是GET /v3.0/xxx?fields=..,看起来像是一个 fetch config 调用,但谢谢,不,谢谢 FB。 GDPR 处理团队说不。那么你是如何避免sdkInitialize 来电的呢?
  • 请禁用您需要从AndroidManifest 中删除&lt;meta-data android:name="com.facebook.sdk.ApplicationId" 的初始调用,并在您真正使用它时立即调用FacebookSdk.setApplicationId(getString(R.string.facebook_app_id))FacebookSdk.sdkInitialize(context)(我们正在使用@987654345 @也是)。
  • 会尝试的。干杯。
  • FacebookSdk.sdkInitialize(context) 现在已弃用。任何不推荐使用的方法?谢谢。

标签: android facebook facebook-android-sdk


【解决方案1】:

我注意到 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)),我认为您已经完成了我们需要做的一切:

  • 不要在清单中添加&lt;meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/&gt;
  • 在清单中添加&lt;meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/&gt;
  • 仅在需要时初始化 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!
        }
    }
}

【讨论】:

  • FacebookSdk.sdkInitialize(context) 现在已弃用。任何不推荐使用的方法?谢谢。
  • 不用担心,这个方法是内部使用的。如果它被弃用,那是因为它预计会被 SDK 自动调用(参见第 250 行开始的注释:github.com/facebook/facebook-android-sdk/blob/…)。
【解决方案2】:

根据Facebook Support

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

例如:

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

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

例如:setAutoLogAppEventsEnabled(true);

如果您因任何原因需要再次暂停收集,您可以致电setAutoLogAppEventsEnabled(false);,收集将暂停,直到重新启用为止。

【讨论】:

  • 感谢您复制大家已经阅读的 Facebook 文档。我已经关闭了设置,但仍然有一个请求,就像我在问题中描述的那样。我不敢相信答案是自动奖励的......
  • 正如@noongiya95 所说,这并不能阻止问题中提到的呼叫。这个答案没有增加任何价值,只是噪音。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2021-04-14
  • 2022-01-13
  • 2015-04-27
  • 2019-06-01
相关资源
最近更新 更多