ガンズターン 公式サイト

楽しいことに、まじめです。 ——ガンズターンアプリ研究所公式サイト

Objective-Cの開発環境の動的な切替について

Pocket

どこかにアクセス解析用の軽いプラグイン落ちてないですかねえ……

このブログでは、どういった記事が人気あるのか等を調査するため、アクセス解析に「Google Analytics」というサービスを利用しています。
世界の「Google」先生が提供している、無料サービスの一つですね。

なので、大体のアクセス数の推移はわかるのですが(今の所、平均して1日10ユニークアクセスといったところでしょうか)、たまに自分の与り知らないURLからのリンクを辿ってやってくるお客様もいらっしゃるようで……。

本当にありがたいことです。
まだまだなにもないサイトですが、少しずつ充実させていきますので、今後ともよろしくお願いします。m(_ _)m

さて、こんな感じでいろんな情報がわかる「Google Analytics」ですが……
多機能である反面、操作が(わたしにとっては)複雑で、なかなか慣れないんですよね。
Wordpressのプラグインである「Jetpack」をインストールすれば、もうちょっと簡易的なアクセス解析機能がついているらしいんですが……
ただ、「Jetpack」は”超”巨大なプラグインらしく、もれなく必要ない機能まで“超”たくさん付いてくるようなので、導入を躊躇しています。

以前も書きましたが、Wordpressでのマークダウンでの記事執筆については、「JP Markdown」なるプラグインを導入しています。
この「JP Markdown」は、上記「Jetpack」の中からマークダウン執筆に必要な機能だけを抽出した軽量なプラグインであり、わたし個人的にはホームランな代物なのですが……
同じようにアクセス機能だけ抽出した便利なプラグインはないものでしょうか?
(何度か検索かけてみましたが、わたしのやり方がまずいのかなかなか良さげなやつが見つかりません)

もしご存知の方、いらっしゃったらこちらのコメントでもツイッターでも構いませんので情報提供していただけると泣いて喜びます。

さて、いつも通り前置きが長くなりました。ガンズターンのRyosukeです。

今日は、昨日までのリジェクトの話題に引き続き、iOS絡みのお話をば。

完全に「わたしはこうしたら便利と思う」というだけの話ですが、世界中のどなたかお一人にでも響いてくれたなら幸いです。

1. デバッグ環境と製品版環境を自動で切り替えたい!

さて、みなさま。
見出しにあるような願望を抱いたことって、ございませんでしょうか?

わたしはつい一ヶ月ほど前まで、見出しにあるような願望をめちゃくちゃ強く抱いていました。
なぜなら「りずもぐ!」とサーバを連携させる機能を初めて実装した際、サーバの参照URLいちいち手動で切り替えながら、繰り返し確認をしていたからです。

以下に、当時のわたしが書いていた「いい感じ」のソースコードを少しだけ変更して引用しますね。

/* (注意)ビルドの用途によって、以下の宣言をいい感じにコメントアウトすること */
#define SERVER_URL @"http://hogehoge.release.server/" //製品版環境
//#define SERVER_URL @"http://fugafuga.develop.server/" //開発版環境

……はい。
上記のような、非常に恥ずかしいコーディングを平気でしていたんですね。

これ、実作業としてはビルド前に一行コメントアウトして、一行コメントから戻すだけなんですが、何度も何度も繰り返していると憂鬱になるぐらい面倒な作業です。
それに、「製品版のビルド時に間違って開発版を向いた設定で書き出してしまった!」なんてことをしてしまったら大失敗もいいところ、本当に目もあてられない大惨事になります。

なので「なんとかならんもんかのう……」と夜も8時間しか寝られないぐらいに悩んで悩んで悩み抜いておりました。

しかし、ちょっと考えれば、そんなの普通に自動化する手段があって当然ですよね。

というわけで、本腰を入れて調べたら意外とあっけなく自動化できちゃいました。

2. 鍵は「Build Settings」にあった!

はい。わかりづらいと思うので、画像を添付しときますね。(何気に、このブログの通常記事で初めての画像だったり)

Xcodeキャプチャ画像

Xcodeの画面キャプチャ。黒い部分は魅惑の企業秘密です(笑)

