风流不在谈锋胜,袖手无言味最长。这篇文章主要讲述防止来自Facebook Android SDK的网络请求相关的知识,希望能为你提供帮助。
即使尚未使用任何SDK,android Facebook SDK也会在调用graph.facebook.com
时向FacebookSdk.sdkInitialize(context)
发出网络请求。
【防止来自Facebook Android SDK的网络请求】因此,如果我们在Application.onCreate()
中初始化它,将始终至少有一个网络请求。即使设置如下:
<
meta-data
android:name="com.facebook.sdk.AutoLogAppEventsEnabled"
android:value="https://www.songbingjia.com/android/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)
现在有几个问题:
- Facebook为什么还在开始时提出请求?如果他们想要验证身份验证令牌,他们可以在真正使用SDK时立即执行此操作...
- 当没有调用
sdkInitialize()
时,Facebook是否知道并容忍崩溃?因为我担心当这个NullPointerException
被移除时会有其他崩溃...... - 最重要的是:当没有使用其功能时,还有其他方法可以阻止来自Facebook SDK的网络请求吗?
com.facebook.internal.FacebookInitProvider
),它会自动使用应用程序上下文调用FacebookSdk.sdkInitialize
。即使您添加了:
<
meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="https://www.songbingjia.com/android/false" />
在您的清单中,至少会向Facebook提出2个请求:
- 获取应用设置的图形请求
- 一个事件请求“
fb_sdk_initialize
”,它记录了应用程序中包含的所有Facebook框架
- 不要在清单中添加
< meta-data android:name="com.facebook.sdk.ApplicationId" android:value="https://www.songbingjia.com/android/@string/facebook_app_id"/>
- 在清单中添加
< meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="https://www.songbingjia.com/android/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="https://www.songbingjia.com/android/false"/>
要重新启用收集,例如在最终用户提供同意后,请调用FacebookSDK类的
setAutoLogAppEventsEnabled()
方法。例如:
setAutoLogAppEventsEnabled(true);
如果您因任何原因需要再次暂停收集,可以调用
setAutoLogAppEventsEnabled(false);
并暂停收集直到重新启用它。推荐阅读
- 页面公共内容访问的Facebook App Review过程不适合服务器端脚本
- React Native Overflow Touchable在Android中不起作用
- Firebase SSO Auth无法在Facebook中运行在App Browser中
- 除了facebook app admin之外,Facebook Bot不会正确返回消息
- 通过Console App C#将照片发布到Facebook页面
- 将VBA转换为Google Apps脚本
- 在Jmeter for Oracle Application中获得不足的权限错误
- 如何修复TypeError(application_module__WEBPACK_IMPORTED_MODULE_1 ___ default.a不是构造函数)
- 如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable()