2014年12月31日水曜日

AdMob対応とAppStoreへの提出

エスパー発見!(Look for espser!)をiPhone、AutoLayout、SizeClassesに対応させたついでに、iAdが表示されない時に表示するGoogleの広告AdMobにも対応させた。

Google AdSenseのアカウントをすでに持っていたので、登録とインストールは簡単だった。(Googleのサイトに載ってる手順通りにframeworkをプロジェクトに追加して、#importしてコードをちょちょいと追加するだけ)

iAdが表示できる時はiAd優先。表示できない時はAdMobを表示するという非常に簡単なコード。
AdMobは以前は広告サイズを指定してやる必要があったようだが、今は
adMobBanner = [[GADBannerView alloc]initWithAdSize:kGADAdSizeSmartBannerPortrait];
とスマートバナーを指定してやれば、画面の横幅に合わせて最大の広告を表示してくれるようになった。便利。
レイアウトの都合でもっと小さいバナーを表示したい場合とかは、今までのやり方で小さいバナーを選べばいいのだろう。

さて、iPhoneに対応したところ、Images.xcassetsにiPhone用アイコン以外にもCarPlay用120ptのアイコンを追加する枠が出てきた。
まじめに120ptのアイコンを作って追加したんだけど、いざアプリを審査に出すべくArchiveしてたら、
operation failed invalid image pathとエラーメッセージが出た。どうもそのアイコンへのpathがおかしいとか、ないとか、そんなメッセージ。
ネットで調べてもわかんなかったので、CarPlayなんて知らんわ! と思って、アイコン削除したらエラーも消えて、すんなり審査に出せてしまった(笑)
CarPlayって横画面だけだと思うし、エスパー発見!は縦画面だけなので、そもそも要らなかったのかな? よくわかんない。


審査に出す段階で、AdverTising Identifierの確認がある。ターゲティング広告についての確認だ。iAdの時は「いいえ」にしてたけど、AdMobを追加したのでどうなるかわからない。
ネットで調べたら、「はい」にしておいた方が良さそうだったので、そうした。
「下記目的でAdverTising Identifierを使用します」の選択もよくわかんないので、一番上の「App内で広告を出す」だけをチェック。
これでめでたくレビュー待ち状態になってくれたので、あとは2週間ばかりまた待ってみる。

Frameworkインポート時の注意

AdMobライブラリをインポートする際にコピーせずに参照をしていたのだが、その後参照元フォルダの位置を変えたところ、(当然だが)参照できないとエラーに。
あらためてコピーでインポートしたが、
ld: warning: directory not found for option '-L/〜〜〜'
などとWarningが出る始末。
調べたところ、Library Search Pathsという項目に古いパスが残ってしまっているためだった。これを消してやって再ビルドしたところWarningが消えてくれた。(念のためプロジェクトのクリーンも行ったが)
インポートし直したらパスも更新されればいいのに。(ーεー;)


2014年12月22日月曜日

Status barを消す方法

Xcode6、iOS8

XcodeのTARGET/Generalタブ/Deployment Info/Status Bar StyleにHide status barというチェックボックスがある。
これをまずチェックする。
これだけで消えてくれればいいが、消えてくれない。
次にInfoタブに移る。
(Custom iOS Target PropertiesのKeyに「Status bar is initially hidden」というのがあり、これはさきほどのチェックボックスと連動しているので、こちらをON/OFFしても構わない。)
どこのKeyでもいいので、「+」ボタンを押して新たなKey「View controller-based status bar appearance」を作る。それがNOになっていれば完了。

いちいち新しいKeyを設定しなきゃいけないなら、チェックボックスは何なのよ?('A`)マンドクセ

参考:コードを書かずに、iOS8でステータスバーを非表示にする方法。

2014年12月19日金曜日

AutoLayoutとSizeClasses

Xcode5からだっけ? AutoLayoutが導入され、Xcode6からはSizeClassesが導入された。
iPhone/iPadの何種類もの解像度(しかも縦横比が違ったり)に柔軟に対応するために作られた機能だ。
しかしAutoLayoutはConstraintsの設定がややこしいし、SizeClassesは出たばかりで使い方がよくわからない。
なんで縦長/横長のはずの画面をデザインするのに正方形のStoryboardに部品を置いていくのよ?

最初はiPhone/iPad、Portrait/Landscapeの全てに対応するw Any h Anyの設定で部品の配置とConstraintsをきちんと設定し、それだけではどうしようもない点のみw, hそれぞれをCompactおよびRegularに変えて必要なSizeClass(解像度)を選択し、それごとのレイアウトとConstraintsを設定してやればいいのだね。
Base valuesと書かれてるSizeClassで作り、最後はFinal valuesと書かれてるSizeClassで仕上げることになるようだ。
SizeClassごとのレイアウトと設定はきちんと覚えてくれるので、意図的に削除とかしない限りは元のSizeClassに戻れば残っている。

ただしどのConstraintsがどのSizeClassに設定されているのかがとってもわかりにくいので(一応わかる方法はあるものの)、修正する時は慎重にしないといけない。

PortraitとLandscape両方を一つのStoryboardで設定するためだろう、正方形のStoryboardに部品をレイアウトしなければならない都合上、Xcodeのプレビュー機能およびiOSシミュレーターを使わないと、ちゃんと縦長/横長の実際の画面でうまくレイアウトされているかわかんないのが難だね。

また、SizeClassごとの対応する画面サイズがFor all compact width layoutsとかFor all iPhones in portraitとか非常にざっくりしているので、例えばiPhone5sとiPhone6 Plusでレイアウトを変えたい場合に困る。
何かConstraintsの設定で吸収できるのかもしれないけど、根本的に大幅なレイアウト変更はできないんじゃないか?
解像度が大きく違うわけだから、部品の間隔を詰めたり広げたり、別な部品を追加したり…いろいろあると思うんだけど。
そもそも解像度をいろいろ増やしたiPhoneを出すこと自体、デベロッパーのことあんまり考えてないよね。そうでないとAndroidとの競争に勝てないのかもしれないけど。

画面上下に黒帯が出る場合の対処

Xcode6でiPhone、iPad両対応のアプリを作っているとき、iPhone4(320*640)以外の画面サイズが大きいiOSシミュレーターで、画面上下に黒い帯が出るようになってしまった。
AutoLayoutとSizeClassesを使ってきちんと異なる解像度に対応したはずなのにだ。
最初は問題なかったように思うし、どのタイミングでこうなったのかはわからない。

解決方法は、それぞれの画面サイズに対応するLaunchImageをImage.xcassetsに設定してやればいい。

逆に言えば、設定しない場合にはその画面サイズは320*640の画面を引き伸ばし、足りないところは黒帯で表示してくれるようになるということだ。
AutoLayoutとSizeClassesの設定が難しくて、どうしても対応しづらい場合の回避手段として使えるかもしれない。

参考サイト:【iOS6】iPhone5縦長対応化・非対応化する