uni-app ios17系统deviceModel 获取设备型号出现 unknown

发布于 1周前 作者 gougou168 来自 Uni-App

uni-app ios17系统deviceModel 获取设备型号出现 unknown

类别 信息
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 23H2
HBuilderX类型 正式
HBuilderX版本 3.8.12
手机系统 iOS
手机系统版本 iOS 17
手机厂商 苹果
手机机型 iPhone 15Pro
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

let device = uni.getSystemInfoSync()
console.log(device)
config.header.brand = device.brand || ''
config.header.deviceBrand = device.deviceBrand || ''
config.header.deviceId = device.deviceId
config.header.deviceModel = device.deviceModel
config.header.deviceOrientation = device.deviceOrientation
config.header.devicePixelRatio = device.devicePixelRatio
config.header.deviceType = device.deviceType
config.header.model = device.model
config.header.platform = device.platform
config.header.system = device.system

操作步骤:

let device = uni.getSystemInfoSync()
console.log(device)
config.header.brand = device.brand || ''
config.header.deviceBrand = device.deviceBrand || ''
config.header.deviceId = device.deviceId
config.header.deviceModel = device.deviceModel
config.header.deviceOrientation = device.deviceOrientation
config.header.devicePixelRatio = device.devicePixelRatio
config.header.deviceType = device.deviceType
config.header.model = device.model
config.header.platform = device.platform
config.header.system = device.system

预期结果:

"deviceModel": "iPhone 15Pro",
"model": "iPhone 15Pro",

实际结果:

"deviceModel": "Unknown",
"model": "Unknown",

bug描述:

uni.getSystemInfoSync().deviceModel 获取设备型号出现 unknown


2 回复

更新最新版的HBuilderX


在iOS 17系统中,uni-app 框架可能会遇到获取设备型号 (deviceModel) 返回 unknown 的问题。这通常是由于系统权限或API变更导致的。在iOS设备上,获取设备信息涉及到一些系统级的API,这些API可能会随着iOS版本的更新而发生变化。

以下是一个尝试通过原生插件(或自定义原生模块)来获取设备型号的示例代码,这里假设你已经熟悉如何在uni-app中集成原生插件。由于uni-app本身可能无法直接访问到所有iOS设备信息,我们需要通过原生代码来获取这些信息,并通过JSBridge传递回uni-app

iOS原生代码(Objective-C)

首先,创建一个iOS原生插件,用于获取设备型号。

// MyDevicePlugin.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface MyDevicePlugin : NSObject

+ (NSString *)getDeviceModel;

@end
// MyDevicePlugin.m
#import "MyDevicePlugin.h"
#import <sys/utsname.h>

@implementation MyDevicePlugin

+ (NSString *)getDeviceModel {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    
    // 对于iOS设备,我们需要进一步映射machine字段到用户友好的设备型号
    if ([deviceModel isEqualToString:@"iPhone14,3"]) {
        deviceModel = @"iPhone 13 Pro";
    } else if ([deviceModel isEqualToString:@"iPhone14,7"]) {
        deviceModel = @"iPhone 13 Pro Max";
    }
    // ... 添加更多设备型号映射 ...
    
    return deviceModel;
}

@end

JavaScript代码(uni-app)

uni-app中,通过JSBridge调用原生插件的方法。

// 在需要获取设备型号的地方调用
if (uni.getSystemInfoSync().platform === 'ios') {
    plus.bridge.exec('MyDevicePlugin', 'getDeviceModel', [], function(result) {
        console.log('Device Model:', result);
    }, function(error) {
        console.error('Failed to get device model:', error);
    });
} else {
    // 非iOS平台处理逻辑
}

注意事项

  1. 设备型号映射:上面的代码示例中只列出了两个设备型号的映射,你需要根据最新的iOS设备列表完善这个映射。
  2. 权限问题:虽然获取设备型号通常不需要额外的权限,但如果你需要获取更敏感的信息(如序列号),则可能需要用户的明确授权。
  3. 插件注册:确保你的原生插件已经在manifest.json中正确注册,并且已经编译到应用中。

通过这种方式,你可以在iOS 17系统上获取到正确的设备型号,避免返回unknown

回到顶部