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);

跟踪事件

您可以使用 eventeventWithArgs 方法向 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

1 回复

更多关于Flutter儿童教育娱乐插件singular_flutter_kids_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


singular_flutter_kids_sdk 是一个专为儿童教育娱乐应用设计的Flutter插件,帮助开发者轻松集成儿童友好的功能和SDK。它通常包括广告管理、隐私保护、家长控制等功能,确保应用符合儿童隐私保护法规(如COPPA、GDPR等)。

以下是使用 singular_flutter_kids_sdk 的基本步骤:


1. 添加依赖

pubspec.yaml 文件中添加 singular_flutter_kids_sdk 依赖:

dependencies:
  singular_flutter_kids_sdk: ^1.0.0 # 请使用最新版本

运行 flutter pub get 以安装插件。


2. 初始化SDK

在应用启动时初始化 singular_flutter_kids_sdk。通常可以在 main.dart 中完成:

import 'package:singular_flutter_kids_sdk/singular_flutter_kids_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化SDK
  await SingularFlutterKidsSdk.init(
    apiKey: "YOUR_API_KEY",
    secretKey: "YOUR_SECRET_KEY",
    isKidsApp: true, // 标记为儿童应用
  );

  runApp(MyApp());
}

3. 配置隐私和广告

根据儿童隐私法规,禁用广告跟踪和个性化广告:

SingularFlutterKidsSdk.disableTracking(true); // 禁用广告跟踪
SingularFlutterKidsSdk.limitDataSharing(true); // 限制数据共享

4. 事件跟踪

如果需要跟踪用户行为(如游戏进度或学习活动),可以使用事件跟踪功能:

SingularFlutterKidsSdk.trackEvent("level_completed", {"level": "1", "score": "100"});

5. 家长控制功能

集成家长控制功能,例如设置使用时间限制或验证家长身份:

SingularFlutterKidsSdk.enableParentalControl(
  maxDailyUsageMinutes: 60, // 每日最大使用时间
  requireParentalApproval: true, // 需要家长批准
);

6. 处理用户数据

确保用户数据符合儿童隐私法规,避免收集不必要的个人信息:

SingularFlutterKidsSdk.setUserAge(8); // 设置用户年龄
SingularFlutterKidsSdk.setUserGender("male"); // 设置用户性别(可选)

7. 测试和发布

在发布应用之前,使用测试模式验证SDK功能:

SingularFlutterKidsSdk.setTestMode(true); // 启用测试模式
回到顶部