Flutter儿童教育娱乐插件singular_flutter_kids_sdk的使用
Flutter儿童教育娱乐插件singular_flutter_kids_sdk的使用
singular_flutter_kids_sdk
一个用于 Singular Kids SDK 的 Flutter 插件。
目录
支持平台
- Android
- iOS
此插件适用于
- iOS SingularSDK v12.6.0
- Android SingularSDK v12.6.0
基本集成
要将 Singular 插件添加到您的 Flutter 应用程序中,请在 pubspec.yaml
文件中添加以下依赖项:
dependencies:
singular_flutter_kids_sdk: ^1.5.1
然后,在终端中导航到项目并运行:
flutter packages get
在初始化 Singular SDK 之前,您需要创建一个 SingularConfig
对象。该对象包含您的 Singular SDK 的 API 密钥和 API 密码。可选地,您可以添加设置以启用各种 SDK 功能。
示例:
import 'package:singular_flutter_kids_sdk/singular.dart';
import 'package:singular_flutter_kids_sdk/singular_config.dart';
SingularConfig config = new SingularConfig('API_KEY', 'API_SECRET');
config.customUserId = "test@test.com";
Singular.start(config);
跟踪事件
您可以使用 event
和 eventWithArgs
方法向 Singular 发送事件。
示例:
Singular.event(eventName);
Singular.eventWithArgs(eventName, {"level-up":"5"});
跟踪收入
报告自定义事件到 Singular
示例:
Singular.customRevenue("MyCustomRevenue", "USD", 5.50);
报告 IAP 事件到 Singular
示例:
import 'package:singular_flutter_kids_sdk/singular_iap.dart';
singularPurchase = new SingularIOSIAP(
product.price,
product.currencyCode,
purchase.productId,
purchase.purchaseId,
purchase.verificationData.serverVerificationData
);
singularPurchase = new SingularAndroidIAP(
product.price,
product.currencyCode,
purchase.signature,
purchase.verificationData.serverVerificationData
);
Singular.inAppPurchase(eventName, singularPurchase);
实现深度链接
要在 iOS 和 Android 上启用 Singular 链接,请参阅 Singular Links Prerequisites。
处理 Singular 链接
Singular SDK 提供了一个处理器机制来读取导致应用程序打开的跟踪链接的详细信息。
示例:
SingularConfig config = new SingularConfig('API_KEY', 'API_SECRET');
config.singularLinksHandler = (SingularLinkParams params) {
String deeplink = params.deeplink;
String passthrough = params.passthrough;
bool isDeferred = params.isDeferred;
Map urlParameters = params.urlParameters;
// 在此处添加您的代码来处理深度链接
};
Singular.init(config);
iOS 前提条件
Objective-C:
在项目的 AppDelegate.m
中,添加以下内容:
// 顶部导入
#import "SingularAppDelegate.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
[SingularAppDelegate shared].launchOptions = launchOptions;
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler {
[[SingularAppDelegate shared] continueUserActivity:userActivity restorationHandler:restorationHandler];
return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
[[SingularAppDelegate shared] handleOpenUrl:url options:options];
return YES;
}
Swift:
import singular_flutter_kids_sdk
override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
GeneratedPluginRegistrant.register(with: self)
if let singularAppDelegate = SingularAppDelegate.shared() {
singularAppDelegate.launchOptions = launchOptions
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if let singularAppDelegate = SingularAppDelegate.shared() {
singularAppDelegate.continueUserActivity(userActivity, restorationHandler: nil)
}
return true
}
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
if let singularAppDelegate = SingularAppDelegate.shared() {
singularAppDelegate.handleOpen(url, options: options)
}
return true
}
Android 前提条件
Java:
在项目的 MainActivity.java
中,添加以下内容:
import com.singular.flutter_kids_sdk.SingularBridge;
@Override
protected void onNewIntent(@NonNull Intent intent) {
super.onNewIntent(intent);
SingularBridge.onNewIntent(intent);
}
Kotlin:
import com.singular.flutter_kids_sdk.SingularBridge
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
SingularBridge.onNewIntent(intent);
}
添加SKAdNetwork支持
从 Singular Flutter SDK 版本 1.0.15 开始,skAdNetworkEnabled
已默认启用。
要手动为您的应用启用 SKAdNetwork 跟踪,请在初始化 Singular 之前开启 skAdNetworkEnabled
配置选项。
示例:
SingularConfig config = new SingularConfig('API_KEY', 'API_SECRET');
config.skAdNetworkEnabled = true;
config.manualSkanConversionManagement = true; // 启用手动转换值更新
config.conversionValueUpdatedCallback = (int conversionValue) {
print('Received conversionValueUpdatedCallback: ' + conversionValue.toString());
};
Singular.init(config);
获取转换值
Singular.skanGetConversionValue().then((conversionValue) {
print('conversion value: ' + conversionValue.toString());
});
跟踪卸载
发送 APNS/FCM 令牌给 Singular 以便它能够跟踪应用卸载。
示例:
// iOS
Singular.registerDeviceTokenForUninstall(apnsToken);
// Android
Singular.registerDeviceTokenForUninstall(fcmToken);
完整示例
以下是完整的示例代码,展示了如何使用 singular_flutter_kids_sdk
插件。
import 'package:example/custom_event.dart';
import 'package:example/deeplink.dart';
import 'package:example/identity.dart';
import 'package:example/revenue.dart';
import 'package:example/skan.dart';
import 'package:flutter/material.dart';
import 'package:singular_flutter_kids_sdk/singular.dart';
import 'package:singular_flutter_kids_sdk/singular_config.dart';
import 'package:singular_flutter_kids_sdk/singular_link_params.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// 这个小部件是你的应用的根
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
final Map<String, dynamic> deeplinkParams = {};
MyHomePage({Key? key, this.title}) : super(key: key);
final String? title;
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
final Map<String, dynamic> deeplinkParams = {};
[@override](/user/override)
initState() {
super.initState();
WidgetsBinding.instance!.addObserver(this);
initPlatformState();
}
[@override](/user/override)
void dispose() {
WidgetsBinding.instance!.removeObserver(this);
super.dispose();
}
[@override](/user/override)
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.inactive:
break;
case AppLifecycleState.resumed:
break;
case AppLifecycleState.paused:
break;
case AppLifecycleState.detached:
break;
}
}
// 平台消息是异步的,所以我们初始化在一个异步方法中
initPlatformState() async {
SingularConfig config = SingularConfig('API_KEY', 'API_SECRET');
config.waitForTrackingAuthorizationWithTimeoutInterval = 60;
config.skAdNetworkEnabled = true;
config.clipboardAttribution = true;
config.enableLogging = true;
config.logLevel = 3;
config.singularLinksHandler = (SingularLinkParams params) {
print('Received deferred deeplink: ');
deeplinkParams['deeplink'] = params.deeplink;
deeplinkParams['passthrough'] = params.passthrough;
deeplinkParams['isDeferred'] = params.isDeferred;
deeplinkParams['urlParameters'] = params.urlParameters;
};
config.withGlobalProperty("key1", "value1", true);
config.withGlobalProperty("key2", "value2", true);
config.conversionValueUpdatedCallback = (int conversionValue) {
print('Received conversionValueUpdatedCallback: ' +
conversionValue.toString());
};
config.conversionValuesUpdatedCallback = (int conversionValue, int coarse, bool lock) {
print('Received conversionValuesUpdatedCallback: ' +
conversionValue.toString() + ' coarse: ' + coarse.toString() + ' lock: ' + (lock ? 'true' : 'false'));
};
config.manualSkanConversionManagement = true;
config.espDomains = ['bit.ly'];
config.facebookAppId = "FACEBOOK_APP_ID";
config.deviceAttributionCallback = (Map<String, dynamic> deviceAttributionInfo) {
print('Received device attribution information: ' + deviceAttributionInfo.toString());
};
config.customSdid = "custom-sdid";
config.didSetSdidCallback = (String sdid) {
print("did set sdid = " + sdid);
};
config.sdidReceivedCallback = (String sdid) {
print("received sdid = " + sdid);
};
Singular.start(config);
}
[@override](/user/override)
Widget build(BuildContext context) {
return DefaultTabController(
length: 5,
child: Scaffold(
appBar: AppBar(
elevation: 0,
bottom: TabBar(indicatorSize: TabBarIndicatorSize.label, tabs: [
Tab(text: "Custom Events", icon: Icon(Icons.create_rounded)),
Tab(text: "Revenue", icon: Icon(Icons.monetization_on)),
Tab(text: "Identity", icon: Icon(Icons.person)),
Tab(text: "Deep Links", icon: Icon(Icons.insert_link)),
Tab(text: "SKAN", icon: Icon(Icons.bar_chart))
]),
),
body: TabBarView(children: <Widget>[
CustomEvent(),
Revenue(),
Identity(),
Deeplink(deeplinkParams),
Skan()
]),
));
}
}
更多关于Flutter儿童教育娱乐插件singular_flutter_kids_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html