You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter应用中读取用户GAID?有无可靠原生解决方案?

在Flutter中读取GAID的原生解决方案

如果你不想依赖第三方包,可以通过MethodChannel对接Android和iOS的原生API实现GAID读取,全程支持空安全,具体步骤如下:

Android 端实现

  1. 添加依赖
    在android/app/build.gradle的dependencies块中添加Google广告服务依赖:
dependencies {
    // 请使用最新稳定版
    implementation 'com.google.android.gms:play-services-ads:22.6.0'
}
  1. 实现原生方法
    在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 端实现

  1. 配置权限和依赖
  • 在Xcode中,给项目添加AdSupport框架(Build Phases -> Link Binary With Libraries)
  • 在Info.plist中添加广告追踪权限描述:
<key>NSUserTrackingUsageDescription</key>
<string>需要获取广告标识符以提供个性化广告服务</string>
  1. 实现原生方法
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:40:29