You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Swift中实现macOS应用通过USB获取已连接iOS设备的完整信息

当然可以用Swift实现这个需求!要获取iOS设备的完整名称、系统版本、UDID以及运营商这些信息,你需要用到苹果的MobileDevice.framework——这是系统内置的、专门用于和iOS设备通信的框架,下面我会给你详细讲具体的实现步骤和代码:

实现步骤

1. 引入MobileDevice.framework

这个框架位于/System/Library/PrivateFrameworks/目录下,你需要手动添加到Xcode项目中:

  • 打开你的macOS项目,进入Build PhasesLink Binary With Libraries
  • 点击+号,选择Add OtherAdd 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

火山引擎 最新活动