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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止来自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"AndroidManifest。这可以防止初始网络请求,但随后在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为什么还在开始时提出请求?如果他们想要验证身份验证令牌,他们可以在真正使用SDK时立即执行此操作...
  2. 当没有调用sdkInitialize()时,Facebook是否知道并容忍崩溃?因为我担心当这个NullPointerException被移除时会有其他崩溃......
  3. 最重要的是:当没有使用其功能时,还有其他方法可以阻止来自Facebook SDK的网络请求吗?
答案

我注意到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!
        }
    }
}
另一答案

根据Facebook Support

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

例如:

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

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

例如:setAutoLogAppEventsEnabled(true);

如果您因任何原因需要再次暂停收集,可以调用setAutoLogAppEventsEnabled(false);并暂停收集直到重新启用它。

以上是关于防止来自Facebook Android SDK的网络请求的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 android 的 sdk 3.19.0 在 Facebook 上上传图片

Facebook SDK:验证请求,以便 php 服务器知道它来自登录用户

安卓。通过 Facebook SDK 4.X 向 facebook messenger 发送文本

使用 Facebook SDK 3.1 防止 iOS 本机登录

实现Facebook SDK

Facebook 的 Android ProGuard 设置