SwiftUI接入穿山甲开屏广告

2023-11-20

研究了一下SwiftUI怎么接入穿山甲。

基于穿山甲sdk版本 4.7.0.8 例子地址

1. 首先要先注册一个账号,穿山甲地址

  1. 在广告变现->流量->应用中创建一个应用并记录下应用ID。在这里插入图片描述

  2. 在广告变现->流量->代码位创建一个代码位并记录下代码位ID。注意要把是否应用于GroMore选择成否,要不然就需要用GreMore引擎在这里插入图片描述

  3. 记录账号ID。在这里插入图片描述

2. 安排广告显示位置

import SwiftUI

@main
struct DemoApp: App {
    // 控制广告是否显示
    @State var showAd: Bool = true
    
    var body: some Scene {
        WindowGroup {
            if showAd == true {
                DSplashView(showAd: $showAd)
            } else {
                ContentView()
            }
        }
    }
}

// 获取根rootViewController
extension UIApplication {
  var currentKeyWindow: UIWindow? {
    UIApplication.shared.connectedScenes
      .filter { $0.activationState == .foregroundActive }
      .map { $0 as? UIWindowScene }
      .compactMap { $0 }
      .first?.windows
      .filter { $0.isKeyWindow }
      .first
  }

  var rootViewController: UIViewController? {
    currentKeyWindow?.rootViewController
  }
}

2.广告初始化,由于高版本的直接使用switf初始化有点问题,改成包了一个OC

DAdHandler.h

#ifndef DAdHandler_h
#define DAdHandler_h

#import <Foundation/Foundation.h>

@interface DAdHandler : NSObject

- (instancetype)init;

@end

#endif /* Header_h */

DAdHandler.m

#import <Foundation/Foundation.h>
#import "DAdHandler.h"
#import <BUAdSDK/BUAdSDKManager.h>
#import <BUAdSDK/BUAdSDKConfiguration.h>

@interface DAdHandler()

@end

@implementation DAdHandler

- (instancetype)init {
    if (self = [super init]) {
        [self initADSdk];
    }
    return self;
}

- (void)initADSdk {
    BUAdSDKConfiguration* config = [BUAdSDKConfiguration alloc];
    [config setAppID:@"5328067"];
    
    NSLog(@"DAdHandler init");
    
    [BUAdSDKManager startWithSyncCompletionHandler:^(BOOL success, NSError *error) {
        if (success) {
            NSLog(@"初始化成功");
        } else {
            NSLog(@"初始化失败");
        }
    }];
}

@end

3. 广告界面

//
//  DSplashView.swift
//  Demo
//
//  Created by wangyu on 2022/8/25.
//

import SwiftUI
import BUAdSDK
import AdSupport
import AppTrackingTransparency

class DSplashInstance: NSObject, BUSplashAdDelegate {
    var delegate: DSplashInstanceProtocol?
    
    lazy var splashAdInstance: BUSplashAd? = {
        let instance = BUSplashAd.init(slotID: "887901739", adSize: .init(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
        return instance
    }()
    
     override init() {
         super.init()
        
         // 延时一会执行,要不然可能拿不到广告IDFA
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [self] in
             if #available(iOS 14.0, *) {
                 ATTrackingManager.requestTrackingAuthorization { [self] status in
                     print("请求idfa状态 \(status)")
                     if status == .authorized {
                         DAdHandler.init()
                         print("idfa \(ASIdentifierManager.shared().advertisingIdentifier)")
                         
                         

                         if self.splashAdInstance != nil {
                             print("初始化广告位成功")
                         }

                         self.splashAdInstance?.delegate = self
                         self.splashAdInstance?.loadData()
                     }
                 }
             } else {
                 DAdHandler.init()

                 if self.splashAdInstance != nil {
                     print("初始化广告位成功")
                 }

                 self.splashAdInstance?.delegate = self
                 self.splashAdInstance?.loadData()
             }
         }
    }
    
    func splashAdLoadSuccess(_ splashAd: BUSplashAd) {
        print("广告加载成功")
    }
    
    func splashAdLoadFail(_ splashAd: BUSplashAd, error: BUAdError?) {
        print("广告加载失败 \(error?.userInfo)")
    }
    
