From 0a5b4e82df3870ed6d2bd76eca79ffb1ddd6e1e0 Mon Sep 17 00:00:00 2001 From: liangyc Date: Sat, 11 Oct 2025 17:47:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(device):=20=E6=B7=BB=E5=8A=A0=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E5=88=9D=E5=A7=8B=E5=8C=96=E8=AE=BE=E5=A4=87UUID?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现隐私合规要求,在用户同意隐私政策后通过initUuid方法初始化设备标识符。修改了iOS和Android原生代码,新增initUuid接口,并重构了JavaScript端的设备信息初始化逻辑。 --- src/android/Device.java | 17 +++++++++-- src/ios/CDVDevice.m | 11 ++++++- www/device.js | 65 +++++++++++++++++++++++------------------ 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/android/Device.java b/src/android/Device.java index 5f80bf6..87f7430 100644 --- a/src/android/Device.java +++ b/src/android/Device.java @@ -46,6 +46,17 @@ public class Device extends CordovaPlugin { 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. * @@ -56,9 +67,6 @@ public class Device extends CordovaPlugin { */ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if ("getDeviceInfo".equals(action)) { - if(Device.uuid == null) { - Device.uuid = this.getUuid(); - } JSONObject r = new JSONObject(); r.put("uuid", Device.uuid); r.put("version", this.getOSVersion()); @@ -70,6 +78,9 @@ public class Device extends CordovaPlugin { r.put("sdkVersion", this.getSDKVersion()); callbackContext.success(r); } + else if("initUuid".equals(action)) { + callbackContext.success(getUuid()); + } else { return false; } diff --git a/src/ios/CDVDevice.m b/src/ios/CDVDevice.m index 7315489..33cc62e 100644 --- a/src/ios/CDVDevice.m +++ b/src/ios/CDVDevice.m @@ -83,6 +83,15 @@ [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 { UIDevice* device = [UIDevice currentDevice]; @@ -92,7 +101,7 @@ @"model": [device modelVersion], @"platform": @"iOS", @"version": [device systemVersion], - @"uuid": [self uniqueAppInstanceIdentifier:device], + @"uuid": @"", @"cordova": [[self class] cordovaVersion], @"isVirtual": @([self isVirtual]), @"isiOSAppOnMac": @([self isiOSAppOnMac]) diff --git a/www/device.js b/www/device.js index 1706c93..93714de 100644 --- a/www/device.js +++ b/www/device.js @@ -25,6 +25,8 @@ var exec = require('cordova/exec'); var cordova = require('cordova'); 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 @@ -41,9 +43,36 @@ function Device () { this.manufacturer = null; this.isVirtual = 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 * @@ -56,35 +85,13 @@ Device.prototype.getInfo = function (successCallback, errorCallback) { }; /** - * 安全合规不允许同意隐私政策前获取AndroidID和IDFV(ios),同意后需要手动调用 - * 需要在platform.ready()前调用 + * 安全合规不允许同意隐私政策前获取AndroidID和IDFV(ios) + * 同意隐私政策后调用该方法初始化设备标识符 */ -Device.prototype.initDeviceInfo = function (errorCallback) { - var me = module.exports; - 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; - // 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); +Device.prototype.initUuid = function(errorCallback) { + exec(function(uuid){ + Device.setUuid(uuid); + }, errorCallback, 'Device', 'initUuid', []); }; module.exports = new Device();