Эта библиотека позволяет генерировать уникальный идентификатор устройства (Machine ID) на iOS, используя Keychain.
Особенности реализации:
- Идентификатор генерируется как
SHA256(Nanoid + Timestamp)и сохраняется в Keychain. - При переустановке приложения ID сохраняется (на реальных устройствах).
- Для разделения ID между разными приложениями используется
Service Name.
В репозитории подготовлен пример готового приложения.
- Откройте папку
ios_exampleв Xcode. - Выберите симулятор или реальное устройство.
- Нажмите Run (▶).
Если вы создаете новый проект или интегрируете библиотеку в существующий:
Если у вас нет файла Mid.xcframework, соберите его:
chmod +x build_ios.sh
./build_ios.shПосле сборки в корне появится папка Mid.xcframework.
- Откройте ваш проект в Xcode.
- Перетащите файл
Mid.xcframeworkв навигатор проекта (левая панель).- В появившемся окне поставьте галочку "Copy items if needed".
- Нажмите на настройки вашего Таргета (Target) -> вкладка General.
- В разделе Frameworks, Libraries, and Embedded Content найдите
Mid.xcframework. - Установите опцию "Do Not Embed".
- Важно: Библиотека статическая, поэтому Embed не нужен.
Для работы Swift с Rust-библиотекой нужна небольшая обертка. Создайте файл MidManager.swift и добавьте туда следующий код:
import Foundation
import Mid // Если Xcode не видит модуль, убедитесь, что фреймворк добавлен в Target
class MidManager {
/// Получить хеш устройства (Machine ID)
/// - Parameter serviceName: Уникальное имя сервиса для Keychain (например, "com.myapp.mid").
static func get(serviceName: String) -> String? {
guard let cServiceName = serviceName.cString(using: .utf8) else { return nil }
// Вызов C-функции из библиотеки Rust
guard let resultPtr = mid_get(cServiceName) else { return nil }
let mid = String(cString: resultPtr)
mid_free_string(resultPtr) // Освобождение памяти Rust
return mid
}
}Пример использования в SwiftUI:
import SwiftUI
struct ContentView: View {
@State private var machineID: String = "..."
let serviceName = "io.github.doroved.mid.example" // Уникальный ID вашего сервиса
var body: some View {
VStack {
Text("Machine ID:").font(.headline)
Text(machineID).padding()
}
.onAppear {
if let mid = MidManager.get(serviceName: serviceName) {
machineID = mid
}
}
}
}- Симулятор: При удалении приложения с симулятора Keychain обычно сбрасывается. При повторной установке ID может измениться.
- Реальное устройство: Это самый надежный тест. Keychain сохраняется даже после удаления приложения. Если вы удалите приложение и установите его снова (с тем же
serviceName), библиотека вернет тот же самый ID.
