Flutter广告与奖励插件tap_joy_plugin的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter广告与奖励插件tap_joy_plugin的使用

简介

tap_joy_plugin 是一个用于在 Flutter 应用中集成 TapJoy SDK 的插件,支持 Android 和 iOS 平台。目前该插件不支持 TapJoy 购买或推送通知。

info.plist 变更

TapJoy 已经注册为 Apple 的 SKAdNetwork 网络合作伙伴。在您的应用的 info.plist 文件中添加 TapJoy 的网络标识符以及其他 DSP 合作伙伴的标识符:

<key>SKAdNetworkItems</key>
  <array>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>ecpz2srf59.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>7ug5zh24hu.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>9t245vhmpl.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>prcb7njmu6.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>5lm9lj6jb7.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>578prtvx9j.skadnetwork</string>
    </dict>
  </array>

如果您的应用运行在 iOS 14.0 或更高版本上,则需要从用户处获取 App 追踪授权。在 info.plist 文件中添加以下行:

<key>NSUserTrackingUsageDescription</key>
<string>这允许我们为您提供个性化广告。</string>

Podfile 变更

在您的 iOS Podfile 中,取消注释以下行:

target 'Runner' do
# use_frameworks!
  use_modular_headers!

AndroidManifest 变更

在您的 AndroidManifest.xml 文件中,添加所需的权限:

  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

添加以下活动到 AndroidManifest.xml 文件的应用程序块中:

<activity
  android:name="com.tapjoy.TJAdUnitActivity"
  android:configChanges="orientation|keyboardHidden|screenSize"
  android:hardwareAccelerated="true"
  android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<activity
  android:name="com.tapjoy.TJContentActivity"
  android:configChanges="orientation|keyboardHidden|screenSize"
  android:theme="@android:style/Theme.Translucent.NoTitleBar"
  android:hardwareAccelerated="true" />

作为 Google Play Services 集成的一部分,还需要添加以下元数据:

<meta-data
  android:name="com.google.android.gms.version"
  android:value="@integer/google_play_services_version" />

使用方法

连接到 TapJoy

TapJoyPlugin.shared.connect(androidApiKey: "your-tapjoy-android-key",
iOSApiKey:"your-tapjoy-iOS-key",debug: true);

设置连接结果处理器

TapJoyPlugin.shared.setConnectionResultHandler((result) {
  switch (result) {
    case TJConnectionResult.connected:
      // 处理连接成功的情况
      break;
    case TJConnectionResult.disconnected:
      // 处理断开连接的情况
      break;
  }
});

获取 iOS App 追踪授权

TapJoyPlugin.shared.getIOSATTAuth().then((value) {
  switch(value) {
    case IOSATTAuthResult.notDetermined:
      // 处理未确定的情况
      break;
    case IOSATTAuthResult.restricted:
      // 处理受限的情况
      break;
    case IOSATTAuthResult.denied:
      // 处理拒绝的情况
      break;
    case IOSATTAuthResult.authorized:
      // 处理授权的情况
      break;
    case IOSATTAuthResult.none:
      // 处理其他情况
      break;
    case IOSATTAuthResult.iOSVersionNotSupported:
      // 处理 iOS 版本不支持的情况
      break;
    case IOSATTAuthResult.android:
      // 处理 Android 情况
  }
});

设置用户 ID

TapJoyPlugin.shared.setUserID(userID: "user_id");

创建放置

TJPlacement placement = TJPlacement(name: "TapJoyPlacementName");

创建并设置放置处理器

TJPlacementHandler handler = (contentState,name,error) {
  switch(contentState) {
    case TJContentState.contentReady:
      // 处理内容准备好
      break;
    case TJContentState.contentDidAppear:
      // 处理内容出现
      break;
    case TJContentState.contentDidDisappear:
      // 处理内容消失
      break;
    case TJContentState.contentRequestSuccess:
      // 处理请求成功
      break;
    case TJContentState.contentRequestFail:
      // 处理请求失败
      break;
    case TJContentState.userClickedAndroidOnly:
      // 处理用户点击
      break;
  }
};

placement.setHandler(handler);

请求内容

await placement.requestContent();

显示放置内容

await placement.showPlacement();

设置货币余额响应处理器

TapJoyPlugin.shared.setGetCurrencyBalanceHandler((currencyName, amount, error) { });

获取用户余额

await TapJoyPlugin.shared.getCurrencyBalance();

设置奖励货币响应处理器

TapJoyPlugin.shared.setAwardCurrencyHandler((currencyName, amount, error) { });

奖励货币

TapJoyPlugin.shared.awardCurrency(int amount);

