一般app在启动的时候都会有广告页,广告页用来加载自己的或者第三方的广告,广告的展示形式也多种多样,最近在看swift相关的东西,这里将提供支持加载图片广告和视频广告的解决方案

思路:

我们知道在加载启动页广告的时候,都需要将内容下载下来才可以正常加载出来(要不然一边启动一边加载,如果网速比较慢,可能时间都过了,图片或者视频仍然没有加载出来),所有一般加载图片需要事先把图片内容或者视频内容缓存在本地,下一次打开app的时候,查询上一次下载的内容并显示出来,同时调用服务端接口将本次的广告内容缓存起来,以供下次启动使用。由于需要显示的广告内容不确定性(图片或者视频),所以需要服务端来控制,将服务端返回的json转换成model并缓存在本地,josn中包显示类型(图片、视频还是其他),内容下载地址(图片或者视频下载地址),内容点击后是否需要跳转,跳转的链接等等信息,下次启动的时候查询model,并根据内容进行加载和跳转

关于显示:

图片显示这一块比较简单,直接将整张图片显示在视图中即可,给图片添加tap事件,这样当用户点击时以便可以跳转到指定的位置

视频显示这一块使用AVFoundation中的avplayer,关于avplayer需要注意的是,其切换到后台,在进入前台的时候容易导致视频暂停,我这里的解决方案是添加applicationDidBecomeActive代理,这样当app从后台切换到前台时,捕捉到这个事件,并发送通知让avplayer继续播放

图片广告 视频广告

更多详细内容请参考代码

appDelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.backgroundColor = .white
//设置rootViewController
self.window?.rootViewController = ViewController()
//设置launchView
_ = LaunchView(frame: (window?.bounds)!)
self.window?.makeKeyAndVisible()
return true
} //MARK:- 后台切换到前台
func applicationDidBecomeActive(_ application: UIApplication) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "appBecomeActive"), object: nil)
}
}

LaunchView.swift

