頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


アプリのiOS 7対応であれ?って思ったこと

リリース済みアプリのiOS 7対応で「あれ?」って思ったところをメモしておくよ。
ただし、beta版の段階で対応して実はiOS 7正式版では問題ないってのもあるかもしれないのでそこのとこはテキトウに解釈してね。

(1)UIAlertViewのサブクラスが使えない
記憶が確かならリファレンスには前々からUIAlertViewのサブクラスはあかんよって記述があったんだ。でもシミュレータでもデバイスでも動いてたんだよ。そのままリリースしてたんだけど、iOS 7だとホントに動かなくなったみたい。
結局UIAlertViewのサブクラスはあきらめてコードを書き換えて対応したよ。


(2)ステータスバーが消えない
「時計で遊ぼう」ってユニバーサルアプリがあるんだけど、iPhoneの方はステータスバーが常になし、iPadは常に表示という仕様なんだ。これはプロパティリスト内の Status bar is initially hidden を NOにしといて
起動時の application:didFinishLaunchingWithOptions: 内でiPhoneの場合のみ
[application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
という処理で消していたんだけど、iOS 7だと消えなくなったんだよ。
解決方法はプロパティリストに"UIViewControllerBasedStatusBarAppearance"を追加してNOを指定。
これで意図どおりに動いてくれたよ。


(3)タブバー/ナビゲーションバーのindexが強制的に変わってる?
「赤ちゃんの成長グラフ」アプリは画面上部にナビゲーションバー、下部にタブバーがあるんだけど、グラフ拡大などをするとタブバーを隠すようにビューが表示されるんだ。

この乗せる方のビューはビューコントローラー内から
self.navigationController.tabBarController.view
に addSubview: してるんだけど、これがiOS 7だと表示されるはずのビューがなぜか表示されくなったんだよ。

原因を調べていくと、どうもタブ自体のビューのindexが常に手前になるように書き換えられてるみたいなんだ。
NSArray *array = [[targetView superview] subviews];
↑調べたいビュー(targetView)を乗せてるビューのサブビューを全て得てどういう順番になってるかをチェックしてわかったんだよ。iOS 7未満だと変わらないのにさ。
結局常に表示したいビューは手前になるようにindexを変更する処理を追加して対応したよ。


(4)ナビゲーションバーがある場合のself.viewの起点
viewController内でself.viewに何かUIView系のオブジェクトを addSubview: するってよくあると思うんだけど、このself.viewがちょっと変わったんだ。
下のコードは単にUIImageViewオブジェクトをUIViewControllerのself.viewの座標 0,0 に addSubview: してるだけだよね。
{
    UIImage *image = [UIImage imageNamed:@"image.png"];
    UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
    imageView.frame = (CGRect){0,0,200,200};
    [self.view addSubview:imageView];
}
ところがiOS 6と7で下のように違うんだ。

iOS 6/7比較

iOS 7だと画像がナビゲーションバーの下に潜り込んでる、、、えっ?って感じだよね。
self.view.frameのプロパティをみるとiOS 7だとフルスクリーンのサイズを示している。
そんなわけで、ナビゲーションバーを使っててかつiOS 6と7をターゲットにするなら表示するビューの位置を補正しないといけないことになる。


(5)scrollViewが縦方向に動く?
scrollViewのframeのheightとcontentSizeのheightが同じだと上下には動かないはずだと思っているんだけど、、、iOS 7だとなぜかそういかないんだ。scrollViewでそうだからUITableViewオブジェクトでも同じようなことが起きるかも。

コードはこんな感じ。
{
    float rim = 10.f;
    UIScrollView *scrollView = [[[UIScrollView alloc] initWithFrame:(CGRect){rim,20+44+rim,320-rim*2,screenHeight-20-44-rim*2}] autorelease];
    scrollView.contentSize = (CGSize){400 , scrollView.height};
    scrollView.backgroundColor = [UIColor grayColor];
    scrollView.bounces = NO;
    [self.view addSubview:scrollView];
    
    UIImage *image = [UIImage imageNamed:@"image.png"];
    UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
    imageView.frame = (CGRect){0,0,320,320};
    [scrollView addSubview:imageView];
}
scrollViewのframeのheightとcontentSizeのheightは同じにしている。
これだとiOS 6では画像は左右にしか動かない。そういうものだと理解しているんだけど、これがiOS 7だと縦にも動くんだよ、、、


iOS 6だとアイコンに光沢がついてしまう

昨日(土曜日)のことなんだけど、その前日にiOS 7対応版を申請してた分が審査通過してたんだ。24時間かからなかったよ。すごいね。

ただ、こちらは Icon already includes gloss effectsをYESにしててもなぜかiOS 6でアイコンの光沢が消えなかったんだ。フォーラムによるとXcode 5の不具合っぽい。Images.xcassetsを使うと回避できるって情報を見て試したけどダメだったな。
結局、AppStoreでリリース後の修正版をダウンロードしたらアイコンに光沢がついちゃったよ。今までなかったのに。まあいいや、次のバージョンでは直るだろう。


スクショ/アートワークはiOS 7と6とで別にできるの?

頭と尻尾はくれてやる! iOS 7対応顛末
↑この続きと言えば続きになるかな。まあiOS 7でもアイコンや見た目の変化がないアプリには関係ない話だけどね。

Appleのイベントがこの前の水曜早朝だったでしょ。一昨日の木曜日にiOS 7対応版を申請した二つのアプリがさっき審査を無事通過したんだよ。二日もかかってないね、早いっ!

ただ上の記事内では書かなかったんだけど、申請方法間違えたかな?って思ったんだ(今でも正解だったかは不明)。
というのも俺はてっきり申請時にiTCでアップできるスクリーンショットとアートワーク(1024ピクセル四方のでかいアイコンね)もアイコンみたいにiOS 7以降とそれ以前とで別々にアップできると思っていたんだ。
だってそうでしょ?アイコンはiOS 7以降とそれ以前とでXcodeで別々に登録できたでしょ。iTCのスクショも3.5インチ用と4インチ用と両方アップロードできるよね。そういう感じにできるんだろうなと思い込んでいたんだよ。

ところが、申請時にiTCのどこをみてもiOS 7以降用スクショをアップするところが見つからなかったんだ。
仕方なくアートワークもスクリーンショットも従来のを消して新しいiOS 7用のをアップしたんだよ。

ちなみに俺アプリはiOSのUIKitのナビゲーションバーとかタブバーをそのまま使っているのでiOS 7とそれ以前で見た目がだいぶ異なるんだよね。

で、先ほど審査通過した結果、、、

AppStoreスクリーンショット

↑iOS 6デバイスでAppStoreへ行くと新しいアイコン、スクリーンショットが表示されてる。そりゃそうなるよね。
つまりiOS 6デバイスだとユーザーがダウンロードした後に見るモノは、AppStoreでみたアイコンやスクショとは異なるってことに。うーん、、、そういうものなのかあ。


iOS 7対応顛末

とりあえずメモしておこうっと。
9月11日(水)の早朝2時からアップルがイベントやってiPhone 5c/5sを発表したでしょ。
イベント終了後にiOS 7 GMが出たんだけど、OTAではGMへのアップデートはできなかったよ。β5→β6とかはOTAでいけたんだけどね。結局β6→GMはDev Cenでダウンロード、iTunesを使って実機にインストール。
ちなみにiTunesはベータ版じゃなくてもインストールはできたけど、iOS 7 GMを搭載した実機は認識できないので、iTunesでどうこうしたいのならベータ版をインストールする必要があるみたい。

iOS 7 GMと同時にXcode 5 GMも出たんだけど、これもDev Cenでダウンロード。
今まではXcode 4とXcode 5 DP 6とかが共存してたんだけど、Xcode 5 GMをインストールする時にDP 6は捨てて、Xcode 4の上に上書き。Macの容量もカツカツだしね。

なんとかリリース済みアプリ三つをiOS 7対応させて、先ほどまでになんとか三つとも申請完了。
ん?と思ったことを書ける範囲で書くと、、、

・distribution用の証明書が切れてたのがあったのでそこからやったんだ。証明書ってどうやるんだっけ?と思って検索。
Apple Developer:iPhoneアプリ開発での証明書関連の作業手順 | www.sirochro.com
↑この辺りを参考にしたよ。

・Google AdMob SDK(iOS用)の最新バージョンは6.5.1になってた。ついこの間iOS 7対応するぞーって取り組んだ時には6.5.0だったんだけどね。

・AdMobの実機テストだと問題ないのにArchiveするとエラーがでる。
Projects/Dossier/MultiDocument/Helpers/GAD/libGoogleAdMobAds.a(GADGestureCFiles.o)
duplicate symbol _tohex in:
↑こういうの。でよく見るとどうもAdMob周りみたいだな、ということがわかるので調べてたどり着いたのが
objective c - duplicate symbols in AdMob - Stack Overflow
↑こちら。このままなんだけどね。前にそういや変更してたんだわ、確か。

・Archive後にValidate → Submitするけど、どちらもサーバが混雑しているのかやたらと時間がかかり
An SSL error has occurred and a secure connection to the server cannot be made.
なんてエラーが出たり。結局数回繰り返したらいけたんだけどね。初めて見るエラーなので何事かと思ったよ。


きっとiOS 7対応版のアップデート申請が殺到してるだろうし、俺アプリも微妙なところがあったりするんだよね、、、審査はどうなることやら。







Google Driveのアップデート版がアルバムになる!

先日iOS版のGoogle Driveアプリのアップデートがあったんだよね。
アップデートの新機能に「ファイルや写真をサムネイルでプレビュー」ってのがあってさ。

俺、デジカメやiPhoneで撮影した画像はバックアップ用にGoogle Driveにお金払って保存してるんだけど、今までだとファイル名みたいなのしかなくてどんな写真かは選択してダウンロードしないとわからなかったんだ。表示されるまでに時間がかかるからとてもじゃないけど見てられないんだよね。
ところが、今回のアップデートでサムネイルが表示されるって言うから見てみると、、、

Google Driveのスクショ

↑iPadだとこんな感じで表示される。いいじゃない、いいじゃない!
UICollectionViewつかっているのかな。セル部分が画面内に位置すると読み込みにいってるようで若干の時間は必要だけど、以前に比べると写真を見るのが容易になったし、サイズも十分なのでまるでGoogle Driveがアルバムアプリになったようなもんだわ。




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.