如何在Flutter应用中读取用户GAID?有无可靠原生解决方案?
在Flutter中读取GAID的原生解决方案
如果你不想依赖第三方包,可以通过MethodChannel对接Android和iOS的原生API实现GAID读取,全程支持空安全,具体步骤如下:
Android 端实现
- 添加依赖
在android/app/build.gradle的dependencies块中添加Google广告服务依赖:
dependencies { // 请使用最新稳定版 implementation 'com.google.android.gms:play-services-ads:22.6.0' }
- 实现原生方法
在MainActivity.kt(或Java)中通过MethodChannel处理Flutter的调用:
import com.google.android.gms.ads.identifier.AdvertisingIdClient import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private val CHANNEL = "com.example.gaid/channel" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "getGAID") { try { val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext) val gaid = adInfo.id val isLimitAdTrackingEnabled = adInfo.isLimitAdTrackingEnabled result.success(mapOf( "gaid" to gaid, "isLimitAdTrackingEnabled" to isLimitAdTrackingEnabled )) } catch (e: Exception) { result.error("ERROR", "Failed to get GAID", e.message) } } else { result.notImplemented() } } } }
iOS 端实现
- 配置权限和依赖
- 在Xcode中,给项目添加
AdSupport框架(Build Phases -> Link Binary With Libraries) - 在
Info.plist中添加广告追踪权限描述:
<key>NSUserTrackingUsageDescription</key> <string>需要获取广告标识符以提供个性化广告服务</string>
- 实现原生方法
在AppDelegate.swift中对接MethodChannel:
import UIKit import Flutter import AdSupport import AppTrackingTransparency @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { private let CHANNEL = "com.example.gaid/channel" override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { let controller : FlutterViewController = window?.rootViewController as! FlutterViewController let channel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: controller.binaryMessenger) channel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in guard call.method == "getGAID" else { result(FlutterMethodNotImplemented) return } self?.requestTrackingPermissionAndGetGAID(result: result) }) GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } private func requestTrackingPermissionAndGetGAID(result: FlutterResult) { if #available(iOS 14, *) { ATTrackingManager.requestTrackingAuthorization { status in DispatchQueue.main.async { self.getGAID(result: result) } } } else { getGAID(result: result) } } private func getGAID(result: FlutterResult) { let gaid = ASIdentifierManager.shared().advertisingIdentifier.uuidString let isLimitAdTrackingEnabled = ASIdentifierManager.shared().isAdvertisingTrackingEnabled result([ "gaid": gaid, "isLimitAdTrackingEnabled": isLimitAdTrackingEnabled ]) } }
Flutter 端调用
在Dart代码中通过MethodChannel调用原生方法,支持空安全:
import 'package:flutter/services.dart'; class GAIDService { static const MethodChannel _channel = MethodChannel('com.example.gaid/channel'); static Future<Map<String, dynamic>?> getGAID() async { try { final result = await _channel.invokeMethod('getGAID'); return Map<String, dynamic>.from(result); } on PlatformException catch (e) { print('Failed to get GAID: ${e.message}'); return null; } } } // 使用示例 void fetchGAID() async { var gaidData = await GAIDService.getGAID(); if (gaidData != null) { print('GAID: ${gaidData['gaid']}'); print('Limit Ad Tracking: ${gaidData['isLimitAdTrackingEnabled']}'); } }
注意:
- Android端若用户开启了限制广告追踪,获取到的GAID会是匿名ID
- iOS 14+必须先请求追踪权限,否则
isAdvertisingTrackingEnabled会返回false,GAID会是全0的UUID
内容的提问来源于stack exchange,提问作者faccio
相关产品推荐
相关产品推荐