    func splashAdRenderSuccess(_ splashAd: BUSplashAd) {
        print("广告加载渲染成功")
        if UIApplication.shared.rootViewController != nil {
            splashAd.showSplashView(inRootViewController: UIApplication.shared.rootViewController!)
        }
    }
    
    func splashAdRenderFail(_ splashAd: BUSplashAd, error: BUAdError?) {
        print("广告加载渲染失败")
    }
    
    func splashAdWillShow(_ splashAd: BUSplashAd) {
        print("广告将要显示")
    }
    
    func splashAdDidShow(_ splashAd: BUSplashAd) {
        print("广告已经显示")
    }
    
    func splashAdViewControllerDidClose(_ splashAd: BUSplashAd) {
        print("广告关闭")
        delegate?.closeAd()
    }
    
    func splashDidCloseOtherController(_ splashAd: BUSplashAd, interactionType: BUInteractionType) {
        print("广告关闭其他")
    }
    
    func splashVideoAdDidPlayFinish(_ splashAd: BUSplashAd, didFailWithError error: Error) {
        print("广告播放完成")
    }
    
    func splashAdDidClick(_ splashAd: BUSplashAd) {
        print("广告点击")
    }
    
    func splashAdDidClose(_ splashAd: BUSplashAd, closeType: BUSplashAdCloseType) {
        print("广告关闭")
    }
}

protocol DSplashInstanceProtocol {
    func closeAd()
}

struct DSplashView: View, DSplashInstanceProtocol {
    @Binding var showAd: Bool
    private var adInstanse: DSplashInstance?
    
    init(showAd: Binding<Bool>) {
        self._showAd = showAd
        adInstanse = DSplashInstance()
        adInstanse?.delegate = self
    }
    
    func closeAd() {
        showAd = false
    }
    
    var body: some View {
        VStack {
            Color.gray
        }
    }
}

struct DSplashView_Previews: PreviewProvider {
    @State static var showAd: Bool = true
    
    static var previews: some View {
        DSplashView(showAd: $showAd)
    }
}

5. 测试的话,需要用到的增加测试工具项

在这里插入图片描述
IDFA如果同意的话,在日志中就能看到了。

例子地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI接入穿山甲开屏广告 的相关文章

