如何在Swift中实现macOS应用通过USB获取已连接iOS设备的完整信息
当然可以用Swift实现这个需求!要获取iOS设备的完整名称、系统版本、UDID以及运营商这些信息,你需要用到苹果的MobileDevice.framework——这是系统内置的、专门用于和iOS设备通信的框架,下面我会给你详细讲具体的实现步骤和代码:
实现步骤
1. 引入MobileDevice.framework
这个框架位于/System/Library/PrivateFrameworks/目录下,你需要手动添加到Xcode项目中:
- 打开你的macOS项目,进入Build Phases → Link Binary With Libraries
- 点击
+号,选择Add Other → Add Files - 导航到上述路径,选中
MobileDevice.framework并添加 - 确保框架的Status设置为
Optional(避免某些旧系统版本可能的兼容性问题)
2. 配置权限
macOS要求app申请权限才能访问外部设备,所以需要在Info.plist中添加以下键值对:
<key>NSAppleEventsUsageDescription</key> <string>需要访问连接的iOS设备以获取设备信息</string>
这个描述会在用户第一次打开app时显示,说明你为什么需要访问设备权限。
3. 编写Swift代码获取设备信息
首先,我们可以定义一个结构体来存储设备信息,让代码更清晰:
struct iOSDeviceInfo { let fullName: String // 完整设备名称,比如"John的iPhone" let iosVersion: String // iOS版本,比如"17.0.3" let deviceID: String // 设备UDID let carrierName: String? // 运营商名称(仅蜂窝设备有值) let modelName: String // 设备型号,比如"iPhone 14 Pro" }
接下来,编写核心函数来获取已连接的iOS设备:
import Foundation import MobileDevice func fetchConnectediOSDevices() -> [iOSDeviceInfo] { var devices: [iOSDeviceInfo] = [] // 初始化MobileDevice框架 guard MDInitialize() == MDERR_OK else { print("初始化MobileDevice框架失败") return devices } // 获取已连接的设备列表 var deviceList: Unmanaged<CFArray>? let result = MDGetDevices(&deviceList) guard result == MDERR_OK, let list = deviceList?.takeRetainedValue() as? [MDDeviceRef] else { print("获取设备列表失败") return devices } // 遍历每个设备提取信息 for device in list { // 获取设备UDID let udid = MDGetDeviceUniqueID(device) as String // 获取完整设备名称 var nameRef: Unmanaged<CFString>? MDGetDeviceName(device, &nameRef) let fullName = nameRef?.takeRetainedValue() as String? ?? "未知设备" // 获取iOS系统版本 var versionRef: Unmanaged<CFString>? MDGetDeviceOSVersion(device, &versionRef) let iosVersion = versionRef?.takeRetainedValue() as String? ?? "未知版本" // 获取设备型号名称 var modelRef: Unmanaged<CFString>? MDGetDeviceModel(device, &modelRef) let modelName = modelRef?.takeRetainedValue() as String? ?? "未知型号" // 获取运营商名称(仅支持蜂窝网络的设备会返回值) var carrierRef: Unmanaged<CFString>? MDGetDeviceCarrierName(device, &carrierRef) let carrierName = carrierRef?.takeRetainedValue() as String? // 组装设备信息并添加到列表 let deviceInfo = iOSDeviceInfo( fullName: fullName, iosVersion: iosVersion, deviceID: udid, carrierName: carrierName, modelName: modelName ) devices.append(deviceInfo) } return devices }
4. 监听设备连接/断开通知(可选)
如果需要实时监测设备的连接状态,可以注册通知回调:
func setupDeviceConnectionNotifications() { let notificationCallback: MDNotificationCallback = { notificationType, device in let udid = MDGetDeviceUniqueID(device) as String switch notificationType { case kMDNotificationDeviceAttached: print("设备已连接:\(udid)") // 这里可以重新调用fetchConnectediOSDevices()更新设备列表 case kMDNotificationDeviceDetached: print("设备已断开:\(udid)") default: break } } // 注册通知 MDRegisterForDeviceNotifications(notificationCallback, nil, nil) }
注意事项
MobileDevice.framework是苹果未公开文档的私有框架,但系统自带且稳定,不过如果你的app需要提交到Mac App Store,可能会被拒绝(适合企业内部应用或个人使用)。- 确保你的macOS版本支持该框架(一般macOS 10.10+都没问题)。
- 首次运行app时,需要用户授权访问权限,否则无法获取设备信息。
内容的提问来源于stack exchange,提问作者user3673952