import UIKit
import AVFoundation class LaunchView: UIView { var timer:Timer!
var interval:Int = 5 lazy var imgView: UIImageView = {
let imgView = UIImageView()
imgView.isUserInteractionEnabled = true
let gesture = UITapGestureRecognizer.init(target: self, action: #selector(imgTouchAction))
gesture.numberOfTouchesRequired = 1
imgView.addGestureRecognizer(gesture)
return imgView
}() lazy var skipBtn:UIButton = {
let skipBtn = UIButton()
skipBtn.backgroundColor = UIColor(white: 0, alpha: 0.1)
skipBtn.setTitle("跳过广告\(interval)s", for: .normal)
skipBtn.setTitleColor(.white, for: .normal)
skipBtn.titleLabel?.font = .systemFont(ofSize: 12)
skipBtn.layer.cornerRadius = 15
skipBtn.layer.masksToBounds = true
skipBtn.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return skipBtn
}() fileprivate var playItem:AVPlayerItem{
get{
//视频路径
guard let path = Bundle.main.path(forResource: "test", ofType: "mp4") else {
fatalError("视频路径出错")
}
let url = URL(fileURLWithPath: path)
let playItem = AVPlayerItem(url: url)
return playItem
}
} fileprivate lazy var player: AVPlayer = {
let player = AVPlayer(playerItem:playItem)
player.actionAtItemEnd = .pause
//设置播放完成后发送通知
NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidPlayToEndTimeNotification(noti:)), name: .AVPlayerItemDidPlayToEndTime, object: nil)
return player
}() override init(frame: CGRect) {
super.init(frame: frame)
//这里需要根据内容切换显示图片视图还是显示视频视图
setupUI()
// setupVideoUI()
} required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// setupUI()
} private func setupUI(){
backgroundColor = .white addSubview(imgView)
imgView.snp.makeConstraints { (make) in
make.edges.equalToSuperview()
}
imgView.sd_setImage(with: URL(string: "http://img.zcool.cn/community/01e3ee5a6f2aa8a801213466f492ba.JPG@2o.jpg")) guard let window = UIApplication.shared.delegate?.window else{
dismiss()
return;
}
window?.isHidden = false
window?.addSubview(self) addSubview(skipBtn)
skipBtn.snp.makeConstraints { (make) in
make.top.equalToSuperview().offset(30)
make.right.equalToSuperview().offset(-25)
make.size.equalTo(CGSize(width: 80, height: 30))
}
//开启定时器
startTimer()
} @objc private func imgTouchAction(){
//图片广告被点击,这里可以发送通知跳转到指定页面
dismiss()
} private func startTimer(){
if timer == nil {
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerInterval), userInfo: nil, repeats: true)
}
} @objc private func timerInterval(){
interval -= 1
if interval <= 0 {
interval = 0
dismiss()
return
}
skipBtn.setTitle("跳过广告\(interval)s", for: .normal)
} @objc private func dismiss(){
if timer != nil {
if timer.isValid { //如果定时器开启状态,关闭定时器
timer.invalidate()
}
}
UIView.animate(withDuration: 0.5, animations: {
//缩放
self.imgView.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
//渐隐
self.alpha = 0
}, completion: { Bool in
self.removeFromSuperview()
})
} deinit {
print("启动页移除")
NotificationCenter.default.removeObserver(self)
}
} //MARK:- 视频相关
extension LaunchView{ fileprivate func setupVideoUI(){
backgroundColor = .white
NotificationCenter.default.addObserver(self, selector: #selector(playVideos), name: NSNotification.Name(rawValue: "appBecomeActive"), object: nil)
setupForAVplayerView()
player.play() guard let window = UIApplication.shared.delegate?.window else{
dismiss()
return;
}
window?.isHidden = false
window?.addSubview(self) //跳过广告
skipBtn.setTitle("跳过广告", for: .normal)
addSubview(skipBtn)
skipBtn.snp.makeConstraints { (make) in
make.top.equalToSuperview().offset(30)
make.right.equalToSuperview().offset(-25)
make.size.equalTo(CGSize(width: 80, height: 30))
}
} private func setupForAVplayerView(){
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = bounds
layer.addSublayer(playerLayer)
let gesture = UITapGestureRecognizer(target: self, action: #selector(videoAdTouch))
gesture.numberOfTapsRequired = 1
addGestureRecognizer(gesture)
} @objc private func playerItemDidPlayToEndTimeNotification(noti:Notification){
player.pause()
dismiss()
} @objc private func videoAdTouch(){
player.pause()
//视频被点击 可以发送通知让进行跳转
dismiss()
} @objc private func playVideos(){
player.play()
}
}

这里需要注意代码中提供了2中视图样式,需要根据显示类型在这里切换样式

    override init(frame: CGRect) {
super.init(frame: frame)
//这里需要根据内容切换显示图片视图还是显示视频视图
setupUI()
// setupVideoUI()
}

整个视图展示在window上,如果需要图片或者视频点击后需要跳转,可以通过发送通知,将点击的model通过通知的形势在rootViewController中注册通知,并接受通知和跳转

由于需要涉及到到接口调用,我这里没有写那么详细,代码中的图片和视频使用的是本地数据,具体json的存储过程可以根据实际情况自行拓展

转发请标记转发来源:https://www.cnblogs.com/qqcc1388/p/9894684.html

iOS swift 启动页加载广告(图片广告+视频广告)的更多相关文章

  1. iOS-APP启动页加载广告

    概述 加载广告页, 展现跳过按钮实现倒计时功能, 并判断广告页面是否更新. 详细 代码下载:http://www.demodashi.com/demo/10698.html 目前市场上很多APP(如淘 ...

  2. iOS启动页加载广告

    1.定义全局成员变量 @interface AppDelegate () @property (strong, nonatomic) UIImageView *adImageView; @proper ...

  3. iOS关于启动页自定义特殊处理

