Однажды вечером, когда мы устраивали вечеринку по случаю годовщины компании, один парень из высшего руководства подошел ко мне и сказал, что наше приложение для iOS вылетает при каждом запуске. Это не первый случай, когда мы сталкиваемся с таким аварийным поведением. В тот момент мне в голову пришло следующее:

Это СНОВА SDK Facebook? 🤔

Как обычно, мы проверили журналы сбоев и запустили наше приложение в режиме отладки, чтобы проверить, можем ли мы воспроизвести. БИНГО! В отчете о сбоях мы получили тысячи сбоев, связанных с Facebook Graph API, которые мы не вызывали в нашем приложении. 😅

В то время как инженеры проверяли технически, менеджеры проверяли, не вылетали ли другие приложения, как наше приложение, и искали, не сообщалось ли то же самое другими в Интернете. Оказалось, что мы можем найти людей, говорящих об этом же в Твиттере и на некоторых форумах.

Так что мы можем сделать? В тот момент мы могли просто молиться и ждать, пока Facebook исправит для мира iOS. Действительно, мы ничего не могли сделать, чтобы спасти наше приложение и наших пользователей. Если приложение критично для бизнеса компании, это катастрофа, потому что деньги останавливаются, пока приложение не заработает должным образом.

🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻

Через несколько часов все вернулось в норму. Слава Богу. Все вздохнули с облегчением. Однако у всех нас есть дополнительные вопросы:

Можем ли мы взять на себя отказ приложения?
Можем ли мы захватить ворота?

Во время периода сбоя мы пытались удалить весь связанный с Facebook код в нашем приложении, чтобы посмотреть, можно ли остановить сбой. Оказалось, что после удаления всего связанного кода сбой все еще происходил. Наше приложение может выйти из строя, просто импортировав SDK Facebook в проект. В тот момент мы думали, что ничего не сможем сделать, если не удалим нашу функцию входа в Facebook. Похоже, Facebook сделал что-то хитрое.

🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭 🎭🎭

Поскольку Facebook SDK - это проект с открытым исходным кодом, мы можем исследовать, что происходит внутри. давайте копать глубже! 🔥

После некоторой проверки мы нашли их уловку! 🧐

Статическая load функция FBSDKApplicationDelegate была автоматически вызвана при запуске приложения, потому что SDK был импортирован в наше приложение. Автоматическая инициализация объясняет, почему Facebook SDK может отправлять запросы Graph API без нашего вызова. 🙄

Из документации Apple

Вызывается всякий раз, когда класс или категория добавляются в среду выполнения Objective-C; реализовать этот метод для выполнения специфичного для класса поведения при загрузке.

Сообщение load отправляется классам и категориям, которые как динамически загружаются, так и статически связаны, но только если вновь загруженный класс или категория реализует метод, который может отвечать.

Как мы видим их код, мы можем заставить [FBSDKSettings isAutoInitEnabled] вернуть false.

Основываясь на документации в SDK, мы можем отключить автоматическую инициализацию, установив FacebookAutoInitEnabled на NO в Info.plist проекта.

С тех пор мы добавили поддержку флага функции при инициализации SDK Facebook в нашем приложении следующим образом:

if FeatureFlag.facebookSDK {
    // initialize Facebook SDK manually
    ApplicationDelegate.initializeSDK(nil)
}

После реализации нашего флага функции, даже если Facebook SDK снова приведет к сбою нашего приложения, мы можем сами отключить этот флаг, чтобы остановить сбой, как при управлении плотиной. Несмотря на то, что мы не можем изменить Facebook SDK, мы можем спасти наших пользователей своими руками. Нам больше не нужно молиться о быстром исправлении ситуации в Facebook. 😁

Ссылка: