首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止来自的网络请求

防止来自的网络请求
EN

Stack Overflow用户
提问于 2018-07-16 13:32:56
回答 2查看 2.4K关注 0票数 24

Android在调用graph.facebook.com时总是向FacebookSdk.sdkInitialize(context)发出网络请求,即使还没有使用SDK。

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

代码语言:javascript
运行
复制
 <meta-data
    android:name="com.facebook.sdk.AutoLogAppEventsEnabled"
    android:value="false" />

我们仔细研究了一下,因为一个用户抱怨他没有使用Facebook (这就是为什么我们一开始就有Facebook ),而且仍然有“用户数据”被传输到Facebook。在探地雷达和可疑用户的时代,这是非常不利的行为!

我们现在要做的是,只有当用户想要使用Facebook时(当用户单击按钮时)才调用FacebookSdk.sdkInitialize(context)。此外,我们从meta-data中删除了android:name="com.facebook.sdk.ApplicationId"AndroidManifest。这防止了最初的网络请求,但随后在CurrentAccessTokenExpirationBroadcastReceiver中出现了以下崩溃

代码语言:javascript
运行
复制
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的网络请求吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-06 13:16:51

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

即使你补充了:

代码语言:javascript
运行
复制
<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false" />

在您的清单中,至少有两个请求将发送到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。

例如,就像这样:

代码语言:javascript
运行
复制
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“似乎是本地发送的。

不过,我认为你可以通过在你的清单中添加以下内容来防止这种情况:

代码语言:javascript
运行
复制
<provider
    android:name="com.facebook.internal.FacebookInitProvider"
    tools:node="remove" />
<receiver
android:name="com.facebook.CurrentAccessTokenExpirationBroadcastReceiver"
    tools:node="remove" />

但是,这样做可能会对使用Facebook产生不良影响,我认为您必须提供(并在清单中注册)您自己的BroadcastReceiver:

代码语言:javascript
运行
复制
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!
        }
    }
}
票数 7
EN

Stack Overflow用户

发布于 2018-07-24 05:21:45

Facebook支持称,

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

例如:

代码语言:javascript
运行
复制
<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/>

若要重新启用集合,例如在最终用户提供同意之后,请调用FacebookSDK类的FacebookSDK方法。

例如:setAutoLogAppEventsEnabled(true);

如果您由于任何原因需要再次挂起集合,您可以调用setAutoLogAppEventsEnabled(false);,并且集合将被暂停,直到重新启用它。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51363104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档