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

Flutter Android应用:从Google Ads打开时无法捕获UTM参数问题

解决Google Ads打开Flutter Android应用时无法获取UTM参数的问题

1. 检查并完善AndroidManifest的深度链接配置

确保AndroidManifest.xml中对应Activity的Intent Filter正确配置,适配Google Ads的跳转逻辑:

<activity
    android:name=".MainActivity"
    android:exported="true">
    <!-- 普通深度链接配置 -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="https"
            android:host="sss.example.in" />
    </intent-filter>
    <!-- Android App Links配置(推荐,避免浏览器中转) -->
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="https"
            android:host="sss.example.in" />
    </intent-filter>
</activity>
  • 必须设置android:exported="true",否则Android 12+无法接收外部Intent。
  • 配置android:autoVerify="true"后,需在Google Search Console验证域名所有权,确保系统信任该App Links,让Google Ads直接跳转应用并传递完整参数。

2. 在Flutter中全场景处理Intent数据

需要覆盖冷启动和后台唤醒两种场景,确保参数不丢失:

冷启动时获取初始参数

import 'package:flutter/services.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 获取冷启动Intent的Uri
  final initialUri = await getInitialUri();
  if (initialUri != null) {
    parseUtmParams(initialUri);
  }
  runApp(const MyApp());
}

// 解析UTM参数
void parseUtmParams(Uri uri) {
  final utmSource = uri.queryParameters['utm_source'];
  final utmMedium = uri.queryParameters['utm_medium'];
  final utmCampaign = uri.queryParameters['utm_campaign'];
  final utmId = uri.queryParameters['utm_id'];
  final utmTerm = uri.queryParameters['utm_term'];
  final utmContent = uri.queryParameters['utm_content'];
  // 后续可将参数存入本地或上报统计
  print('UTM参数:source=$utmSource, medium=$utmMedium, campaign=$utmCampaign');
}

后台唤醒时监听参数变化

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    // 监听Uri跳转事件
    uriLinkStream.listen((Uri? uri) {
      if (uri != null) {
        parseUtmParams(uri);
      }
    });
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    // 应用从后台回到前台时,再次检查Intent参数
    if (state == AppLifecycleState.resumed) {
      getInitialUri().then((uri) {
        if (uri != null) {
          parseUtmParams(uri);
        }
      });
    }
  }
}

3. 验证Google Ads后台配置

  • 确保Google Ads后台填写的深度链接和应用配置完全一致,包含所有UTM参数。
  • 使用Google Ads预览功能测试跳转,检查应用是否能接收完整Uri参数。若仍失败,可在Google Play Console的「设置 -> 深度链接」中查看App Links的验证状态。

4. 备用方案:监听INSTALL_REFERRER广播

若首次安装后打开应用时Intent无参数,可直接监听Google Play的安装推荐广播获取UTM参数:
在AndroidManifest.xml添加广播接收器:

<receiver
    android:name=".InstallReferrerReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
</receiver>

创建广播接收器类:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class InstallReferrerReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String referrer = intent.getStringExtra("referrer");
        if (referrer != null) {
            Log.d("InstallReferrer", "推广参数:" + referrer);
            // 可通过MethodChannel将参数传递给Flutter
        }
    }
}

内容的提问来源于stack exchange,提问作者Vijay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:52:27