| categories:swift develop

Lite VersionとAdmob

Swiftへの移行がちょっと落ち着いてきたので、お次はライトバージョンの制作に移る。同じプロジェクト内でライト版のターゲットをもつ方法で行います。ライト版では広告を表示するため、コード内のマクロで作業の分離を行います。(XCode7.3.1にて)

  1. ターゲットのコピーと調整
  2. スキームの変更
  3. 新しいInfo.plistのリネーム、変更と移動
  4. コンパイル時のマクロ設定
  5. アイコンの追加

が主な作業の流れになります。


まずはプロジェクトのメインターゲットを Duplicate します。

Duplicate Target

スキーム名の変更はできないようなので、Editボタンの上の+より、新しいスキームを追加します。ここの、cosper copyのものは+の横のーボタンで消去します。

Info.plistのコピーの cosper copy-Info.plist はなぜか諸々のファイルのフォルダーの外に作られます。ちょっと面倒ですが、リネームしリファレンスから除き、プロジェクトにコピーして移動、そしていらなくなったファイルを削除をしましょう。

そしてビルドセッティング内のInfo.plistパラメーターをディレクトリー名を含めたファイル名に変更します。

そして、ターゲットの設定をします。(バンドル名やその他必要なもの)


最後に、コンパイル時のマクロ設定をします。#if LITE で処理を分岐できるようにします。LITE_VERSIONでもFREE_VERSIONでもご自分に適したものにしてください。

マクロの設定は、ビルドセティングより、右のサーチボックスから検索していくと良いです。フル・ライト両方のターゲットで設定が必要です。ライトにて LITE=1 を、

フルバージョンの方には LITE=0 を書き込みます。選択すると入力画面が出てきます。

そして、ライトバージョンでは、コンパイラーのカスタムフラグを設定します。


アイコンもライトバージョン用に追加、変更します。アイコンは、Assets.xcassetsより作成し、ターゲットにて設定します。

これで、ライトバージョンのターゲットが完成です。次に、ライトバージョンに広告を入れたいと思います。

AdMobの追加

iAdは終了してしまいましたので、定番Googleの AdMob をインストールします。CocoaPods を使って簡単にプロジェクトに追加することもできるのですが、私の開発機の不思議な不具合でココポッドを設定していません。。ファイルを落としてフレームワークを追加という手動インストールをします。(また、近くCocoaPodsを使った方法をアップデートするかもしれません。とりあえずココポッドでのインストール時には、Podfileに target 'xx lite' do ... で切り分ければいいのかな。)

フレームワーク

必要なフレームワークは、以下。

  • GoogleMobileAds.framework: Googleサイトよりダウンロード、プロジェクトにコピー (ターゲットをライトバージョンのみにするのを忘れずに)

プロジェクトからターゲットを選択して、一番下のLinked Frameworks and Librariesより追加、コマンド+クリックで複数選択可能。

  • AdSupport
  • AudioToolbox
  • AVFoundation
  • CoreGraphics
  • CoreTelephony
  • EventKit
  • EventKitUI
  • MessageUI
  • StoreKit
  • SystemConfiguration

以上で準備完了。実装していきます。


コーディング

マクロを使って、以下の形で処理を分けることができます。

#if LITE
 	// ライトバージョンで行う処理
#else
 	// フルバージョンでの処理
#endif

下記の例は、テーブルビューを使ったアプリでの表示例になっています。テーブルビューのヘッダー部分に広告が表示されます。(実際に使っているコードから引用。)

import UIKit
import CoreData
#if LITE
import GoogleMobileAds
#endif

class ListTableViewController: UITableViewController,NSFetchedResultsControllerDelegate {

    #if LITE
    /// The banner view.
    let GADApplicationID = "ca-app-pub-xxxxxxx/xxxxxxx"
    var bannerView: GADBannerView!
    #endif
    
    .......

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        setNavigationBarGestures()
        self.tableView.showsVerticalScrollIndicator = false
        self.tableView.rowHeight = Cell.Height

      .......

        #if LITE
            loadAdmob()
        #endif
     }

	.......
	

アドモブ用の処理ファイルを別にします。こちらもターゲットをライトバージョンのみにします。(ちょっとすっきりする。)デレゲートにて広告を受け取ったときにテーブルヘッダーに表示する形をとってます。

//
//  Admob.swift
//

import UIKit
import GoogleMobileAds

extension ListTableViewController: GADBannerViewDelegate {
    
    func loadAdmob() {
        print("Google Mobile Ads SDK version: \(GADRequest.sdkVersion())")
        
        bannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
        bannerView.adUnitID = GADApplicationID
        bannerView.delegate = self
        bannerView.rootViewController = self
//	For Debug      
//        let request:GADRequest = GADRequest()
//        request.testDevices = [kGADSimulatorID]
//        bannerView.loadRequest(request)
        bannerView.loadRequest(GADRequest())
    }
        
    func adViewDidReceiveAd(bannerView: GADBannerView!) {
        print("Admob:adViewDidReceiveAd")
        let adMobView = bannerView
        
        UIView.beginAnimations("AdBannerMoveOnScreen", context: nil)
        self.bannerView.frame = CGRectMake(0.0, 0.0,
                                           adMobView.frame.size.width, adMobView.frame.size.height)
        self.tableView.tableHeaderView = self.bannerView
        UIView.commitAnimations()
    }
    
    func adView(bannerView: GADBannerView!, didFailToReceiveAdWithError error: GADRequestError!) {
        UIView.beginAnimations("ClearBannerView", context: nil)
        bannerView.frame = CGRectMake(0.0, 0.0, bannerView.frame.size.width, 0.0)
        tableView.tableHeaderView = bannerView        
        UIView.commitAnimations()
    }
    
}

割とあっさりと行きます。(こんな簡単だったけか??なんか忘れてんのかと、ちと不安。。)

comments powered by Disqus