uni-app ios17系统deviceModel 获取设备型号出现 unknown
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平台处理逻辑
}
注意事项
- 设备型号映射:上面的代码示例中只列出了两个设备型号的映射,你需要根据最新的iOS设备列表完善这个映射。
- 权限问题:虽然获取设备型号通常不需要额外的权限,但如果你需要获取更敏感的信息(如序列号),则可能需要用户的明确授权。
- 插件注册:确保你的原生插件已经在
manifest.json
中正确注册,并且已经编译到应用中。
通过这种方式,你可以在iOS 17系统上获取到正确的设备型号,避免返回unknown
。