原生游戏无论是提供给后端统计玩家机型信息、或者是方便给测试提供信息都会在游戏注册或者登录时统计设备型号以及系统型号。
由于这一需求并不是所有用户都需要,cocos并未提供相关API去获取信息。
这里分别针对IOS和Android去获取机型和系统版本号。这里使用的是引擎是3.11.1版本、js语言
使用JSB分别调用OC和Java的方法来实现。
1.首先在platform/CCDevice.h头文件public中添加函数声明
const static char * getApp_version();//获取版本号
const static char * getDeviceModel();//获取机型
2.然后分别添加IOS和Android的实现
FOR IOS:
platform/ios/CCDevice-ios.mm文件中添加函数定义:
const static (NSString *)getApp_version(){
NSString *strSysVersion = [[UIDevice currentDevice] systemVersion];
return [strSysVersion UTF8String];
}
const static (NSString *) getDeviceModel(){
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
const char * model = [deviceString UTF8String];
return model;
}
注意:上述IOS中获取的机型是IOS内部的机型编号,并不是我们认知的机型。
例如获取到的机型为”iPhone7,2”,但是其实这个编号对应的是iPhone6手机。
我这里的做法是,在JS中取翻译一遍。(可能有人会疑惑、这里为什么不直接做在IOS中,因为我们做在JS中可以热更新啊!如果做在IOS中再出一个新手机型号、那不就得重新打包了吗?)
这里给出目前为止所有对应的型号(JSON格式):
var iosSystemVersion = {
"i386":"iPhone Simulator","x86_64":"iPhone Simulator",
"iPhone1,1":"iPhone 2G","iPhone1,2":"iPhone 3G",
"iPhone2,1":"iPhone 3GS",
"iPhone3,1":"iPhone 4","iPhone3,2":"iPhone 4","iPhone3,3":"iPhone 4",
"iPhone4,1":"iPhone 4S",
"iPhone5,1":"iPhone 5","iPhone5,2":"iPhone 5","iPhone5,3":"iPhone 5c","iPhone5,4":"iPhone 5c",
"iPhone6,1":"iPhone 5s","iPhone6,2":"iPhone 5s",
"iPhone7,1":"iPhone 6 Plus","iPhone7,2":"iPhone 6",
"iPhone8,1":"iPhone 6s","iPhone8,2":"iPhone 6s Plus","iPhone8,4":"iPhone SE",
"iPhone9,1":"iPhone 7","iPhone9,2":"iPhone 7 Plus","iPhone9,3":"iPhone 7","iPhone9,4":"iPhone 7 Plus",
"iPhone10,1":"iPhone 8","iPhone10,2":"iPhone 8 Plus","iPhone10,3":"iPhone X","iPhone10,4":"iPhone 8","iPhone10,5":"iPhone 8 Plus","iPhone10.6":"iPhone X",
"iPod1,1":"iPod Touch 1G","iPod2,1":"iPod Touch 2G","iPod3,1":"iPod Touch 3G","iPod4,1":"iPod Touch 4G","iPod5,1":"iPod Touch 5G",
"iPad1,1":"iPad",
"iPad2,1":"iPad 2","iPad2,2":"iPad 2","iPad2,3":"iPad 2","iPad2,4":"iPad 2","iPad2,5":"iPad mini","iPad2,6":"iPad mini","iPad2,7":"iPad mini",
"iPad3,1":"iPad 3","iPad3,2":"iPad 3","iPad3,3":"iPad 3","iPad3,4":"iPad 4","iPad3,5":"iPad 4","iPad3,6":"iPad 4"
};
这样就可以翻译过来了,这里如要添加的话也非常方便。
FOR Android:
在proj.android\src\org\cocos2dx\javascript目录下添加SystemUtils.java文件。
package org.cocos2dx.javascript;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.os.Environment;
public class SystemUtils{
public static String getVersion()throws IOException{
String[] versions = {"ro.build.version.incremental","ro.build.version.emui","ro.vivo.os.version","ro.build.version.opporom","ro.build.sense.version","ro.rom.version","ro.build.display.id","ro.modversion"};
Properties properties = new Properties();
properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
String property="";
String pattern = ".*[^\\.](\\d+\\.\\d+\\.\\d).*";
Pattern r = Pattern.compile(pattern);
for(int i=0;i<versions.length;i++){
property = properties.getProperty(versions[i]);
if(property!=null){
Matcher m = r.matcher(property);
if(m.find())
return properties.getProperty("ro.product.model")+"("+m.group(1)+")";
}
}
return properties.getProperty("ro.product.model")+"("+properties.getProperty("ro.build.version.release")+")";
}
}
Android可取到的机型信息包括华为、小米、三星、vivo、OPPO、魅族、Lenovo、htc、一加 (这可是我的一位Android大神顺子同学积累贡献的)
3.这些代码都码好了之后,还有一步是对应IOS的,因为CCDevice中新添加了函数,所有需要重新做一下JSB的绑定。(绑定请自行爬楼)
4.对应上述方法的调用
var getDevice = function(){
var device;
if(cc.sys.os==cc.sys.OS_ANDROID){
device = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/SystemUtils","getVersion","()Ljava/lang/String;");
}else if(cc.sys.os==cc.sys.OS_IOS){
device = iosSystemVersion[cc.Device.getDeviceModel()]+"("+cc.Device.getApp_version()+")";
}else{
device = cc.sys.os;
}
return device;
}
device的结果样式为 例:Redmi Note 4X(9.0.5), Iphone6(9.3.1)