首页 文章

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

提问于
浏览
20

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

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

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

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

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

现在有几个问题:

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

  • 如果没有调用 sdkInitialize() ,Facebook是否知道并容忍崩溃?因为我担心当这个_698116被删除时会有其他崩溃......

  • Most important: 在没有使用其功能时,还有其他方法可以阻止来自Facebook SDK的网络请求吗?

2 回答

  • 2

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

    即使您添加了:

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

    在您的清单中,至少会有2个请求到Facebook:

    • 获取应用设置的图形请求

    • 一个事件请求“ 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

    根据Facebook Support

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

    例如:

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

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

    例如: setAutoLogAppEventsEnabled(true);

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

相关问题