Swiftへの移行がちょっと落ち着いてきたので、お次はライトバージョンの制作に移る。同じプロジェクト内でライト版のターゲットをもつ方法で行います。ライト版では広告を表示するため、コード内のマクロで作業の分離を行います。(XCode7.3.1にて)
- ターゲットのコピーと調整
- スキームの変更
- 新しいInfo.plistのリネーム、変更と移動
- コンパイル時のマクロ設定
- アイコンの追加
が主な作業の流れになります。
まずはプロジェクトのメインターゲットを Duplicate します。
スキーム名の変更はできないようなので、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()
}
}
割とあっさりと行きます。(こんな簡単だったけか??なんか忘れてんのかと、ちと不安。。)
See Also
🌷 tipping
🌻 sat ⚡️ goozenlab@getalby.com