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-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)
Run Code Online (Sandbox Code Playgroud)
现在有几个问题:
Facebook为什么还在开始时提出请求?如果他们想要验证身份验证令牌,他们可以在真正使用SDK时立即执行此操作...
Facebook是否知道并容忍崩溃sdkInitialize()
未被调用?因为我担心当它NullPointerException
被删除时会有其他崩溃......
最重要的是:当没有使用其功能时,还有其他方法可以阻止来自Facebook SDK的网络请求吗?
我注意到,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"/>
清单例如:
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)
归档时间: |
|
查看次数: |
1112 次 |
最近记录: |