    平常开发中对于启动页可能会有一些特别的要求,比如在启动页加动画或加一些按键可以响应事件等,最近项目中要在启动页增加版本号,因为版本号是不断的改变,所以要动态实现把它加到启动页上:在XCode上面配置的 ...

  4. iOS App中数据加载的6种方式

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  5. WebView加载HTML图片大小自适应与文章自动换行

    http://www.brighttj.com/ios/ios-webview-load-html-image-adaptive.html 在很多App中都会使用到webview,尤其是在加载新闻内容 ...

  6. IOS 多个UIImageView 加载高清大图时内存管理

    IOS 多个UIImageView 加载高清大图时内存管理 时间:2014-08-27 10:47  浏览:59人 当我们在某一个View多个UIImageView,且UIImageView都显示的是 ...

  7. 启动就加载(一)----注解方式实现的。static项目启动的时候就加载进来(一般用于常用参数)

    一,案例 1.1,图片分析 1.2,代码 1.2.1,编写加载系统参数的servlet public class SysInitServlet extends HttpServlet { public ...

  8. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  9. UIWebView如何加载本地图片

    UIWebView如何加载本地图片 UIWebView加载本地图片是有实用价值的.比方说,有时候我们需要本地加载静态页来显示相关帮助信息,而这些帮助信息当中含有很多很多的富文本,用代码实现难度较大,这 ...

随机推荐

  1. centos7搭建svn服务器并支持http方式访问

    因为公司其他人员需要,需要在服务器上搭建svn服务,途中遇到不少问题,做下记录 第一步,安装svn 默认centos7是已经安装了svn即subversion 检查是否安装 rpm -qa subve ...

  2. php fopen函数返回false

    使用yum安装的apache2.4.6   php 7.2.2  正确安装后使用fopen()函数打开文件时返回false 百度一下又三种原因 1.目录或者文件夹权限原因 (可以用   chmod - ...

  3. java 二维码编码解码

    做一个小项目的时候写了个二维码编码和解码的小工具,感觉可能用得到,有兴趣的朋友可以看下 再次之前,徐需要用到google的zxing相关的jar包,还有javax相关包 以上为可能用到的jar pac ...

  4. 纯 PHP 代码最好在文件末尾删除 PHP 结束标记

    如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记.这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图. & ...

  5. 【笔记】js 关于定时器的理解

    总所周知 js 里面的 setTimeout() 方法是用来设定某些功能在某段时间间隔之后执行的.但是今天看了高程对定时器的描述发现并不是这样. setTimeout(function(){ //.c ...

  6. decorator在Python中的作用

    decorator(装饰器)在python中作用,可以起到代码复用,也可以起到AOP(面向横切面)的作用. 另外很重要的一点应该就是function在python的世界中是作为一等公民存在的. 在py ...

  7. automake连载--Linux下使用automake入门

    http://blog.csdn.net/shanzhizi/article/details/30246587 近来重要要总结一下automake的用法了,连载几篇网上已有的文章,以供参考. 作为Li ...

  8. Microsoft Visual C++ Redistributable Package下载

    温馨提示: 1.目前,很多程序软件正常运行需要VC++库的支持,因此,博主在此做了一个合集,方便大家下载: 2.有需要的朋友请根据自己需要下载,博主所提供的下载地址均是微软官网的,请放心下载: 3.如 ...

  9. 云计算之路-试用Azure:如何建立虚拟机之间的内网连接

    在阿里云上,同一个帐户创建的所有虚拟机(云服务器)之间的内网是直接连通的.而Azure则完全不一样,一开始使用时有点不知所措,后来摸索出来了——在Azure中只有处于同一个虚拟网络(Virtual N ...

  10. 从客户端的角度来谈谈移动端IM的消息可靠性和送达机制

    1.前言 IM App 是我做过 App 类型里复杂度最高的一类,里面可供深究探讨的技术难点非常之多.这篇文章和大家聊下从移动端客户端的角度所关注的IM消息可靠性和送达机制(因为我个人对移动客户端的经 ...