Уникальная идентификация устройства iOS ⇐ IOS
-
Гость
Уникальная идентификация устройства iOS
Я хочу получить уникальный идентификатор с устройства iOS, даже если пользователь удалит приложение, а затем переустановит его. Для этого я уже пробовал:
letvendorID = UIDevice.current.identifierForVendor?.uuidString let adIdentifier = ASIdentifierManager.shared().advertisingIdentifier.uuidString и оба возвращают разные номера, когда я удаляю приложение, а затем переустанавливаю его.
Затем я попробовал другой способ, написав в связку ключей и снова прочитав ее:
// KeychainService.swift
import Foundation импорт безопасности класс KeychainService { static let serviceIdentifier = "ИдентификаторИдентификатора вашего приложения" class func saveUUID(_ uuid: String) -> Bool { Guard let data = uuid.data(using: .utf8) else { return false } пусть запрос: [Строка: Любой] = [ kSecClass как строка: kSecClassGenericPassword, kSecAttrService как строка: serviceIdentifier, kSecValueData как строка: данные ] SecItemDelete (запрос как CFDictionary) let status = SecItemAdd (запрос как CFDictionary, ноль) статус возврата == errSecSuccess } классовая функция loadUUID() -> String? { пусть запрос: [Строка: Любой] = [ kSecClass как строка: kSecClassGenericPassword, kSecAttrService как строка: serviceIdentifier, kSecReturnData как строка: kCFBooleanTrue!, kSecMatchLimit как строка: kSecMatchLimitOne ] результат вар: AnyObject? let status = SecItemCopyMatching (запрос как CFDictionary, &result) если статус == errSecSuccess, пусть данные = результат как? Данные, пусть uuid = String(data: data,coding: .utf8) { вернуть UUID } еще { вернуть ноль } } } /// UUIDModule.swift
import Foundation импортировать React @objc(UUIDModule) класс UUIDModule: NSObject, RCTBridgeModule { статический функциональный модульName() -> String { вернуть «UUIDModule» } @objc func getUUID(_ uuid: String, разрешение преобразователя: @escaping RCTPromiseResolveBlock, отказ отклонителя: @escaping RCTPromiseRejectBlock) -> Void { если пусть сохраненныйUUID = KeychainService.loadUUID() { разрешить ([storedUUID]) } еще { пусть newUUID = UUID().uuidString если KeychainService.saveUUID(newUUID) { разрешить ([новыйUUID]) } еще { ignore("KeychainError", "Не удалось сохранить UUID в связке ключей", ноль) } } } } Это решение тоже не работает.
Есть идеи, как это решить?
Я хочу получить уникальный идентификатор с устройства iOS, даже если пользователь удалит приложение, а затем переустановит его. Для этого я уже пробовал:
letvendorID = UIDevice.current.identifierForVendor?.uuidString let adIdentifier = ASIdentifierManager.shared().advertisingIdentifier.uuidString и оба возвращают разные номера, когда я удаляю приложение, а затем переустанавливаю его.
Затем я попробовал другой способ, написав в связку ключей и снова прочитав ее:
// KeychainService.swift
import Foundation импорт безопасности класс KeychainService { static let serviceIdentifier = "ИдентификаторИдентификатора вашего приложения" class func saveUUID(_ uuid: String) -> Bool { Guard let data = uuid.data(using: .utf8) else { return false } пусть запрос: [Строка: Любой] = [ kSecClass как строка: kSecClassGenericPassword, kSecAttrService как строка: serviceIdentifier, kSecValueData как строка: данные ] SecItemDelete (запрос как CFDictionary) let status = SecItemAdd (запрос как CFDictionary, ноль) статус возврата == errSecSuccess } классовая функция loadUUID() -> String? { пусть запрос: [Строка: Любой] = [ kSecClass как строка: kSecClassGenericPassword, kSecAttrService как строка: serviceIdentifier, kSecReturnData как строка: kCFBooleanTrue!, kSecMatchLimit как строка: kSecMatchLimitOne ] результат вар: AnyObject? let status = SecItemCopyMatching (запрос как CFDictionary, &result) если статус == errSecSuccess, пусть данные = результат как? Данные, пусть uuid = String(data: data,coding: .utf8) { вернуть UUID } еще { вернуть ноль } } } /// UUIDModule.swift
import Foundation импортировать React @objc(UUIDModule) класс UUIDModule: NSObject, RCTBridgeModule { статический функциональный модульName() -> String { вернуть «UUIDModule» } @objc func getUUID(_ uuid: String, разрешение преобразователя: @escaping RCTPromiseResolveBlock, отказ отклонителя: @escaping RCTPromiseRejectBlock) -> Void { если пусть сохраненныйUUID = KeychainService.loadUUID() { разрешить ([storedUUID]) } еще { пусть newUUID = UUID().uuidString если KeychainService.saveUUID(newUUID) { разрешить ([новыйUUID]) } еще { ignore("KeychainError", "Не удалось сохранить UUID в связке ключей", ноль) } } } } Это решение тоже не работает.
Есть идеи, как это решить?
Мобильная версия