KaiOS 没有Android上的CarrierConfig运营商定制机制,通常要拿SIM卡信息进行判断定制。
以下是几种获取MCCMNC和GID的方法,基本通过 iccInfo 实现。
应用
B2G原生 mobileConnections + iccManager
可以在应用模块中调用公开接口,如gaia/apps/system
isOpSim() {
let connection = navigator.b2g.mobileConnections;
if (connection[0] && (connection[0].iccId)) {
let iccInfo = navigator.b2g.iccManager.getIccById(connection[0].iccId).iccInfo;
if(!iccInfo) { //卡信息空
return false;
}
let mccmnc = iccInfo.mcc + iccInfo.mnc;
if (mccmnc === '46001') { //运营商对应的MCCMNC判断
//如果有GID需求可选取子串进行比较,因为SIM中可能有多位FF,完全匹配概率小而且不准确。
let gid1 = iccInfo.gid1.substring(0, 2).toUpperCase();
dump('mccmnc = ' + mccmnc + ', gid1 = ' + gid1);
if (gid == "A2" || gid == "F4") {
return true;
}
}
}
return false;
}
定制封装工具
用下节工具类的方法,在其内定义接口暴露给外部应用。
//operator_utils.js
//"u_"或许是util的标志前缀约定
isOp: function u_isOp() {
if (this.getMccMnc() && ("46001".indexOf(this.getMccMnc()) !== -1)) {
dump("u_isOp: gid1 = " + this.getGid1());
let gidUpper = this.getGid1().toUpperCase() + '';
if(gidUpper.indexOf('A2') == 0 || gidUpper.indexOf('B4') == 0) {
return true;
}
}
return false;
},
应用内:
if (value !== null && value !== undefined && OperatorUtils.isOp()) {
value = "customeOpName";
dump("updateUI: carrier = " + value);
}
工具类
在shared APP中暴露工具接口给外部使用,如 gaia/apps/shared/js/utils/operator_utils.js
'use strict';
const OperatorUtils = {
//运营商常量
CMCC_MVNO_MCC_MNC: ['46001'],
simMccMnc: null,
simGid1: null,
simGgid2: null,
buildOpName: null,
simOperatorName: null,
//初始化
init: function t_init() {
this.initBuildOpInfo(); //编译属性值
this.initSimInfo(); //初始化以上MCCMNC+GID等变量值
},
//判断设备是否已插卡
hasSim: function t_hasSim() {
let iccManager = navigator.b2g.iccManager;
if (!iccManager || !iccManager.iccIds) {
return false;
}
return !(0 === iccManager.iccIds.length);
},
//软件版本编译属性值,ro.xxx可以是原生或者OEM定制的系统属性
initBuildOpInfo: function t_initBuildOpInfo() {
if (this.buildOpName === null
&& typeof navigator.b2g.engmodeManager !== 'undefined') {
navigator.b2g.engmodeManager.getPropertyValue('ro.operator.name').then((buildName) => {
dump("[OperatorUtils]initBuildOpInfo: buildOpName = " + buildName);
this.buildOpName = buildName;
});
}
},
//初始化MCCMNC+GID
initMccMnc: function t_initSimInfo() {
if (this.simMccMnc) {
dump("[OperatorUtil]initSimInfo: simMccMnc = " + this.simMccMnc);
return;
}
let iccManager = navigator.b2g.iccManager;
if (!iccManager || !iccManager.iccIds || iccManager.iccIds.length === 0) {
dump("[OperatorUtil]initSimInfo: no SIM card detected");
return;
}
let iccId = iccManager.iccIds[0];
let iccObj = iccManager.getIccById(iccId);
let iccInfo = iccObj ? iccObj.iccInfo : null;
if (iccInfo === null) {
dump("[OperatorUtil]initSimInfo: iccInfo is null");
return;
}
let mcc = iccInfo.mcc;
let mnc = iccInfo.mnc;
this.simMccMnc = mcc + mnc;
this.simGid1 = iccInfo.gid1;
this.simGgid2 = iccInfo.gid2;
dump("[OperatorUtil]initSimInfo: simMccMnc = " + this.simMccMnc
+ ", gid1 = " + this.simGid1 + ", gid2 = " + this.simGgid2);
},
//用于内部逻辑获取MCCMNC,GID实现同理,返回this.simGid1即可
getMccMnc: function t_getMccMnc() {
if (!this.simMccMnc && this.hasSim()) {
this.initMccMnc();
}
return this.simMccMnc;
},
}