-
Notifications
You must be signed in to change notification settings - Fork 4
Description
MindboxSdk.getDeviceUUID возвращает 0000-0000 на некоторых Android-устройствах, хотя другие методы SDK работают нормально
Описание
Столкнулся с непоследовательным поведением MindboxSdk.getDeviceUUID на Android.
На некоторых устройствах getDeviceUUID всегда возвращает:
0000-0000
При этом другие методы Mindbox SDK на тех же устройствах работают корректно:
MindboxSdk.getTokens(...)→ возвращает валидный push-токенMindboxSdk.getSdkVersion(...)→ возвращает корректную версию SDK- Push-уведомления приходят нормально
На других устройствах getDeviceUUID возвращает валидный UUID как ожидалось.
Окружение
-
Платформа: React Native (Android) "react-native": "0.74.0",
-
Mindbox SDK: "mindbox-sdk": "^2.14.1",
-
Инициализация:
MindboxSdk.initialize(...)вызывается из JS
-
Firebase push-сервисы настроены и работают корректно
Шаги для воспроизведения
Было предпринято множество разных попыток получения валидного UUID, за основу был взят пример (https://github.com/mindbox-cloud/react-native-sdk/blob/develop/example/exampleApp/) из документации с официального сайта:
Пример 1:
import React, { useEffect, useRef, useState } from 'react'
import {
SafeAreaView,
StyleSheet,
Text,
View,
Platform,
Button,
} from 'react-native'
import MindboxSdk, { LogLevel } from 'mindbox-sdk'
import { requestNotificationPermission } from './src/utils1/RequestPermission'
import { chooseInappCallback, RegisterInappCallback } from './src/utils1/InAppCallbacks'
const configuration = {
domain: 'api.mindbox.ru',
endpointId:
Platform.OS === 'ios'
? .....'
: .......',
subscribeCustomerIfCreated: true,
shouldCreateCustomer: true,
}
const POLL_INTERVAL = 1000
const MAX_ATTEMPTS = 10
const App = () => {
const initializedRef = useRef(false)
const pollAttemptsRef = useRef(0)
const [deviceUUID, setDeviceUUID] = useState('Loading...')
const [token, setToken] = useState('Loading...')
const [sdkVersion, setSdkVersion] = useState('Loading...')
useEffect(() => {
const bootstrap = async () => {
if (initializedRef.current) return
initializedRef.current = true
try {
MindboxSdk.setLogLevel(LogLevel.DEBUG)
await requestNotificationPermission()
await MindboxSdk.initialize(configuration)
chooseInappCallback(RegisterInappCallback.DEFAULT)
pollDeviceUUID()
} catch (e) {
console.error('Mindbox bootstrap error', e)
}
}
bootstrap()
}, [])
const pollDeviceUUID = () => {
MindboxSdk.getDeviceUUID((uuid: string) => {
console.log('[Mindbox] UUID attempt:', uuid)
if (uuid && !uuid.startsWith('0000')) {
setDeviceUUID(uuid)
MindboxSdk.getTokens(setToken)
MindboxSdk.getSdkVersion(setSdkVersion)
return
}
pollAttemptsRef.current += 1
if (pollAttemptsRef.current < MAX_ATTEMPTS) {
setTimeout(pollDeviceUUID, POLL_INTERVAL)
} else {
console.warn('[Mindbox] UUID not resolved after retries:', uuid)
setDeviceUUID(uuid) // что есть — то есть
}
})
}
return (
<SafeAreaView style={styles.container}>
<View style={styles.textContainer}>
<Text style={styles.text}>{`Device UUID: ${deviceUUID}`}</Text>
<Text style={styles.text}>{`Token: ${token}`}</Text>
<Text style={styles.text}>{`SdkVersion: ${sdkVersion}`}</Text>
</View>
<View style={styles.buttonsContainer}>
<Button title="OK" onPress={() => {}} />
</View>
</SafeAreaView>
)
}
const styles = StyleSheet.create({
....
})
export default AppПример 2:
import React, { useEffect, useRef, useState } from 'react'
import {
SafeAreaView,
StyleSheet,
Text,
View,
Platform,
Button,
} from 'react-native'
import MindboxSdk, { LogLevel } from 'mindbox-sdk'
import { requestNotificationPermission } from './src/utils1/RequestPermission'
import { chooseInappCallback, RegisterInappCallback } from './src/utils1/InAppCallbacks'
const configuration = {
domain: 'api.mindbox.ru',
endpointId:
Platform.OS === 'ios'
? .....'
: .......',
subscribeCustomerIfCreated: true,
shouldCreateCustomer: true,
}
const App = () => {
const initializedRef = useRef(false)
const [deviceUUID, setDeviceUUID] = useState('Loading...')
const [token, setToken] = useState('Loading...')
const [sdkVersion, setSdkVersion] = useState('Loading...')
useEffect(() => {
const bootstrap = async () => {
// 🛑 защита от повторного запуска
if (initializedRef.current) {
return
}
initializedRef.current = true
try {
MindboxSdk.setLogLevel(LogLevel.DEBUG)
await requestNotificationPermission()
await MindboxSdk.initialize(configuration)
MindboxSdk.getDeviceUUID((uuid: string) => {
setDeviceUUID(uuid)
MindboxSdk.getTokens((t: string) => {
setToken(t)
MindboxSdk.getSdkVersion((version: string) => {
setSdkVersion(version)
})
})
})
chooseInappCallback(RegisterInappCallback.DEFAULT)
} catch (e) {
console.error('Mindbox bootstrap error:', e)
}
}
bootstrap()
}, [])
return (
<SafeAreaView style={styles.container}>
<View style={styles.textContainer}>
<Text style={styles.text}>{`Device UUID: ${deviceUUID}`}</Text>
<Text style={styles.text}>{`Token: ${token}`}</Text>
<Text style={styles.text}>{`SdkVersion: ${sdkVersion}`}</Text>
</View>
<View style={styles.buttonsContainer}>
<Button title="Go to notification center" onPress={() => {}} />
</View>
</SafeAreaView>
)
}
const styles = StyleSheet.create({
...
})
export default Appи так далее...
Фактический результат
0000-0000
Возвращается постоянно, даже после:
- перезапуска приложения
- ожидания нескольких секунд/минут
- успешного получения push-токена
- успешной инициализации SDK
Ожидаемый результат
getDeviceUUID в конечном итоге должен возвращать валидный UUID, аналогично другим устройствам, и быть согласованным с состоянием SDK.
Дополнительные наблюдения
getDeviceUUIDможет оставаться0000-0000-0000-0000бесконечно на некоторых устройствах- Ошибок или предупреждений в логах нет
- Уровень логирования SDK установлен в
DEBUG - Проблема не наблюдается на всех устройствах и не является детерминированной
- Похоже на зависимость от устройства
Вопросы
Как можно решить данную проблему?