应用启动后加载广告(swift)

第三讲开始了!
如果问我,我每天接触什么信息最多,那就非广告莫属了,劈天盖地的广告随处可见,我们讨厌这些广告的同时,别忘了广告也会对我们有一定的帮助,广告可以引导我们去做一些我们需要但不了解的事物,也许这个广告对你没有帮助,但对他有帮助,所以才会有广告这个行业.当然这不是今天的重点😆!言归正传进入我们开发中!
在我们使用过的APP中有80%的APP都会有广告的出现,这也就体现了广告模块开发的重要性!

广告的加载可以分很多种场景,例如:1.有的会在启动图过后立即加载广告,2.有的会在应用加载完成几秒后加载广告,3.还有的是在你完成某个动作后加载广告等等,广告加载的样式也各有千秋,我今天要讲的就是第一种在启动图过后立刻加载广告,这是应用比较广的一种.

下面👇我们就研究一下作为开发人员如何设计广告页面,首先我们先确定一下思路.

1.既然要加载广告首先我们需要创建广告视图
import UIKit
let kScreenWidth = UIScreen.main.bounds.width
let kScreenHight = UIScreen.main.bounds.height


class AdvertView: UIView {


var advView = UIImageView()

var skipButton = UIButton()

var imageFilePath : String?
var timer :Timer!
var time:Int = 3
override init(frame:CGRect) {
    
    super.init(frame: frame)


    //设置广告图片
    advView = UIImageView.init(frame: frame)
    advView.isUserInteractionEnabled = true
    advView.contentMode = UIViewContentMode.scaleAspectFill
    advView.clipsToBounds = true
    advView.backgroundColor = UIColor.red
    if (imageFilePath != nil) {
        advView.image = UIImage(contentsOfFile: imageFilePath!)
    }
    //给广告图片添加手势
    let  imageTap = UITapGestureRecognizer(target: self, action: #selector(pushAdDetail))
    advView.addGestureRecognizer(imageTap)
    //跳过按钮
    let btnW:CGFloat = 60
    let btnH:CGFloat = 30
    skipButton = UIButton(frame: CGRect(x: kScreenWidth - btnW, y: btnH, width: btnW, height: btnH))
    skipButton.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
    skipButton.setTitle("跳过\(time)", for: .normal)
    skipButton.setTitleColor(UIColor.white, for: .normal)
    skipButton.backgroundColor = UIColor.gray
    skipButton.layer.cornerRadius = 4
    self.addSubview(advView)
    self.addSubview(skipButton)
    // 启用计时器,控制每秒执行一次tickDown方法
    timer = Timer.scheduledTimer(timeInterval: TimeInterval(1), target: self, selector: #selector(tickDown), userInfo: nil, repeats: true)
}
//定时器触发的方法
func tickDown()  {

    self.time -= 1
    skipButton.setTitle("跳过\(time)", for: .normal)
    //如果剩余时间小于等于0
    if(self.time <= 0){
        //取消定时器
        self.timer.invalidate()
        dismiss()

    }
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func tapAction()  {
    dismiss()
}

//移除广告
func dismiss()  {
    self.timer.invalidate()
    self.timer = nil
    UIView.animate(withDuration: 0.3, animations: { 
            self.alpha = 0
        }) { (finish) in
            self.removeFromSuperview()
    }

}
//发送通知
 func pushAdDetail()  {
    dismiss()
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "pushAd"), object: nil)
}
//显示广告视图
func show()  {
    let  window  = UIApplication.shared.keyWindow
    window?.addSubview(self)

  }

}
2.既然我们要将广告显示在加载完启动图后,那么我们加载广告的代码就要在AppDelegate内被触发.
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool{} 
3.加载广告是每次程序运行时都需要加载的,考虑到用户体验,广告加载时间会很短,所以要考虑如果网络缓慢也不要有延迟,那么需将图片异步下载到本地,并保存图片名,每次打开APP时先根据本地存储的图片名查找沙盒中是否存在该图片,如果存在,则显示广告页。
因为是异步下载缓存广告图片所以要判断当前存在的广告图片是否是最新的广告图,如果是则只显示不重复缓存,如果不是最新广告图需显示当前图片然后删除当前图片缓存最新图片在下次进入APP时展示!
import UIKit
let adImageName = "adImageName"
let adUrl = "adUrl"

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var advertView = AdvertView()


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
      let nav = UINavigationController(rootViewController: ViewController())
    self.window?.rootViewController = nav

    self.window?.makeKeyAndVisible()

    // 1.判断沙盒中是否存在广告图片,如果存在,直接显示

