Предотвращение сетевых запросов от Android Android SDK
Android Facebook SDK всегда делает сетевой запрос на graph.facebook.com
при вызове функции FacebookSdk.sdkInitialize(context)
даже если ничто из SDK еще не используется.
Поэтому, если мы инициализируем его в Application.onCreate()
, всегда будет хотя бы один сетевой запрос. Даже если настройка выглядит следующим образом:
<meta-data
android:name="com.facebook.sdk.AutoLogAppEventsEnabled"
android:value="false" />
Мы внимательно рассмотрели это, потому что пользователь жаловался, что он не использует Facebook Login (именно поэтому у нас есть SDK для Facebook), и все же есть "пользовательские данные", переданные в 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)
Теперь есть несколько вопросов:
-
Почему Facebook все еще делает запрос при запуске? Если они хотят проверить токен аутентификации, они могут сделать это, как только SDK действительно используется...
-
Знает ли Facebook и терпит аварии, когда sdkInitialize()
не вызывается? Поскольку я боюсь, когда это исключение NullPointerException
будет удалено, будут другие сбои...
-
Самое главное: Существуют ли другие способы предотвращения сетевых запросов из SDK Facebook, когда его функции не используются?
Ответы
Ответ 1
Я заметил, что в SDK Facebook (по крайней мере, в версии 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"/>
в манифесте - Только инициализируйте SDK Facebook, когда вам это нужно.
Например, например:
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" />
Однако это может иметь плохие последствия с использованием SDK для Facebook, и я думаю, вам придется предоставить (и зарегистрировать в своем манифесте) свой собственный 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!
}
}
}
Ответ 2
Согласно поддержке Facebook,
Если вы хотите временно отключить автоматическую сборку событий, например, чтобы получить согласие конечного пользователя перед сбором данных, вы можете установить значение AutoLogAppEventsEnabled в false в приложении AndroidManifest.xml в теге приложения.
Например:
<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false"/>
Чтобы снова включить сбор, например, после получения согласия конечного пользователя, вызовите метод setAutoLogAppEventsEnabled()
класса FacebookSDK.
Например: setAutoLogAppEventsEnabled(true);
Если вам необходимо приостановить сбор по какой-либо причине, вы можете вызвать setAutoLogAppEventsEnabled(false);
и сбор будет приостановлен до его повторного включения.