Вопрос или проблема
Я пытаюсь перенести свой код OneSignal в файле уведомлений dart. Но документация не совсем ясна, как изменились определенные поля…
Вот мой текущий код, написанный с версией onesignal_flutter 3.5.0:
import 'package:onesignal_flutter/onesignal_flutter.dart';
import 'package:hatvan_app/constants/tokens.dart';
Future<void> initOneSignal() async {
try {
await OneSignal.shared.setLogLevel(OSLogLevel.info, OSLogLevel.none);
await OneSignal.shared.setAppId(ONESIGNAL_CLIENT_ID);
await OneSignal.shared
.promptUserForPushNotificationPermission(fallbackToSettings: false);
await OneSignal.shared.promptUserForPushNotificationPermission();
OneSignal.shared
.setNotificationWillShowInForegroundHandler((notification) {});
} catch (e) {
print("Ошибка инициализации OneSignal: ${e.toString()}");
}
}
Future<String?> get onesignalId =>
OneSignal.shared.getDeviceState().then((state) {
final id = state?.userId;
return id;
});
Я обновил версию до 5.2.6, посмотрел на github, но единственное, что я нашел о миграции, это то, что setLogLevel просто переместили в Debug:
await OneSignal.Debug.setLogLevel(OSLogLevel.info);
Мне нужно перенести все, и .shared больше не определен в OneSignal.
Ответ или решение
Вопрос миграции кода OneSignal в приложении Flutter может вызвать некоторые трудности, особенно если вы обновляете библиотеку и сталкиваетесь с изменениями в API. В вашей ситуации вы переходите с версии 3.5.0 на версию 5.2.6, и это требует серьезной переработки вашего кода. Давайте рассмотрим основные изменения и обновим ваш код на основе новых рекомендаций.
Основные изменения в API OneSignal
-
Отказ от метода
.shared
: В новой версии больше не используется объектshared
. Вместо этого все методы вызываются напрямую на классеOneSignal
. Это изменение значительно упрощает взаимодействие с библиотекой. -
Методы работы с уведомлениями: Теперь использование некоторых методов изменилось. Например, работа с обработчиками уведомлений, получения статуса устройства и т.д.
-
Структура инициализации: Возможно, структура ваших функций инициализации также изменится. Некоторые параметры могли быть удалены или переименованы.
Теперь обновим ваш код для соответствия новым стандартам.
Обновлённый код инициализации OneSignal
Вот как будет выглядеть ваш код после миграции:
import 'package:onesignal_flutter/onesignal_flutter.dart';
import 'package:hatvan_app/constants/tokens.dart';
Future<void> initOneSignal() async {
try {
// Установка уровня журналирования
await OneSignal.setLogLevel(OSLogLevel.info);
// Инициализация приложения OneSignal
await OneSignal.setAppId(ONESIGNAL_CLIENT_ID);
// Запрос разрешения на получение уведомлений
await OneSignal.promptUserForPushNotificationPermission(fallbackToSettings: false);
// Установка обработчика для уведомлений, получаемых в фоновом режиме
OneSignal.setNotificationWillShowInForegroundHandler((OSNotificationReceivedEvent event) {
// Обработка уведомления
// Например, можно вызвать event.complete(null) для предотвращения отображения
});
} catch (e) {
print("OneSignal init error: ${e.toString()}");
}
}
Future<String?> get onesignalId async {
// Получаем состояние устройства и его идентификатор
var state = await OneSignal.getDeviceState();
return state?.userId;
}
Объяснение изменений
-
Упрощение вызовов методов: Теперь обращение ко всем методам осуществляется напрямую через
OneSignal
, что делает код более чистым и читабельным. -
Обработчик уведомлений: Мы добавили
OSNotificationReceivedEvent
для более точной работы с уведомлениями, которые приходят в фоновом режиме. Обратите внимание, что важно корректно обрабатывать уведомления, чтобы не отображать их в UI, если это не нужно. -
Асинхронные вызовы: Мы используем
async
/await
для получения идентификатора устройства. Это соответствует современным стандартам программирования в Dart и позволяет избежать проблем со временем выполнения.
Заключение
Миграция может показаться сложной, но, следуя приведённым выше рекомендациям, вы сможете адаптировать ваш код к новой версии библиотеки OneSignal. Обязательно проверьте документацию OneSignal на предмет дополнительных изменений и функционала, который вам может понадобиться.
В случае возникновения вопросов или проблем, не стесняйтесь обращаться за поддержкой в сообщества разработчиков, где вам помогут быстро решить возникшие трудности.