Flutter firebase_admob IOS(单例模式)

在我的 Flutter firebase_admob(IOS开发版)这篇文章介绍了 firebase_admob 的基本使用,这篇搞个升级版,将 firebase 调取广告封装成单例,供全局使用。

vad_instance.dart

在该文件中举例了“插页式广告”和“激励广告”,两种广告的封装形式有很大的不同,由于激励广告需要用户看一小片段广告,我们更需要关注用户在观看广告期间的行为并对其进行了动态的监听。插页式广告只需预加载成功后触发弹出即可。
【 注意:插页式广告的 InterstitialAd 方法只能加载一次 】

import 'package:firebase_admob/firebase_admob.dart';
import 'package:rxdart/rxdart.dart';

const String AD_MOB_APP_ID = 'ca-app-pub-################~##########';
const String AD_CHA_YE = 'ca-app-pub-3940256099942544/1033173712';
const String AD_JI_LI = 'ca-app-pub-3940256099942544/1712485313';

class VadInstance {

  // 单例公开访问点
  factory VadInstance() => _getInstance();

  // 静态私有成员,没有初始化
  static VadInstance _vadInstance;

  static VadInstance get instance => _getInstance();

  // 激励广告监听变量
  BehaviorSubject<bool> _loadedAsBehaviorSubject = BehaviorSubject();
  
  /*   ======================   插页式广告部分开始   ======================   */
  InterstitialAd _interstitialAd;
  InterstitialAd createInterstitialAd() {
    return InterstitialAd(
        adUnitId: AD_CHA_YE,
        targetingInfo: targetingInfo,
        listener: (MobileAdEvent event) {
          if (event == MobileAdEvent.failedToLoad) {
            _interstitialAd = createInterstitialAd();
          }
          if (event == MobileAdEvent.closed) {
            _interstitialAd = createInterstitialAd();
          }
        })..load();
  }
  /*   ======================   插页式广告部分结束   ======================   */

  // 私有构造函数
  VadInstance._() {

	// 初始化 firebase_admob
    FirebaseAdMob.instance.initialize(appId: AD_MOB_APP_ID);
    
    _interstitialAd = createInterstitialAd();

	/*   ======================   激励广告部分开始   ======================   */
 	RewardedVideoAd.instance.load(adUnitId: AD_JI_LI, targetingInfo: targetingInfo);
    RewardedVideoAd.instance.listener =
        (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) {
      if (event == RewardedVideoAdEvent.loaded) {
        _loadedAsBehaviorSubject.value = true;
      }
      if (event == RewardedVideoAdEvent.closed) {
        _loadedAsBehaviorSubject.value = false;
      }
      if (event == RewardedVideoAdEvent.failedToLoad) {
        _loadedAsBehaviorSubject.value = false;
      }
    };
    _loadedAsBehaviorSubject.listen((loaded) {
      if (!loaded) {
        RewardedVideoAd.instance.load(adUnitId: AD_JI_LI, targetingInfo: targetingInfo);
      }
    });
    /*   ======================   激励广告部分结束   ======================   */
  
  }
  
  // 静态、同步、私有访问点
  static VadInstance _getInstance() {
    if (_vadInstance == null) {
      _vadInstance = VadInstance._();
    }
    return _vadInstance;
  }

  static final MobileAdTargetingInfo targetingInfo = new MobileAdTargetingInfo(
    keywords: <String>['flutterio', 'beautiful apps'],
    contentUrl: 'https://flutter.io',
    birthday: DateTime.now(),
    testDevices: <String>[],
  );
  
  // 页面中用户点击操作后调取 VadInstance.instance.showRewardedVideoAd(); 即可
  Future<bool> showRewardedVideoAd() {
    if (_loadedAsBehaviorSubject.hasValue &&  _loadedAsBehaviorSubject.value) {
      RewardedVideoAd.instance.show();
    } else {
      // 没加载出来广告
    }
  }

  // 页面中用户点击操作后调取 VadInstance.instance.showInterstitialAd(); 即可
  Future<bool> showInterstitialAd() async {
    if (await _interstitialAd.isLoaded()) {
      _interstitialAd.show();
    }
    else {
      // 没加载出来广告
    }
  }
  
}

最后,在项目的入口文件处加上这么一句,就可以提前加载出广告,以便用户触发弹广告的操作后能瞬间展示出广告,而不是触发弹广告的操作后先去请求广告再展示。

VadInstance.instance;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用Firebase_Messaging接收推送通知的完整Flutter iOS代码: ```dart import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; @override void initState() { super.initState(); _firebaseMessaging.requestPermission(); _firebaseMessaging.configure( onMessage: (Map<String, dynamic> message) async { print("onMessage: $message"); showDialog( context: context, builder: (context) { return AlertDialog( content: ListTile( title: Text(message['notification']['title']), subtitle: Text(message['notification']['body']), ), actions: <Widget>[ FlatButton( child: Text('Ok'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); }, onResume: (Map<String, dynamic> message) async { print("onResume: $message"); }, onLaunch: (Map<String, dynamic> message) async { print("onLaunch: $message"); }, ); } @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Firebase Messaging', home: Scaffold( appBar: AppBar( title: Text('Flutter Firebase Messaging'), ), body: Center( child: Text('Welcome to Flutter Firebase Messaging'), ), ), ); } } ``` 在这个例子中,我们首先使用Firebase.initializeApp()初始化Firebase应用程序,然后创建FirebaseMessaging实例并调用requestPermission()请求权限。接下来,我们使用configure()方法配置FirebaseMessaging以处理不同的消息事件。当应用程序处于前台时,onMessage()方法被调用,我们在这里创建一个AlertDialog来显示推送通知的标题和正文。当应用程序处于后台或未运行时,onResume()和onLaunch()方法被调用,我们可以在这里处理推送通知。 希望这个例子能够帮助你使用Firebase_Messaging接收推送通知。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值