Drowsy Dog's Diary

any note, any thought

2014年9月24日
by kazoo
0 comments

既存アプリの iOS8 / XCode6 対応でつまづいたところ色々

例によってドラスティックに変化する iOS 新バージョン。
8対応で引っ掛かったところと、その参考リンクのメモです。

精確さは保証しませんので、ツッコミいただけると有り難し。。

本家リファレンス

What’s New in iOS 8
https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

API 7.1 -> 8.0 Diffs
https://developer.apple.com/library/ios/releasenotes/General/iOS80APIDiffs/index.html#//apple_ref/doc/uid/TP40014455

Trait Collection

What’s New in iOS 8 # New Screen Size and Scales

[iOS 8] マルチデバイス対応の新機能「Trait Collection」| Developers.io

画面サイズについて、Size Class という考え方が加わり、

定義はこんな感じ:

UITraitCollection というクラスを用いてデバイス種別(iPhone/iPad)やタテヨコの Size Class (Compact / Regular)をそれぞれ取得するようになった。
従来の UIDevice クラスの UIUserIntefaceIdiomUIInterfaceOrientationを使わず(Deprecatedではないみたい)、デバイスや向きに関係無い「長いor短い」という定義が加わった感じだろうか(要するに iPhone6+ のためね)。

#これ、「Class」だけどオブジェクト指向的な意味じゃなくて Size Class という概念を導入する、ということなんですよね。ややこしい。 Group とか Category(これも ObjC 的にはだめか)とかって名前にすればよかったのに。

また、iOS8 において、UIView の width/height は、Portrait/Landscape それぞれの状態に応じたタテヨコのサイズを返すようになっている。

http://stackoverflow.com/questions/24150359/is-uiscreen-mainscreen-bounds-size-becoming-orientation-dependent-in-ios8

[[UIScreen mainScreen] bounds].size.width
[[UIScreen mainScreen] bounds].size.height

は、
iOS7 の 4 inch iPhone では方向によらず(320, 568)だが、
iOS8 では Portrait時 (320, 568)、Landscape時 (568, 320) となる。
Viewのフルスクリーン指定・判定など、方向に拠らないコードになっている場合は注意が必要。

ちなみに、iPhone 6 / 6+ の解像度の考え方については、以下のページがどちらもわかりやすい。
http://www.paintcodeapp.com/news/iphone-6-screens-demystified
http://www.dotproof.jp/2014/09/11/iphone-6-ppi/

Display Scale

さらに、iPhone6+ の UIScreen は、これまでの Retina ディスプレイが2倍だったのに対し、論理ピクセルから3倍のスケーリング(1242 x 2208) を行い、さらに15%のダウンスケーリングをして 1080 x 1920 ディスプレイに表示している。

OpenGL ES(または Metal)を使うアプリではこれらを気にせず、GLKView の contentScaleFactor プロパティを、UIScreen の nativeScale として取得できるものに設定してやれば良い。

…らしいが、今のところうまくいかない(2/3 で表示される)。何故だ。。

UIViewのアニメーション

http://stackoverflow.com/questions/24472663/ios-8-animation-bug

これはバグなのか仕様なのかよくわかってないのですが(上記StackOverflowではバグだろって言ってるけどたぶん違う)、たとえば UIView をフルスクリーン化するとき、

といった感じでアニメーションしてくれていたコードが動かなくなった。
frame の代わりに、

と、bounds と center を使うとうまくいった。

Launch Images の作成

http://qiita.com/uebo/items/854c284ed11aca741d93

iPhone6+ 用として、@3x の画像が必要になってきます。。とりあえず @2x があればそっちを使ってくれる。

Signing のエラー

http://qiita.com/eggmobile/items/fff1e80c51ae03f3f471

“Your account already has a valid iOS Distribution certificate”

というエラーの対処。
Xcode 6 への更新後に起こる模様。

Provisioning Profile をリネームして作り直せとのこと。Apple の iOS Dev Center に行って、当該のプロファイルを Edit し、名前だけちょっと変えて再度 Generate → DL すれば OK。

Submit / Validation のエラー

http://stackoverflow.com/questions/25806661/app-validation-on-xcode-6-gm-release
http://prod.lists.apple.com/archives/xcode-users/2014/Sep/msg00034.html

修正が終わって、いざ submit しようと思ったら、

ERROR ITMS-4088: “No software found with apple_id: xxxxxxxxx” at Software Assets

というエラー。xxxxxxxxx は、アプリの Apple ID で、もちろん iTunes 上に存在する。
そして Validation を行うと、

iTunes Store operation failed.
No eligible software found. Make sure this software is owned by your developer organization.

Apple 内でも調査中らしい。
とりあえず、Organizer でなく、現状 Application Loader を使えとのこと。
まずは .ipa ファイルを Export しておいてから、
XCode > Open Developer Tool > Application Loader
で、Distribution 用アカウントでログインしてアップロードしてやれば OK。