gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:07:14 25 4
gpt4 key购买 nike

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 和可疑用户的时代,这是一种非常不利的行为!

我们现在正在做的是调用 FacebookSdk.sdkInitialize(context) 仅当用户想要使用 Facebook 登录时(在用户单击按钮时)。此外,我们从 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 token ,他们可以在真正使用 SDK 后立即进行......

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

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

最佳答案

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

即使你已经添加了:

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

在您的 list 中,将向 Facebook 发出至少 2 个请求:

  • 获取应用设置的图表请求
  • 一个事件请求“fb_sdk_initialize”,它记录了您应用中包含的所有 Facebook 框架

因此,为了阻止这些请求(只要用户不允许,我们就不会想要这些请求 (GDPR)),我认为您已经完成了我们需要做的一切:

  • 请勿添加 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>在 list 中
  • 添加 <meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/>在 list 中
  • 仅在需要时初始化 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”似乎是在本地发送的。

不过,我认为您可以通过将其添加到 list 中来防止它:

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

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

关于android - 阻止来自 Facebook Android SDK 的网络请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51363104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com