Я пытаюсь настроить expo-уведомления для существующего реактивного проекта, который недавно был обновлен до expo 49.0.5. Я создал собственный хук для обработки всей логики уведомлений.
Однако, как только я запускаю приложение с помощью приложения Expo Go на своем iPad, после завершения компиляции я получаю следующую ошибку:
TypeError: невозможно прочитать свойство «custom» неопределенного значения, механизм js: hermes в node_modules/react-native/Libraries/Core/ExceptionsManager.js:105:15 в reportException в node_modules/react-native/Libraries/Core/ExceptionsManager.js:150:4 в handleException в node_modules/react-native/Libraries/Core/setUpErrorHandling.js:26:18 в handleError в node_modules/expo/build/errors/ExpoErrorManager.js:27:16 в errorHandler в node_modules/expo/build/errors/ExpoErrorManager.js:32:8 анонимно в node_modules/@react-native/js-polyfills/error-guard.js:51:16 в reportFatalError в node_modules/metro-runtime/src/polyfills/require.js:237:19 в GuardedLoadModule по адресу http://192.168.1.246:19000/index.bundle ... false:null в MetroRequire. по адресу http://192.168.1.246:19000/index.bundle ... false:null в глобальном масштабе. Мне удалось определить причину ошибки, когда я добавил этот оператор импорта. импортировать * как уведомления из "expo-notifications"
Поэтому я решил попробовать создать совершенно новое приложение для выставок с теми же зависимостями, и это сработало! Но проблема в том, что мне это нужно в этом существующем проекте...
Вот специальный хук, который я использую:
import { useState, useEffect, useRef, useCallback } из «реагировать»; //уведомления импортировать * как Устройство из «expo-device»; импортировать * как Уведомления из "экспо-уведомлений"; // инициализация обработчика уведомлений Notifications.setNotificationHandler({ handleNotification: async () => ({ mustShowAlert: правда, долженPlaySound: ложь, долженSetBadge: ложь, }), }); const useNotification = () => { const [уведомление, setNotification] = useState(false); const [expoPushToken, setExpoPushToken] = useState(""); const NotificationListener = useRef(); const responseListener = useRef(); useEffect(() => { RegisterForPushNotificationsAsync().then((токен) => { console.log("токен", токен) предупреждение (токен); setExpoPushToken (токен) }); NotificationListener.current = Notifications.addNotificationReceivedListener((уведомление) => { console.log("получено уведомление", уведомление) setNotification (уведомление); }); ответпрослушиватель.текущий = Notifications.addNotificationResponseReceivedListener((ответ) => { console.log(ответ); }); возврат () => { Notifications.removeNotificationSubscription( NotificationListener.current ); Notifications.removeNotificationSubscription(responseListener.current); }; }, []); return {expoPushToken, уведомление}; }; экспортировать useNotification по умолчанию; экспортировать асинхронную функцию SchedulePushNotification() { ждут Notifications.scheduleNotificationAsync({ содержание: { title: "Вам письмо!
{ "скрипты": { "start": "начало выставки --dev-client", "android": "запуск выставки: android", "ios": "запуск выставки:ios", "web": "начало выставки --web", "eject": "извлечь выставку" }, "зависимости": { "@expo/config-plugins": "~7.2.2", "@gorhom/bottom-sheet": "^4", "@react-native-async-storage/async-storage": "1.18.2", "@react-native-community/netinfo": "9.3.10", "@react-native-masked-view/masked-view": "0.2.9", "@react-navigation/native": "^6.0.11", "@react-navigation/native-stack": "^6.2.5", "@sentry/react-native": "5.5.0", "@tanstack/query-sync-storage-persister": "^4.0.10", "@tanstack/react-query": "^4.0.10", "@tanstack/react-query-persist-client": "^4.0.10", "aws-amplify": "^4.3.22", "аксиос": "^0.24.0", "dayjs": "^1.10.7", "экспо": "^49.0.5", "expo-app-auth": "~11.1.0", "expo-application": "~5.3.0", "expo-auth-session": "~5.0.2", "expo-blur": "~12.4.1", "expo-checkbox": "~2.4.0", "expo-clipboard": "~4.3.0", "expo-constants": "~14.4.2", "expo-device": "~5.4.0", "expo-document-picker": "~11.5.4", "expo-file-system": "~15.4.2", "expo-font": "~11.4.0", "expo-image-manipulator": "~11.3.0", "expo-image-picker": "~14.3.2", "expo-linear-gradient": "~12.3.0", "expo-location": "~16.1.0", "expo-media-library": "~15.4.1", "expo-notifications": "~0.18.1", "expo-random": "~13.2.0", "expo-screen-orientation": "~6.0.4", "expo-secure-store": "~12.3.1", "expo-splash-screen": "~0.20.4", "expo-status-bar": "~1.6.0", "expo-updates": "~0.18.11", "expo-web-browser": "~12.3.2", "jwt-decode": "^3.1.2", "момент": "^2.29.1", "мсал": "^1.4.14", "реагировать": "18.2.0", "реакция-aad-msal": "^2.3.5", "реакция-дом": "18.2.0", "react-hook-form": "^7.34.2", "реагировать-родной": "0.72.3", "реакция-native-aws3": "0.0.9", "react-native-calendar-strip": "^2.2.5", "реагировать-родные-календари": "^1.1269.0", "реакция-родной-компрессор": "^1.1.1", "реагировать-native-dotenv": "^3.4.9", "react-native-dropdown-picker": "^5.2.3", "реакция-native-geocoding": "^0.5.0", "реагировать-родной-жест-обработчик": "~2.12.0", "реагировать-native-google-places-autocomplete": "^2.4.1", "react-native-keyboard-aware-scroll-view": "^0.9.5", "реагировать-родные-карты": "1.7.1", "реагировать-родной-прогресс": "^5.0.0", "реагировать-родной-радиальный-градиент": "^1.0.9", "реагировать-родной-реанимированный": "~3.3.0", "реагировать-родной-безопасный-контекст": «4.6.3», "реагировать-родные-экраны": "~3.22.0", "react-native-select-dropdown": "^2.0.4", "реакция-native-svg": "13.9.0", "реакция-native-svg-transformer": "^0.14.3", "реагировать-родной-url-polyfill": "^1.3.0", "react-native-virtualized-view": "^1.0.0", "реагировать-native-web": "~0.19.6", "реагировать-родной-webview": "13.2.2", "sentry-expo": "~7.0.0", "shortid": "^2.2.16", "use-debounce": "^9.0.3", "xmldom": "^0.6.0" }, "devDependency": { "@babel/core": "^7.20.0", "babel-plugin-module-resolver": "^4.1.0" }, «частное»: правда, "name": "salesappv2", "версия": "1.0.0", "резолюции": { "@expo/config-plugins": "^5.0.0" } } И, наконец, вот мой app.json
{ "экспо": { "name": "Momentum Sales 2.0 (MVP)", "slug": "MomentumSales", "scheme": "msauth.com.momentum.salesmvp", "версия": "11.3.4", "icon": "./assets/icon.png", "всплеск": { "image": "./assets/splash.png", "resizeMode": "обложка", "backgroundColor": "#ffffff" }, "обновления": { «fallbackToCacheTimeout»: 0, "url": "https://u.expo.dev" }, "плагины": [ [ "выставка изображений", { "photosPermission": "Приложение получает доступ к вашим фотографиям, чтобы вы могли загружать документы.", "cameraPermission": "Это приложение получает доступ к вашей камере, чтобы вы могли загружать документы." } ], [ "экспо-экранная ориентация", { "initialOrientation": "PORTRAIT_UP" } ], «Сторожевой-экспо» ], "крючки": { "постПубликация": [ { "file": "sentry-expo/upload-sourcemaps", "конфигурация": { "организация": "импульс-солнечный-bx", "project": "приложение для продаж" } } ] }, "assetBundlePatterns": ["**/*"], "ios": { «поддерживает планшет»: правда, "bundleIdentifier": "com.momentum.salesmvp", "инфоПлист": { "UISupportedInterfaceOrientations": [ "UIInterfaceOrientationLandscapeRight", "UIInterfaceOrientationLandscapeLeft", «UIInterfaceOrientationPortrait» ], "UISupportedInterfaceOrientations~ipad": [ "UIInterfaceOrientationLandscapeRight", "UIInterfaceOrientationLandscapeLeft", "UIDeviceOrientationPortrait", «UIDeviceOrientationPortraitUpsideDown» ] } }, "андроид": { "адаптивныйIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#FFFFFF" }, "permissions": ["android.permission.RECORD_AUDIO"], "package": "com.momentum.salesmvp" }, "паутина": { "favicon": "./assets/favicon.png" }, "packagerOpts": { "config": "metro.config.js", "sourceExts": ["js", "jsx", "ts", "tsx", "svg"] }, "runtimeVersion": { "policy": "sdkVersion" }, "дополнительный": { } } } Если бы кто-нибудь мог указать мне правильное направление, я был бы очень признателен!
Что я пробовал:
[*]
Я пробовал удалить файл package-lock.json и переустановить модули узлов.
[*]
Я пробовал запустить expo-doctor --fix
[*]
Я пытался запустить приложение через Expo Go на своем iPhone вместо iPad.
[*]
Я также попробовал переместить оператор импорта import * as Notifications из «expo-notifications» непосредственно в файл App.js, чтобы убедиться, что он действительно вызывает сбой.
[*]
Я попробовал обновить уведомления об выставках до версии 20 и откатиться до версии 18.
[*]
Наконец, я создал совершенно новое приложение Expo и установил те же версии и зависимости. И он отлично работает на моем iPhone и iPad через Expo Go. Я просто не понимаю, почему это не работает в существующем проекте.