Skip to content

MindboxSdk.getDeviceUUID возвращает 0000-0000-0000-0000 на некоторых Android-устройствах, хотя другие методы SDK работают нормально #163

@ydubovitsky

Description

@ydubovitsky

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
  • Проблема не наблюдается на всех устройствах и не является детерминированной
  • Похоже на зависимость от устройства

Вопросы

Как можно решить данную проблему?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions