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

Mar*_*ius 21 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" />
Run Code Online (Sandbox Code Playgroud)

我们仔细研究了这一点,因为用户抱怨他没有使用Facebook登录(这就是我们首先拥有Facebook SDK的原因)并且仍有"用户数据"转移到Facebook.在GDPR和可疑用户时代,这是一种非常不利的行为!

我们现在正在做的是FacebookSdk.sdkInitialize(context)仅在用户想要使用Facebook登录时(在用户点击按钮时)进行呼叫.此外,我们删除了meta-dataandroid: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)
Run Code Online (Sandbox Code Playgroud)

现在有几个问题:

  1. Facebook为什么还在开始时提出请求?如果他们想要验证身份验证令牌,他们可以在真正使用SDK时立即执行此操作...

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

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

Don*_*key 5

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

即使您添加了:

<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false" />
Run Code Online (Sandbox Code Playgroud)

在您的清单中,至少会向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.
Run Code Online (Sandbox Code Playgroud)

但是关于您的崩溃,我不知道为什么会这样,因为广播“ 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" />
Run Code Online (Sandbox Code Playgroud)

但是,这样做可能会对使用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!
        }
    }
}
Run Code Online (Sandbox Code Playgroud)