一応、この設定をするまでの一連の操作を文章で表すと以下の通りです。

  1. まず、Xcode(ここではVersion 6.3.1)の左ペインにおける最上段、アプリのプロジェクト名が書かれているところをクリックする。
  2. その後、右側のペインで「Build Settings」のタグをクリック。
  3. 虫眼鏡マークの欄に「Other」と入力。(目標の設定値を探しやすくするため。)
  4. するとページの中段ぐらいに「Apple LLVM 6.1 – Custom Compiler Flags」という設定欄が見つかります。
  5. ここで「Other C Flags」という設定値の左側にある「▼」をクリック。
  6. 「Debug」と「Release」があるので、「Release」の欄にだけ「-DNS_BLOCK_ASSERTIONS=1」と設定する。(2文字目の「D」を忘れがちなので注意)
  7. すると、自動的に「Other C++ Flags」という欄にも値が入りますが、正しい動きなのでここでは気にしないでください。

できました?

この設定が一体何を意味してるのかというと、Xcodeに対して「ビルドする時、それがリリースビルドの時だけ、「NS_BLOCK_ASSERTIONS=1」というマクロを定義しなさい」と指示を出しているんですね。(実際には、コンパイル時にコンパイラにオプションが渡されてるだけですが)

勘のいい読者の方ならもうお気付きの通り、この「NS_BLOCK_ASSERTIONS」が定義されているかどうかで処理を分岐させることによって、サーバの参照先を自動的に切り替えることができるようになります。

3. 具体的には……

さて、ここで先ほどの恥ずかしいコードを、美しく(別に普通ですがw)書き直してみましょうね。

/* コメントアウト? なにそれ、おいしいの? */
#ifdef NS_BLOCK_ASSERTIONS
#define SERVER_URL @"http://hogehoge.release.server/" //製品版環境
#else
#define SERVER_URL @"http://fugafuga.develop.server/" //開発版環境
#endif

いかがでしょう?
こうするだけで、今後はただビルドすれば、リリースビルドなら製品版環境へ、それ以外なら開発版環境へと向くことになります。
(もちろん、応用次第ではサーバの参照先だけでなく、いろんな設定値を動的に切替えられますよ)

非常に簡単ですね。

多分、こんなに簡単なことをこれまで知らなかったのはわたしぐらいなもんだと思いますが。

まあ、備忘もかねて、ここで共有させていただきたいと思います。

4. ていうか「NS_BLOCK_ASSERTIONS」て何者?

ぶっちゃけますと、ここでXcodeに設定する値は、別に「NS_BLOCK_ASSERTIONS」じゃなくてもなんでも構いません。
ただ、なぜわたしが「NS_BLOCK_ASSERTIONS」にしたかというと、これにも理由がありまして……

なんとこの「NS_BLOCK_ASSERTIONS」というマクロ、リリースビルド時に定義するだけで、デバッグ時に使用していた「アサーション(NSAssert)」をすべて無効にしてくれるという優れものなんですね。

なので、こちらについては、わたし今回の対応をする前から、実はXcodeの設定に組み込んでいたのです。

……だというのに、それを環境切替に応用できると気付くまでに時間がかかってしまったのは、単にわたしの頭の回転の遅さゆえの話です。

あぁ。……どうして神様は、わたしにIQ180金田一脳を与えてくれなかったのでしょうか?

5. これにて一件落着。

てな感じで、Objective-Cにおいて、ビルド時に動的に参照するサーバの環境を切り替える仕組みの実装方法について、記事にしてみました。
あれほどわたしの悩みの種であった「手動での設定切替」作業から解放されたことで、今や毎日安眠快適、一日10時間の十分な睡眠時間を確保できるようになりました。

おかげで、体脂肪率も順調に右肩あがりで推移しております。(やばい)

というところで、長くなりましたが、また明日。

(このところ、開発関係の記事ばかりだったので、明日こそは何か読んでいて楽しくなるものを書きたい!)

と思っているけれどけっきょくそうはならないだろうという予感が今からふつふつとしている、Ryosukeでした! m(_ _)m

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

トラックバックURL: http://gunsturn.com/2015/05/12/objective-c_auto_switch_environment/trackback/