Вопрос или проблема
Я недавно реализовал глубокие ссылки с помощью Branch.io для моего приложения на Flutter, работающего на iOS. Всё работает, как ожидалось, когда приложение запущено в фоновом режиме. Когда я нажимаю на ссылку Branch.io, она открывается в моем приложении Flutter. Однако, когда приложение полностью закрыто и находится в холодном состоянии, нажатие на ссылку начинает перенаправление в приложение, но затем приложение сразу же вылетает.
Вот мой код для создания и открытия глубоких ссылок:
static Future<void> listen(BuildContext context) async {
await FlutterBranchSdk.init();
StreamSubscription<Map>? streamSubscription;
streamSubscription = FlutterBranchSdk.listSession().listen((data) async {
if (data.containsKey("groupId") && context.mounted) {
AppNavigationV2.to(
AppPages.groupProfileScreen, {"data": data["groupId"]});
}
}, onError: (error) {
PlatformException platformException = error as PlatformException;
print(
'InitSession error: ${platformException.code} - ${platformException.message}');
});
}
// Следуя этому руководству:
// https://seayeshaiftikhar.medium.com/branch-io-for-deep-linking-in-flutter-2327530f1639
static Future<void> createLink(String groupId) async {
BranchUniversalObject branchUniversalObject = BranchUniversalObject(
canonicalIdentifier: 'flutter/branch',
contentMetadata: BranchContentMetaData()
..addCustomMetadata('groupId', groupId),);
FlutterBranchSdk.registerView(buo: branchUniversalObject);
BranchLinkProperties linkProperties =
BranchLinkProperties(feature: 'sharing');
linkProperties.addControlParam('\$uri_redirect_mode',
'1'); // это перенаправит ссылку в приложение
BranchResponse response = await FlutterBranchSdk.getShortUrl(
buo: branchUniversalObject, linkProperties: linkProperties);
Share.share(response.result);
}
Я удостоверился, что выполнил FlutterBranchSdk.validateSDKIntegration();
и все проверки прошли – конфигурация моего файла Info.plist
кажется правильной.
Я смог отследить вывод своего устройства с помощью приложения Console на Mac, и когда приложение вылетает, я вижу такие сообщения об ошибках:
[(FBSceneManager):sceneID:com.myapp.myapp-default] Обновление не удалось: <NSError: 0x3038b52f0; domain: FBSceneErrorDomain; code: 1 ("operation-failed"); "Обновление сцены не удалось."> {
NSUnderlyingError = <NSError: 0x3026896b0; domain: BSServiceConnectionErrorDomain; code: 3 ("OperationFailed"); "Ошибка XPC получена на обработчике ответа сообщения">;
}
Состояние процесса неизвестно AppStateTracker, pid 3533, uuid xxxxxxx-xxxxxxx идентификатор отображения com.myapp.myapp foreground 1
COSMCtrl _foregroundAppActivity входящий пакет com.myapp.myapp имеет нулевой предоставленный UUID, находит существующий xxxxxxxxx-xxxx-xxx-xxx-xxxxxxxx
Я также попробовал следовать этому решению, но безуспешно.
Работаю на iPhone 12 mini с iOS 18.0. Есть идеи?
Ответ или решение
На основании предоставленной информации и описания проблемы с вашим приложением Flutter, которое вызывает сбой при открытии из холодного состояния с использованием глубоких ссылок Branch.io, я постараюсь предложить комплексное решение.
Возможные причины и решения
-
Корректная инициализация Branch SDK:
Убедитесь, что инициализацияFlutterBranchSdk.init()
происходит до самой регистрации подписчиков и использования других функций SDK. Вам нужно вызывать это в методеmain()
или на начальном экране до доступа кlisten
.void main() async { WidgetsFlutterBinding.ensureInitialized(); await FlutterBranchSdk.init(); // Убедитесь, что инициализация происходит здесь runApp(MyApp()); }
-
Проверка конфигурации Info.plist:
Проверьте, что все необходимые ключи и значения добавлены в Info.plist. Например, вам необходимо указатьBranchKey
и настроить URL-схему. Убедитесь, что все параметры прописаны корректно, как указано в документации Branch.io. -
Обработка ошибок при получении данных из глубоких ссылок:
Используйтеtry-catch
для обработки исключений, которые могут возникнуть при обращении к данным, полученным из глубоких ссылок. Это может помочь в диагностике проблем, возникающих при запуске приложения.streamSubscription = FlutterBranchSdk.listSession().listen((data) async { try { if (data.containsKey("groupId") && context.mounted) { AppNavigationV2.to(AppPages.groupProfileScreen, {"data": data["groupId"]}); } } catch (error) { print('Ошибка при обработке данных: $error'); } });
-
Обновление зависимостей:
Убедитесь, что у вас установлены последние версииflutter_branch_sdk
и других связанных библиотек. Возможно, причиной сбоя является ошибка в старой версии библиотек. -
Отладка проблем с жизненным циклом приложения:
Ошибки, связанные с жизненным циклом приложения, могут вызывать сбои. Попробуйте добавить дополнительную логику для обработки состояния приложения при запуске. Вы можете использовать обработчики жизненного цикла, чтобы убедиться, что приложение правильно реагирует на различные состояния.Например, добавьте проверку на состояние
AppLifecycleState
:WidgetsBinding.instance.addObserver(LifecycleEventHandler( detachedCallBack: () async => print('Detached'), resumedCallBack: () async => print('Resumed'), pausedCallBack: () async => print('Paused'), inactiveCallBack: () async => print('Inactive'), ));
-
Логи на уровне платформы:
Также стоит обратить внимание на логи консоли при отладке. Ошибки, такие какScene update failed
, могут указывать на проблему в коде или конфигурации iOS. Это может быть связано с тем, что приложение не успевает подготовиться к обработке сообщения от Branch.
Рекомендации по дальнейшим действиям
- Тестирование на разных устройствах: Попробуйте протестировать приложение на других моделях iPhone и с другими версиями iOS, чтобы выяснить, сохраняется ли проблема.
- Обращение в службу поддержки Branch: Если вышеуказанные шаги не помогли решить проблему, рекомендуется обратиться в поддержку Branch.io, предоставив им полное описание вашей проблемы и логи.
Надеюсь, эти рекомендации помогут вам успешно решить проблему со сбоем приложения. Если будут возникать дополнительные вопросы, не стесняйтесь их задавать.