9
0

feat(device): 添加延迟初始化设备UUID的功能

实现隐私合规要求,在用户同意隐私政策后通过initUuid方法初始化设备标识符。修改了iOS和Android原生代码,新增initUuid接口,并重构了JavaScript端的设备信息初始化逻辑。
This commit is contained in:
2025-10-11 17:47:43 +08:00
parent 1d2edfa557
commit 0a5b4e82df
3 changed files with 60 additions and 33 deletions

View File

@@ -46,6 +46,17 @@ public class Device extends CordovaPlugin {
public Device() { public Device() {
} }
/**
* Sets the context of the Command. This can then be used to do things like
* get file paths associated with the Activity.
*
* @param cordova The context of the main Activity.
* @param webView The CordovaWebView Cordova is running in.
*/
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
super.initialize(cordova, webView);
}
/** /**
* Executes the request and returns PluginResult. * Executes the request and returns PluginResult.
* *
@@ -56,9 +67,6 @@ public class Device extends CordovaPlugin {
*/ */
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if ("getDeviceInfo".equals(action)) { if ("getDeviceInfo".equals(action)) {
if(Device.uuid == null) {
Device.uuid = this.getUuid();
}
JSONObject r = new JSONObject(); JSONObject r = new JSONObject();
r.put("uuid", Device.uuid); r.put("uuid", Device.uuid);
r.put("version", this.getOSVersion()); r.put("version", this.getOSVersion());
@@ -70,6 +78,9 @@ public class Device extends CordovaPlugin {
r.put("sdkVersion", this.getSDKVersion()); r.put("sdkVersion", this.getSDKVersion());
callbackContext.success(r); callbackContext.success(r);
} }
else if("initUuid".equals(action)) {
callbackContext.success(getUuid());
}
else { else {
return false; return false;
} }

View File

@@ -83,6 +83,15 @@
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
} }
- (void)initUuid:(CDVInvokedUrlCommand*)command
{
UIDevice* device = [UIDevice currentDevice];
NSString* uuid = [self uniqueAppInstanceIdentifier:device];
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:uuid];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
- (NSDictionary*)deviceProperties - (NSDictionary*)deviceProperties
{ {
UIDevice* device = [UIDevice currentDevice]; UIDevice* device = [UIDevice currentDevice];
@@ -92,7 +101,7 @@
@"model": [device modelVersion], @"model": [device modelVersion],
@"platform": @"iOS", @"platform": @"iOS",
@"version": [device systemVersion], @"version": [device systemVersion],
@"uuid": [self uniqueAppInstanceIdentifier:device], @"uuid": @"",
@"cordova": [[self class] cordovaVersion], @"cordova": [[self class] cordovaVersion],
@"isVirtual": @([self isVirtual]), @"isVirtual": @([self isVirtual]),
@"isiOSAppOnMac": @([self isiOSAppOnMac]) @"isiOSAppOnMac": @([self isiOSAppOnMac])

View File

@@ -25,6 +25,8 @@ var exec = require('cordova/exec');
var cordova = require('cordova'); var cordova = require('cordova');
channel.createSticky('onCordovaInfoReady'); channel.createSticky('onCordovaInfoReady');
// Tell cordova channel to wait on the CordovaInfoReady event
channel.waitForInitialization('onCordovaInfoReady');
/** /**
* This represents the mobile device, and provides properties for inspecting the model, version, UUID of the * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
@@ -41,9 +43,36 @@ function Device () {
this.manufacturer = null; this.manufacturer = null;
this.isVirtual = null; this.isVirtual = null;
this.serial = null; this.serial = null;
this.isiOSAppOnMac = null;
var me = this;
channel.onCordovaReady.subscribe(function () {
me.getInfo(function (info) {
// ignoring info.cordova returning from native, we should use value from cordova.version defined in cordova.js
// TODO: CB-5105 native implementations should not return info.cordova
var buildLabel = cordova.version;
me.available = true;
me.platform = info.platform;
me.version = info.version;
me.uuid = info.uuid;
me.cordova = buildLabel;
me.model = info.model;
me.isVirtual = info.isVirtual;
me.manufacturer = info.manufacturer || 'unknown';
me.serial = info.serial || 'unknown';
channel.onCordovaInfoReady.fire();
}, function (e) {
me.available = false;
console.error('[ERROR] Error initializing Cordova: ' + e);
});
});
} }
Device.setUuid = function(uuid) {
var instance = module.exports;
instance.uuid = uuid;
};
/** /**
* Get device info * Get device info
* *
@@ -56,35 +85,13 @@ Device.prototype.getInfo = function (successCallback, errorCallback) {
}; };
/** /**
* 安全合规不允许同意隐私政策前获取AndroidID和IDFV(ios),同意后需要手动调用 * 安全合规不允许同意隐私政策前获取AndroidID和IDFV(ios)
* 需要在platform.ready()前调用 * 同意隐私政策后调用该方法初始化设备标识符
*/ */
Device.prototype.initDeviceInfo = function (errorCallback) { Device.prototype.initUuid = function(errorCallback) {
var me = module.exports; exec(function(uuid){
me.getInfo(function (info) { Device.setUuid(uuid);
// ignoring info.cordova returning from native, we should use value from cordova.version defined in cordova.js }, errorCallback, 'Device', 'initUuid', []);
// TODO: CB-5105 native implementations should not return info.cordova
var buildLabel = cordova.version;
me.available = true;
me.platform = info.platform;
me.version = info.version;
me.uuid = info.uuid;
me.cordova = buildLabel;
me.model = info.model;
me.isVirtual = info.isVirtual;
// isiOSAppOnMac is iOS specific. If defined, it will be appended.
if (info.isiOSAppOnMac !== undefined) {
me.isiOSAppOnMac = info.isiOSAppOnMac;
}
me.manufacturer = info.manufacturer || 'unknown';
me.serial = info.serial || 'unknown';
// SDK Version is Android specific. If defined, it will be appended.
if (info.sdkVersion !== undefined) {
me.sdkVersion = info.sdkVersion;
}
channel.onCordovaInfoReady.fire();
}, errorCallback);
}; };
module.exports = new Device(); module.exports = new Device();