Реалізація UWB Find My (точний пошук предметів) у мобільному додатку
AirTag працює саме так: iPhone з U1-чипом направляє користувача стрілкою прямо на потеряний предмет з точністю до 10 сантиметрів. Це Precision Finding через UWB, та Apple відкрила цей API для сторонніх акцесуарів через Find My Network Accessory Program. Аналогічний досвід можна реалізувати у власному додатку — для трекерів інструментів, медичних пристроїв, промислового обладнання.
Два сценарії: Find My сеть vs автономний UWB
Принципово різні підходи:
Find My Network — трекер реєструється у Apple Find My мережі. Будь-який iPhone поруч анонімно відправляє місцезнаходження трекера на сервери Apple. Користувач бачить трекер на карті у додатку Locator. Proximity Precision Finding через UWB при знаходженні поруч. Вимагає: MFi Find My Network Accessory Program (платна, через Apple), спеціфічний Bluetooth-чип з Apple H2 або сумісним.
Автономний UWB-пошук — тільки коли телефон та трекер поруч. Без глобального трекінгу через чужі пристрої. Вимагає: UWB-чип у трекері (Qorvo DW3000, NXP SR150), підтримка NearbyInteraction на iPhone (U1-чип). Цей сценарій доступний без MFi-програми.
Для більшості B2B-завдань (пошук інструментів на стройці, трекінг медоборудування у лікарні) підходить автономний UWB.
iOS: Precision Finding через NearbyInteraction
import NearbyInteraction
import CoreBluetooth
class ItemFinderSession: NSObject {
private var niSession: NISession?
private var currentDistance: Float = 0
private var currentDirection: SIMD3<Float>?
func startFinding(accessoryToken: Data, bluetoothId: UUID) {
niSession = NISession()
niSession?.delegate = self
niSession?.delegateQueue = .main
let config = NINearbyAccessoryConfiguration(
accessoryData: accessoryToken,
bluetoothPeerIdentifier: bluetoothId
)
niSession?.run(config)
}
}
extension ItemFinderSession: NISessionDelegate {
func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject]) {
guard let obj = nearbyObjects.first else { return }
if let distance = obj.distance {
currentDistance = distance
// Оновлюємо UI: відстань до предмета
updateDistanceDisplay(meters: distance)
}
if let direction = obj.direction {
currentDirection = direction
// direction — одиничний вектор у ARKit coordinate space
// direction.x: влево-вправо, direction.y: вверх-вниз, direction.z: вперед-назад
updateDirectionalArrow(direction: direction)
}
}
func session(_ session: NISession, didUpdateAlgorithmConvergence convergence: NIAlgorithmConvergence, for object: NINearbyObject?) {
// convergence.status: .converged / .notConverged([reasons])
// При notConverged — просимо користувача повести телефоном
handleConvergence(convergence.status)
}
}
convergence.status — критично для UX. UWB-алгоритм вимагає кількох секунд руху телефона для визначення напрямку. Якщо користувач стоїть нерухомо, direction не буде визначена. При .notConverged(.insufficientMovement) показуємо анімацію "підвигайте телефоном".
Стрілка-напрямок: ARKit vs UIKit
ARKit підхід (як AirTag): стрілка рендериться у AR-просторі, привязана до реального світу. Використовує ARWorldTrackingConfiguration + NINearbyObject.direction для вирахування положення предмета в AR-сцені. Найбільш іммерсивний UX.
UIKit підхід: звичайна стрілка на екрані, повертається за компасом з урахуванням напрямку від NearbyInteraction. Простіше в реалізації, працює у будь-якому оточенні без AR-ініціалізації.
// UIKit стрілка через CMMotionManager + NearbyInteraction direction
func updateArrow(direction: SIMD3<Float>) {
// Конвертуємо UWB-вектор в кут на екрані
let angle = atan2(direction.x, -direction.z) // кут у горизонтальній площині
let deviceHeading = motionManager.deviceMotion?.attitude.yaw ?? 0
let arrowAngle = angle - Float(deviceHeading)
arrowImageView.transform = CGAffineTransform(rotationAngle: CGFloat(arrowAngle))
}
Відстань → інтенсивність вібрації: UIImpactFeedbackGenerator(style: .heavy) при < 0.3 м, .medium при 0.3–1 м. Тактильна зворотна зв'язок — стандарт для пошуку предметів.
Трекер на базі DW3000
Для автономного UWB-трекера без MFi: Qorvo DWM3001C development module — готовий UWB-трансивер з BLE для початкового handshake. Прошивка реалізує UWB Initiator role, обмінюється токеном по BLE, відповідає на TWR-запроси від телефона.
На Android: androidx.core.uwb:uwb + власний трекер з підтримкою FiRa Consortium специфікації. Ті ж принципи, інший API:
val rangingParams = UwbRangingParameters(
uwbConfigType = UwbRangingParameters.CONFIG_UNICAST_DS_TWR,
complexChannel = controllerScope.uwbComplexChannel,
peerDevices = listOf(UwbDevice.createForAddress(trackerUwbAddress)),
updateRateType = UwbRangingParameters.RANGING_UPDATE_RATE_FREQUENT,
sessionKeyInfo = sharedSessionKey
)
Строки
Мобільний додаток з UWB Precision Finding (при наявності UWB-трекера): 1–3 тижні. Розробка прошивки трекера на DW3000 + мобільний додаток: 1–3 місяці. Стоимость визначається вимогами до аппаратної частини та кількістю підтримуваних пристроїв.







