// src/ios-detection.ts export interface IosSupportInfo { isIos: boolean; version: number | null; supportsNfc: boolean; requiresNative: boolean; } /** * Provides detailed information about iOS NFC compatibility */ export class IosDetection { /** * Detects if the current device is running iOS and its NFC capabilities */ static getIosSupportInfo(): IosSupportInfo { const userAgent = navigator.userAgent; // Detect iOS const isIos = /iphone|ipad|ipod/i.test(userAgent); if (!isIos) { return { isIos: false, version: null, supportsNfc: false, requiresNative: false }; } // Extract iOS version const versionMatch = userAgent.match(/OS (\d+)_(\d+)_?(\d+)?/); const version = versionMatch ? parseInt(versionMatch[1], 10) + (parseInt(versionMatch[2], 10) / 10) : null; // iOS NFC support info: // - iOS 11+ supports NFC reading but requires a native app // - No iOS version supports Web NFC API const supportsNfc = version !== null && version >= 11; return { isIos, version, supportsNfc, requiresNative: true // iOS always requires native app for NFC }; } /** * Checks if this device supports NFC in any form (native or web) */ static hasNfcHardware(): boolean { const iosInfo = this.getIosSupportInfo(); if (iosInfo.isIos) { return iosInfo.supportsNfc; } // For Android/other platforms, we check based on the user agent return /android/i.test(navigator.userAgent); } /** * Provides guidance for enabling NFC on iOS */ static getIosNfcGuidance(): string { const iosInfo = this.getIosSupportInfo(); if (!iosInfo.isIos) { return ''; } if (!iosInfo.supportsNfc) { return 'Your iOS device does not support NFC or is running an iOS version below 11.0.'; } return 'NFC on iOS requires a native app. The web browser cannot directly access NFC hardware on iOS devices.'; } }