观看视频,详细了解集成过程。 我们建议您同时使用视频和下面的书面指南。
先决条件
在安装 Singular Flutter SDK 之前,请完成以下前提步骤,以确保集成过程顺利进行。
必备先决条件:
- 完成规划步骤:按照集成 Singular SDK 中的指南进行操作:规划和先决条件》中的指南。这些步骤对于任何 Singular SDK 集成都是强制性的。
- Flutter 版本:验证已安装 Flutter SDK 的功能性 Flutter 应用程序。
- SDK 证书:从 Singular 平台的 "开发工具" > "SDK 集成" > "SDK 密钥"中获取SDK 密钥和秘钥。
安装
安装 SDK 软件包
使用 pubspec.yaml 依赖关系管理器将 Singular Flutter SDK 添加到项目中。该 SDK 为 iOS 和 Android 的本地 Singular SDK 提供了 Dart 绑定。
添加 SDK 依赖关系
-
更新 pubspec.yaml:在项目的
pubspec.yaml文件中添加 Singular Flutter SDK 依赖关系:dependencies: flutter: sdk: flutter singular_flutter_sdk: ^1.8.0 -
安装依赖项:在终端中导航至项目目录并运行
flutter packages get
平台配置
iOS 配置
完成 iOS 特定设置,启用 AdServices 框架对 iOS 归因跟踪的支持。
添加 AdServices 框架
Apple Search Ads 归因和 iOS 14.3+ SKAdNetwork 整合需要 AdServices 框架。
-
导航至 iOS 项目:打开 Flutter 项目的 iOS 目录并找到 Xcode 工作区。
-
导航到 Flutter 项目的
ios文件夹。 -
在 Xcode 中打开
Runner.xcworkspace(如果使用 CocoaPods,请使用.xcworkspace,否则请使用.xcodeproj)。
-
导航到 Flutter 项目的
-
添加 AdServices 框架:在 Xcode 项目设置中配置框架。
- 在 Xcode 中,选择项目的目标(如 "Runner")。
- 转到 "常规"选项卡。
- 滚动到 "框架、库和嵌入式内容"部分。
- 单击+按钮。
-
搜索
AdServices.framework并添加。 - 将框架状态设置为可选(确保与旧版本 iOS 兼容)。
为什么是可选?将 AdServices 设置为可选,可确保您的应用程序与不包含此框架的 iOS 版本(iOS 14.2 及更早版本)保持兼容。
安卓配置
配置 Android 构建文件,添加所需的权限和依赖项,以实现正确的 SDK 功能。
添加所需权限
将这些权限添加到AndroidManifest.xml 文件的<manifest> 标记下,以启用核心 SDK 功能。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="BIND_GET_INSTALL_REFERRER_SERVICE" />
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
重要:如果您集成了儿童 SDK,请排除com.google.android.gms.permission.AD_ID 权限。在标准应用程序中收集 GAID 需要此权限,但针对 13 岁以下儿童的应用程序必须省略此权限。
三星 Galaxy 商店支持
要启用来自 Samsung Galaxy Store 的安装推荐人跟踪功能,请在AndroidManifest.xml 中添加以下内容:
<queries>
<package android:name="com.sec.android.app.samsungapps" />
</queries>
传递依赖关系
如果您在 Gradle 配置中禁用了 Singular SDK 的传递依赖关系,请手动添加这些必要的依赖关系:
dependencies {
// Required for install referrer tracking
implementation 'com.android.installreferrer:installreferrer:2.2'
// Required for App Set ID
implementation 'com.google.android.gms:play-services-appset:16.0.0'
}
ProGuard 配置
在构建发行版 APK 时,ProGuard(或 R8)可能会剥离或混淆 SDK 类。添加这些保留规则以保留 Singular 功能。
为何重要?在 Flutter Android 发布版本中,ProGuard 默认已启用。如果没有适当的保留规则,SDK 可能无法在生产中正常运行。
-
找到 ProGuard 文件:导航至 Flutter 项目中的
android/app/proguard-rules.pro。 -
添加保留规则:添加以下规则以保留 SDK 类:
# Preserve Singular SDK classes -keep class com.singular.sdk.** { *; } # Preserve Android Install Referrer library -keep public class com.android.installreferrer.** { *; } # Uncomment if using Singular revenue tracking with Google Play Billing Library #-keep public class com.android.billingclient.** { *; }
SDK 集成
隐私合规性:在实施 Singular SDK 时,遵守运营地区的隐私法,包括 GDPR、CCPA、COPPA 等。有关指导,请参阅SDK 选择加入和选择退出实践。
每次启动应用程序时都要初始化Singular SDK。SDK 初始化对所有 Singular 归因功能都至关重要,并可创建一个新会话,用于计算用户留存指标。
导入 SDK 类
在主应用程序文件(通常为main.dart )顶部导入 Singular SDK 类。
import 'package:singular_flutter_sdk/singular.dart';
import 'package:singular_flutter_sdk/singular_config.dart';
初始化 SDK
使用 SDK 凭据创建SingularConfig 对象,配置可选功能,并使用start() 方法初始化 SDK。
基本初始化
- 获取凭据:登录Singular 账户,导航至 "开发工具" > "SDK 集成" > "SDK 密钥",找到 SDK 密钥和秘钥。
-
创建配置:使用凭据实例化
SingularConfig对象。 - 添加配置:可选择使用属性设置器配置 SDK 行为(请参阅《配置参考》)。
-
初始化 SDK:调用
Singular.start()启动 SDK。
初始化示例
在应用程序的入口点(通常在主 StatefulWidget 的initState() 方法中)初始化 SDK。
import 'package:flutter/material.dart';
import 'package:singular_flutter_sdk/singular.dart';
import 'package:singular_flutter_sdk/singular_config.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
// Create configuration with credentials
SingularConfig config = SingularConfig(
'YOUR_SDK_KEY',
'YOUR_SDK_SECRET'
);
// Enable debug logging
config.enableLogging = true;
config.logLevel = 4;
// Set session timeout (in seconds)
config.sessionTimeout = 60.0;
// Initialize SDK
Singular.start(config);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
高级配置示例
在调用start() 之前,在SingularConfig 对象上设置附加属性,从而在初始化过程中配置多个 SDK 功能。
import 'package:flutter/material.dart';
import 'package:singular_flutter_sdk/singular.dart';
import 'package:singular_flutter_sdk/singular_config.dart';
import 'package:singular_flutter_sdk/singular_link_params.dart';
import 'package:singular_flutter_sdk/singular_global_property.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
initializeSingularSDK();
}
void initializeSingularSDK() {
// Create configuration with credentials
SingularConfig config = SingularConfig(
'YOUR_SDK_KEY',
'YOUR_SDK_SECRET'
);
// User identification
config.customUserId = 'user_123456';
// Privacy settings
config.limitDataSharing = false;
// Deep linking handler
config.singularLinksHandler = (SingularLinkParams params) {
print('Deep link received: ${params.deeplink}');
print('Passthrough params: ${params.passthrough}');
print('Is deferred: ${params.isDeferred}');
// Handle navigation based on deep link
};
// Short link timeout
config.shortLinkResolveTimeOut = 10.0;
// Facebook integration
config.facebookAppId = 'YOUR_FACEBOOK_APP_ID';
// SKAdNetwork settings (iOS)
config.skAdNetworkEnabled = true;
config.manualSkanConversionManagement = false;
config.waitForTrackingAuthorizationWithTimeoutInterval = 30;
// Conversion value callbacks (iOS)
config.conversionValueUpdatedCallback = (int conversionValue) {
print('Conversion value updated: $conversionValue');
};
config.conversionValuesUpdatedCallback = (int cv, int coarse, bool lock) {
print('Fine: $cv, Coarse: $coarse, Locked: $lock');
};
// Global properties
config.globalProperties = [
SingularGlobalProperty('app_version', '2.5.0', true),
SingularGlobalProperty('user_tier', 'premium', false)
];
// Debugging
config.enableLogging = true;
config.logLevel = 4;
// Session timeout
config.sessionTimeout = 60.0;
// Initialize SDK
Singular.start(config);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
配置参考:有关可用配置选项的完整列表,请参阅《Flutter SDK 配置参考》。
危险:请勿使用 Singular Reporting API Key。只能使用 SDK 集成页面中的 SDK 特定凭据。使用错误的凭据会阻止数据到达 Singular。