设置消费货币响应处理器

TapJoyPlugin.shared.setSpendCurrencyHandler((currencyName, amount, error) { });

消费货币

TapJoyPlugin.shared.spendCurrency(int amount);

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中集成 TapJoy 插件。

import 'package:flutter/material.dart';
import 'package:tap_joy_plugin/tap_joy_plugin.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  TJPlacement myPlacement = TJPlacement(name: "LevelComplete");
  TJPlacement myPlacement2 = TJPlacement(name: "Placement02");
  String contentStateText = "";
  String connectionState = "";
  String iOSATTAuthResult = "";
  String balance = "";

  [@override](/user/override)
  void initState() {
    super.initState();
    // 设置连接结果处理器
    TapJoyPlugin.shared.setConnectionResultHandler(_connectionResultHandler());
    // 连接到 TapJoy
    TapJoyPlugin.shared.connect(
        androidApiKey: "tap_joy_android_api_key",
        iOSApiKey: "tap_joy_ios_api_key",
        debug: true);
    // 设置用户 ID
    TapJoyPlugin.shared.setUserID(userID: "user_id123");
    // 设置放置处理器
    myPlacement.setHandler(_placementHandler());
    myPlacement2.setHandler(_placementHandler());
    // 添加放置
    TapJoyPlugin.shared.addPlacement(myPlacement);
    TapJoyPlugin.shared.addPlacement(myPlacement2);
    // 设置货币处理器
    TapJoyPlugin.shared.setGetCurrencyBalanceHandler(_currencyHandler());
    TapJoyPlugin.shared.setAwardCurrencyHandler(_currencyHandler());
    TapJoyPlugin.shared.setSpendCurrencyHandler(_currencyHandler());
    TapJoyPlugin.shared.setEarnedCurrencyAlertHandler(_currencyHandler());

    // 获取 iOS App 追踪授权
    getAuth();
  }

  // 货币处理器
  TJSpendCurrencyHandler _currencyHandler() {
    TJSpendCurrencyHandler handler = (currencyName, amount, error) {
      setState(() {
        balance = "Currency Name: " +
            currencyName.toString() +
            " Amount:  " +
            amount.toString() +
            " Error:" +
            error.toString();
      });
    };
    return handler;
  }

  // 连接结果处理器
  TJConnectionResultHandler _connectionResultHandler() {
    TJConnectionResultHandler handler = (result) {
      switch (result) {
        case TJConnectionResult.connected:
          setState(() {
            connectionState = "Connected";
          });
          break;
        case TJConnectionResult.disconnected:
          setState(() {
            connectionState = "Disconnected";
          });
          break;
      }
    };
    return handler;
  }

  // 放置处理器
  TJPlacementHandler _placementHandler() {
    TJPlacementHandler handler = (contentState, name, error) {
      switch (contentState) {
        case TJContentState.contentReady:
          setState(() {
            contentStateText = "Content Ready for placement :  $name";
          });
          break;
        case TJContentState.contentDidAppear:
          setState(() {
            contentStateText = "Content Did Appear for placement :  $name";
          });
          break;
        case TJContentState.contentDidDisappear:
          setState(() {
            contentStateText = "Content Did Disappear for placement :  $name";
          });
          break;
        case TJContentState.contentRequestSuccess:
          setState(() {
            contentStateText = "Content Request Success for placement :  $name";
          });
          break;
        case TJContentState.contentRequestFail:
          setState(() {
            contentStateText = "Content Request Fail + $error for placement :  $name";
          });
          break;
        case TJContentState.userClickedAndroidOnly:
          setState(() {
            contentStateText = "Content User Clicked for placement :  $name";
          });
          break;
      }
    };
    return handler;
  }

  // 获取 iOS App 追踪授权
  Future<String> getAuth() async {
    TapJoyPlugin.shared.getIOSATTAuth().then((value) {
      switch (value) {
        case IOSATTAuthResult.notDetermined:
          setState(() {
            iOSATTAuthResult = "Not Determined";
          });
          break;
        case IOSATTAuthResult.restricted:
          setState(() {
            iOSATTAuthResult = "Restricted ";
          });
          break;
        case IOSATTAuthResult.denied:
          setState(() {
            iOSATTAuthResult = "Denied ";
          });
          break;
        case IOSATTAuthResult.authorized:
          setState(() {
            iOSATTAuthResult = "Authorized ";
          });
          break;
        case IOSATTAuthResult.none:
          setState(() {
            iOSATTAuthResult = "Error ";
          });
          break;
        case IOSATTAuthResult.iOSVersionNotSupported:
          setState(() {
            iOSATTAuthResult = "IOS Version Not Supported ";
          });
          break;
        case IOSATTAuthResult.android:
          setState(() {
            iOSATTAuthResult = "on Android";
          });
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('TapJoy Flutter'),
        ),
        body: Center(
          child: Column(
            children: [
              Text("Connection State : $connectionState"),
              ElevatedButton(
                child: Text("get iOS App Tracking Auth"),
                onPressed: getAuth,
              ),
              Text("IOS Auth Result : $iOSATTAuthResult"),
              ElevatedButton(
                child: Text("request content for Placement 001"),
                onPressed: myPlacement.requestContent,
              ),
              ElevatedButton(
                child: Text("request content for Placement 002"),
                onPressed: myPlacement2.requestContent,
              ),
              Text("Content State : $contentStateText"),
              ElevatedButton(
                child: Text("show Placement 001"),
                onPressed: myPlacement.showPlacement,
              ),
              ElevatedButton(
                child: Text("show Placement 002"),
                onPressed: myPlacement2.showPlacement,
              ),
              ElevatedButton(
                child: Text("get balance"),
                onPressed: TapJoyPlugin.shared.getCurrencyBalance,
              ),
              ElevatedButton(
                child: Text("award balance"),
                onPressed: () {
                  TapJoyPlugin.shared.awardCurrency(15);
                },
              ),
              ElevatedButton(
                child: Text("spend balance"),
                onPressed: () {
                  TapJoyPlugin.shared.spendCurrency(5);
                },
              ),
              Text("Balance Response : $balance"),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter广告与奖励插件tap_joy_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter广告与奖励插件tap_joy_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成和使用tap_joy_plugin来展示广告和奖励用户是一个相对复杂的任务,但以下是一个基础的代码案例,展示了如何设置和使用这个插件。请注意,这个示例假设你已经有一个Flutter项目,并且已经完成了基本的Flutter开发环境的配置。

第一步:添加依赖

首先,你需要在你的pubspec.yaml文件中添加tap_joy_plugin的依赖。确保你的Flutter环境是最新的,并且已经配置了正确的Dart和Flutter SDK版本。

dependencies:
  flutter:
    sdk: flutter
  tap_joy_plugin: ^最新版本号  # 请替换为最新的版本号

然后运行flutter pub get来安装依赖。

第二步:配置Tapjoy SDK

在使用Tapjoy SDK之前,你需要在Tapjoy的开发者网站上创建一个应用,并获取相关的SDK密钥。这些密钥将用于初始化Tapjoy SDK。

第三步:初始化Tapjoy SDK

在你的Flutter应用的入口文件(通常是main.dart)中,你需要初始化Tapjoy SDK。

import 'package:flutter/material.dart';
import 'package:tap_joy_plugin/tap_joy_plugin.dart';

void main() {
  runApp(MyApp());

  // 初始化Tapjoy SDK
  TapJoyPlugin.instance.initTapJoy(
    sdkKey: "你的SDK密钥", // 替换为你的Tapjoy SDK密钥
    placement: "你的Placement名称", // 替换为你的Tapjoy Placement名称
    userId: "用户ID", // 可以是用户的唯一标识符,如UUID
    environment: TapJoyEnvironment.PRODUCTION // 或 TapJoyEnvironment.SANDBOX,取决于你是否在测试环境中
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 显示广告的方法
  void showAd() async {
    try {
      bool isAvailable = await TapJoyPlugin.instance.isContentAvailable();
      if (isAvailable) {
        await TapJoyPlugin.instance.showContentView();
      } else {
        print("No content available to show.");
      }
    } catch (e) {
      print("Error showing content: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Tapjoy Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: showAd,
          child: Text('Show Ad'),
        ),
      ),
    );
  }
}

第四步:处理奖励

当用户完成广告观看或互动后,Tapjoy会回调你的应用以通知奖励的发放。你需要实现一个方法来处理这些奖励。

// 在你的Flutter应用中添加一个回调来处理奖励
TapJoyPlugin.instance.setRewardListener((reward) {
  // 处理奖励,例如更新用户的金币数量
  print("Reward received: ${reward.name}, amount: ${reward.amount}");
});

注意事项

  1. 权限:确保你的应用具有必要的权限,例如网络访问权限。
  2. 测试:在发布前,务必在Tapjoy的Sandbox环境中充分测试你的集成。
  3. 更新:定期检查Tapjoy的文档和插件更新,以确保你的集成是最新的。

这个代码案例提供了一个基本的框架,展示了如何在Flutter项目中集成和使用tap_joy_plugin。根据你的具体需求,你可能需要调整代码来适应你的应用逻辑和UI设计。

回到顶部