随机推荐

  • 时序预测

    时序预测 MATLAB实现TCN LSTM时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 MATLAB实现TCN LSTM时间卷积长短期记忆神经网络时间序列预测 预测效果 基本介绍 模型描述 程序设计 参考资料 预测效果 基本介绍
  • win10下的anaconda安装pymysql

    1 打开anaconda的终端 即 anaconda prompt 2 输入命令 pip install pymysql ps 其余包都可以使用pip install xxx来完成安装 若下载失败 可在一下链接查找相关包进行安装 https
  • Java 单例模式、工厂模式、代理模式

    文章目录 单例模式 概念 单例模式的类型 破坏单例模式 枚举实现单例模式 工厂模式 概述 简单工厂模式 工厂方法 抽象工厂 代理模式 Proxy 概述 静态代理 动态代理 单例模式 概念 单例模式指在内存中创建对象且仅创建一次的设计模式 在
  • 《Pyramid Scene Parsing Network》

    Pytorch代码 1 研究问题 目前基于FCN的语义分割网络缺乏利用不同尺度全局上下文信息的能力 对于复杂图像的语义分割 如ADE20K数据集 存在问题 注 感受野的大小可以粗略表示为使用上下文信息的程度 2 研究方法 提出了金字塔场景理
  • Mybatis的常用注解

    加载配置文件的时候 绝对路径和相对路径的写法都不太好用 我们经常使用的两种方法第一种就是使用类加载器 他只能读取类路径的配置文件 第二种就是使用ServletContext对象的getRealPath 函数 mybatis的常用注解 1 与
  • jsp+servlet+ajax实现登录

    该案列使用jsp servlet ajax实现登录 页面简洁大方 弹框都是封装的插件 整体案列采用三层的模式 链接数据库方面用的是dbcp的链接池 数据库时mysql 运行效果如下图 下载地址 jsp servlet ajax实现登录案例
  • c++(对象赋值与拷贝构造函数)

    对象赋值 同一个类的对象之间可以相互赋值 默认情况下 进行的是对象成员之间的复制 也称为 按位复制 或 浅复制 当类的数据成员中没有指针类型的变量时 直接对两个对象进行赋值没有问题 但是一旦类的数据成员含有指针变量 那么直接对这两个对象进行
  • MySQL常用基础 - 小白必看(二)

    MySQL数据库基本操作 一 DDL 概念 是一个数据定义语言 该语言部分包括 1 对数据库的常用操作 创建数据库 1 create database 数据库名 直接删除 2 create database if not exists 数据
  • 《effective java》中关于解决构造函数/方法签名包含大量参数的解决方法

    针对构造方法 重叠构造器模式 重叠构造器模式是一种编程中的反模式 指的是一个类有多个构造函数 每个构造函数都有不同数量的参数 从而可以根据不同的情况创建对象 这种方式会导致代码可读性和可维护性降低 因为构造函数过多 参数顺序容易混淆 Jav
  • 使用 Composer 安装 JWT 失败错误 The "https://packagist.org/packages.json" file could not be downloaded 解决方案

    错误信息 The https packagist laravel china org packages json file could not be downloaded SSL operation failed with code 1 O
  • Redis3.0集群方案分析

    在Redis3 0集群出来之前 大家都对作者antirez寄予厚望 因为Redis从来没有让我们失望过 现在Redis3 0集群出来了 网上出了很多评论文章 都说他的功能多么强大 包括下面这张图是彻底把我欺骗了 等到我把Redis3 0客户
  • Qmake VS Cmake 对比讲解

    用 cmake 构建Qt工程 对比qmake进行学习 cmake vs qmake qmake 是为 Qt 量身打造的 使用起来非常方便 cmake 使用上不如qmake简单直接 但复杂换来的是强大的功能 内置的 out of source
  • 一点浩然气,千里快哉风

    到英国访学一年 也认识了一些其他来自国内的访问学者 平时周末也经常一起徒步聚餐 从今年1月份以来 基本每个月有一个小伙伴回国 随着身边的小伙伴越来越少 以及自己也要不久回国了 心里不免有些人走茶凉 曲终人散的落寞 总体上 来英国的访问学者很
  • 【模板】快速排序

    题目链接 洛谷 P1177 模板 快速排序 1960年由查尔斯 安东尼 理查德 霍尔 Charles Antony Richard Hoare 缩写为C A R Hoare 提出 如下图所示 快速排序的执行流程为 从序列中选择一个轴点元素
  • C/C++ getcwd 获取项目的运行路径

    在Linux下做QT项目时 需要获取项目的运行路径 于是用getcwd函数进行获取 然后在Windows下进行测试 发现获取到的是程序的项目路径 即代码文件路径 然后再Linux QT中测试 获取到的又是运行路径 这就很纳闷了 经过再三测试
  • 2-1、Lua数据结构

    2 1 Lua数据结构 文章目录 2 1 Lua数据结构 1 数组 2 矩阵和多维数组 3 链表 4 队列和双向队列 5 集合和包 6 字符串缓冲 table是Lua中唯一的数据结构 其他语言所提供的数据结构 如 arrays record
  • python crop函数-图片裁剪函数

    crop 函数的参数形式是 x1 y1 x2 y2 这个元组是作为一个参数的 参考代码 from PIL import Image im Image open d 22 jpg im1 im crop im size 0 4 im size
  • linux中进入目录命令是什么,linux进入目录的命令是什么

    linux进入目录的命令是 cd 该命令的作用是切换至指定目录下 语法格式为 cd dirName 参数 dirName 表示要切换的目标目录 可以是绝对路径或相对路径 若目录名称省略 则变换至使用者的home目录 本教程操作环境 Red
  • bp神经网络时间序列预测,bp神经网络有几个阶段

    什么是BP神经网络 BP算法的基本思想是 学习过程由信号正向传播与误差的反向回传两个部分组成 正向传播时 输入样本从输入层传入 经各隐层依次逐层处理 传向输出层 若输出层输出与期望不符 则将误差作为调整信号逐层反向回传 对神经元之间的连接权
  • SwiftUI接入穿山甲开屏广告

    研究了一下SwiftUI怎么接入穿山甲 基于穿山甲sdk版本 4 7 0 8 例子地址 1 首先要先注册一个账号 穿山甲地址 在广告变现 gt 流量 gt 应用中创建一个应用并记录下应用ID 在广告变现 gt 流量 gt 代码位创建一个代码