Browse Source

[new]增加asa苹果搜索广告归因插件

zk 3 months ago
parent
commit
60ed70c3b1

+ 3 - 0
lib/handler/event_handler.dart

@@ -1,3 +1,5 @@
+import 'package:location/sdk/asa/asa_helper.dart';
+
 import '../data/consts/payment_type.dart';
 import '../sdk/gravity/gravity_helper.dart';
 import '../utils/toast_util.dart';
@@ -34,5 +36,6 @@ class EventHandler {
           'PAY: 金额:$priceFen 订单号:$orderId 商品名:$itemName 支付方式:$payWayStr');
     }
     GravityHelper.reportPay(priceFen, orderId, itemName, payWay);
+    AsaHelper.reportEvent(AsaEvent.pay, amount: priceFen / 100);
   }
 }

+ 3 - 0
lib/main.dart

@@ -12,6 +12,7 @@ import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/resource/string_source.dart';
 import 'package:location/router/app_pages.dart';
+import 'package:location/sdk/asa/asa_helper.dart';
 import 'package:location/sdk/bugly/bugly_helper.dart';
 import 'package:location/sdk/gravity/gravity_helper.dart';
 import 'package:location/sdk/map/map_helper.dart';
@@ -94,6 +95,8 @@ class AppInitTask implements EnsurePolicyGrant {
     await MapHelper.init();
     //一键登录
     QuickLoginHelper.init();
+    //苹果搜索广告归因插件
+    AsaHelper.init();
   }
 }
 

+ 3 - 0
lib/module/splash/splash_controller.dart

@@ -7,6 +7,7 @@ import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/dialog/agreement_dialog.dart';
 import 'package:location/module/main/main_page.dart';
+import 'package:location/sdk/asa/asa_helper.dart';
 import 'package:location/sdk/umeng/umeng_helper.dart';
 
 import '../../utils/privacy_compliance.dart';
@@ -51,5 +52,7 @@ class SplashController extends BaseController {
   _agreePrivacy() async {
     await UmengHelper.setPolicyGrantResult(true);
     await PrivacyCompliance.setPrivacyPolicy(true);
+    AsaHelper.reportEvent(AsaEvent.active);
+    AsaHelper.reportEvent(AsaEvent.register);
   }
 }

+ 95 - 0
lib/sdk/asa/asa_helper.dart

@@ -0,0 +1,95 @@
+import 'dart:convert';
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter_asa_attribution/flutter_asa_attribution.dart';
+import 'package:http/http.dart' as http;
+import 'package:location/utils/date_util.dart';
+import '../../device/atmob_platform_info.dart';
+import '../../utils/hash_utils.dart';
+
+class AsaHelper {
+  AsaHelper._();
+
+  static final String _orgId = "9038030";
+  static final String _secret = "86728a25f9e806dc05bca13e6bffc16d";
+  static final String _sign = HashUtils.md5String("$_secret&kiwi");
+  static Map<String, dynamic>? attributionMap;
+
+  static Future<String?> getToken() {
+    return FlutterAsaAttribution.instance.attributionToken();
+  }
+
+  static void init() {
+    requestAttributionDetails();
+  }
+
+  static Future<Map<String, dynamic>?> requestAttributionDetails() async {
+    if (attributionMap != null) {
+      return attributionMap;
+    }
+    attributionMap =
+        await FlutterAsaAttribution.instance.requestAttributionDetails();
+    return attributionMap;
+  }
+
+  static Future<bool> reportEvent(AsaEvent event, {double? amount}) async {
+    final attrMap = await requestAttributionDetails();
+
+    final Map<String, dynamic> map = {
+      "campaign_id": attrMap?["campaignId"] ?? "",
+      "ad_group_id": attrMap?["adGroupId"] ?? "",
+      "keyword_id": attrMap?["keywordId"] ?? "",
+      "date": DateUtil.formatDateTime(DateUtil.getNow(), "yyyy-MM-dd"),
+      "unique_device": atmobPlatformInfo.idfa ?? atmobPlatformInfo.idfv,
+      "timezone": 'ORTZ',
+      "event_name": event.value,
+    };
+    if (amount == null) {
+      map.addAll({"event_val": 1});
+    } else {
+      map.addAll({"event_val": amount});
+    }
+    return reportBackendDataDetail(map);
+  }
+
+  static Future<bool> reportBackendDataDetail(
+      Map<String, dynamic> params) async {
+    try {
+      final String url = _getReportDetailApi();
+      final headers = {
+        "Content-Type": "application/json",
+      };
+      final requestBody = {"backend_data_detail": params};
+      final resp = await http.post(
+        Uri.parse(url),
+        headers: headers,
+        body: jsonEncode(requestBody),
+      );
+
+      if (resp.statusCode == 200) {
+        final resMap = jsonDecode(resp.body);
+        debugPrint("asa 上报结果: $resMap");
+        return true;
+      } else {
+        debugPrint("asa 上报错误: ${resp.statusCode} ${resp.body}");
+        return false;
+      }
+    } catch (e) {
+      return false;
+    }
+  }
+
+  static String _getReportDetailApi() {
+    return 'http://asafrontend.mokiwi.com/api/asabackendDataDetail/add?org_id=$_orgId&sign=$_sign&debug=$kDebugMode';
+  }
+}
+
+enum AsaEvent {
+  active("active"), //激活
+  register("register"), //注册
+  pay("pay"); //付费
+
+  const AsaEvent(this.value);
+
+  final String value;
+}

+ 13 - 0
lib/utils/hash_utils.dart

@@ -0,0 +1,13 @@
+import 'dart:convert';
+import 'package:crypto/crypto.dart';
+
+class HashUtils {
+  HashUtils._();
+
+  /// 计算字符串的 MD5 值
+  static String md5String(String input) {
+    final bytes = utf8.encode(input);
+    final digest = md5.convert(bytes);
+    return digest.toString();
+  }
+}

File diff suppressed because it is too large
+ 303 - 282
pubspec.lock


+ 6 - 0
pubspec.yaml

@@ -161,6 +161,12 @@ dependencies:
   #一键登录
   quickpass_yidun_flutter: ^1.5.6
 
+  #asa苹果搜索广告归因插件
+  flutter_asa_attribution: ^1.0.0
+
+  #MD5
+  crypto: ^3.0.3
+
   ######################地图########################
   flutter_map:
     path: plugins/map