iOS swift 啟動頁加載廣告(圖片廣告+視頻廣告)


一般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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM