Pages

2013年10月20日日曜日

iOSアプリにAdMobを表示する

数年ぶりにiPhoneアプリにAdMobを導入しようとしたらハマりました。

私がAdMobを導入するに当たってハマったポイントは3つなんですが、
私の開発環境が悪いのか、そのポイント全てを網羅したページがなかったのでここにまとめておきます。

ちなみに、AdMobの公式ドキュメントを見ながら組み込んでハマりました。

私の読解力が自分で見積もっているよりも低くくない限り、あのドキュメントだけで広告表示ができるとは思いません

というわけで、AdMobの導入方法(最も単純な方法で)。

まず、このページからAdMobのSDKをダウンロードします。
もちろんiPhoneアプリに導入するワケですから、iOS版を選んでください。

ダウンロードしたら、とりあえず公式の導入ページを見てみましょう。
このページの「SDKの導入」を進めて行っても広告の表示はできません。
というか、コンパイルすらできません

ってな訳で、「SDKの導入」を読み進めつつ、どの箇所を注意すべきかを書いていきます。

自分のプロジェクトにSDKを導入します。
先ほどダウンロードしたSDKを解凍すると色々入ってます。
この内、「Add-onsフォルダ」と「README.txt」を除く全てのファイルを自分のプロジェクトにインポートします。

ちなみに、公式の手順書には以下のように記述されています。

SDK を解凍すると、6 つの Objective-C ヘッダー、ランタイム ライブラリ、README が生成されます。

はい。神経質な人ならこの文言でもハマるかもしれません。
なんせ Objective-Cヘッダー は9個ありますからね
しかし、まだハマるような箇所ではありません。

次に進みましょう。

フレームワークの追加
ここ要注意です。
手順書では

・AudioToolbox
・MessageUI
・SystemConfiguration
・CoreGraphics

4つのフレームワークを追加すればOK 

って書いてますけど、ウソです。
少なくとも私の環境ではウソでした。
この4つだけだと、Mach-O Linker Error が出てBuild Failedになりました。

上記のフレームワーク以外にも次の2つのフレームワークの追加が必要です。
・AdSupport.framework
StoreKit.framework

手順書のフレームワーク追加の画像をよくみると、上の2つのフレームワークも追加されているという…


GADBannerViewの追加
ここは特にハマるような事ではないのですが、ややこしい箇所があるので書いておきます。

ソースコードの中に、自分の広告ユニットIDを指定する箇所があります。
// 広告の「ユニット ID」を指定する。これは AdMob パブリッシャー ID です。
  bannerView_.adUnitID = MY_BANNER_UNIT_ID;

AdMobの自分のページには「パブリッシャーID」と「広告ユニットID」が存在します。
パブリッシャーIDは「pub-01234567xxxxxx」のような感じで、
広告ユニットIDは「ca-app-pub-01234567xxxxxx/0123456789」という感じです。
(あくまで私の形式なので、もしかしたらもっと違う形式があるかもしれません。)

//広告の「ユニットID」を指定する。これはAdMobパブリッシャーIDです。

どっちやねん。
ここで指定するのは広告ユニットIDです。
パブリッシャーIDではエラーとなり、広告が表示されません。

後は、導入手順書通りにプログラムしていきます。
が、コンパイルしてアプリが起動して、広告が表示されるタイミングでSIGABRTでアプリが落ちます。
落ちなければそれでいいのですが、私の環境では落ちました。

ここで同じ現象になる場合は、アプリの「Build Settings」の「Other Linker Flags」に「-ObjC」を追加してください。

これでやっと広告が表示されるようになります。

いやー、めんどくさい。
お疲れさまでした。
頑張って広告収入で稼ぎましょう!!





2013年10月1日火曜日

cronとORA-01861

groovyを実行してDBからデータを引っ張ってくるというシェルスクリプトを書いたんですが、このスクリプトをcronで実行すると

ORA-01861: literal does not match format string

というエラーが発生。
もちろん、cronを通さず実行すると特に問題なく動作する。

実際にエラーが発生している箇所を見ると

SELECT xxxx (省略) WHERE ADMIT_DATE < TO_DATE('20131001', 'YYYYMMDD')

こんな感じのSQLを実行している箇所で、Oracleのエラーは

「文字列と日付を比較すんな」

って感じのエラー。
これが、何でcronからの実行時にだけ発生するのか原因が分からずハマリました。


で、まぁ原因なんですが文字コードなんですよね。

スクリプトで環境変数のLANGをログに出すようにして実行(cronを通さずに実行)すると、

LANG="ja_JP.UTF-8"

なんですよ。
で、cronでスクリプトを実行するとLANGには何も設定されてなかったんですね。

通常ユーザでは、
何も設定していない場合は
/etc/sysconfig/i18n
に設定されているOSの文字コードが引き継がれるらしいんですけど(.bashrcとかに書いてたらそっち見ますけど)、どうやらcronではユーザの環境変数を引き継がないみたい。

何か設定があるかもしれませんが。。。

なので、cronでも文字コードを同じようにするために以下の行をスクリプトに追加

export LANG=ja_JP.UTF-8

無事にcronから動きましたとさ。