    let image = UserDefaults.standard.value(forKey: adImageName) as! String? ?? " "
    let filePath = NSHomeDirectory().appending("/Documents/\(image)")
    let isExist = self.isFileExist(withFilePath: (filePath))
    if isExist {
        advertView = AdvertView.init(frame: CGRect(x: 0, y: 0, width: (self.window?.bounds.size.width)!, height: (self.window?.bounds.size.height)!))
        advertView.advView.image = UIImage(contentsOfFile: filePath)
        advertView.backgroundColor = UIColor.red
        advertView.show()
    }
 // 2.无论沙盒中是否存在广告图片,都需要重新调用广告接口,判断广告是否更新
    self.getAdvertisingImage()
    return true
}

/**
 *  初始化广告页面
 */
func getAdvertisingImage() {
    // TODO 请求广告接口
    // 这里原本采用美团的广告接口,现在了一些固定的图片url代替
    var imageArray: [Any] = [ "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1488259299&di=5fd14456fb2a6fb5b0a6a3e7ec8286d0&src=http://a-ssl.duitang.com/uploads/item/201510/30/20151030103110_zNCht.jpeg"]
    //https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488269385582&di=44087eed1458b25e9cb8958ea7960198&imgtype=0&src=http%3A%2F%2Fpic1.win4000.com%2Fmobile%2Fb%2F5591f15baf5a7.jpg

    let imageUrl: String = imageArray[0] as! String
    // 获取图片名:43-130P5122Z60-50.jpg
    let stringArr: [Any] = imageUrl.components(separatedBy: "/")
    let imageName: String = (stringArr.last as! String?)!
    // 拼接沙盒路径
    let filePath: String = NSHomeDirectory().appending("/Documents/\(imageName)")
    let isExist: Bool = self.isFileExist(withFilePath: filePath)
    if !isExist {
        // 如果该图片不存在,则删除老图片,下载新图片
        self.downloadAdImage(withUrl: imageUrl, imageName: imageName)
    }
}


/**
 *  判断文件是否存在
 */
func isFileExist(withFilePath filePath: String) -> Bool {
    let fileManager = FileManager.default

    var isDirectory:ObjCBool = false

    return fileManager.fileExists(atPath: filePath, isDirectory :  &isDirectory)
}

/**
 *  下载新图片
 */
func downloadAdImage(withUrl imageUrl: String, imageName: String) {
    DispatchQueue.global(qos: .default).async(execute: {() -> Void in

        let url =  URL(string: imageUrl)

        let data :Data? = try? Data(contentsOf: url!)

        let filePath: String = NSHomeDirectory().appending("/Documents/\(imageName)")
        let fileManager = FileManager.default
        fileManager.createFile(atPath: filePath, contents: data , attributes: nil)
        self.deletOldImage()
        UserDefaults.standard.set(imageName, forKey: adImageName)
        UserDefaults.standard.synchronize()

    })
}

/**
 *  删除旧图片
 */
func deletOldImage()  {
    let imageName = UserDefaults.standard.value(forKey: adImageName)!
    if (imageName != nil) {
        let filePath = NSHomeDirectory().appending("/Documents/\(imageName)")
        let fileManager:FileManager = FileManager.default
       try? fileManager.removeItem(atPath: filePath)

    }
  }
}
4.点击广告视图时进入广告详情页面,需要注意的是要从首页push进入广告详情页.

在AdvertView的pushAdDetail()方法中发送通知,在ViewController中viewDidLoad方法接受通知并执行跳转pushAd()方法!

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(pushAd), name: NSNotification.Name(rawValue: "pushAd"), object: nil)
    self.view.backgroundColor = UIColor.white
}

func pushAd()  {
  let advertVc =  AdvertDetailViewController()

    self.navigationController?.pushViewController(advertVc, animated: true)

  }
}
广告的加载大功告成,相信本讲,对读者朋友会有所帮助,如果觉得文章还可以,点击下方👇喜欢鼓励一下,没关注的朋友可以点击一下关注,专题系列讲解持续更新中!

专题目录:Swift开发之功能模块

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,488评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 云城 裴府 “娘亲,我不要嫁人,不要嫁给席家少爷!” “鸢儿,你不要闹了,他就看上你了娘亲也没有办法啊!” “我都...
    枕梦行阅读 447评论 2 4
  • 第一个独自在外的中秋节。 这个小假很宅,除了出去买买菜,然后就窝在“家”中。 小长假第一天,还是沿袭了旧有的节奏,...
    刘丽赏阅读 163评论 2 1
  • 1. Louis是五点过八分回来的。那时候我在书房,听到门被打开,然后传出来二个孩子的声音,我依然故作冷静忙自己的...
    小H嗨皮阅读 288评论 2 2