2016年9月20日火曜日

ローカライズをテストする

日本語のほか、世界各国の言語に対応できるわけだが、シミュレータ及び実機でテストする際、いちいちホームの設定画面から言語とリージョンを選んで切り替えてた。

でもそんなことしなくてもXcodeの設定で一時的に変更することができたのな。知らんかったわ。
メニューの Product / Scheme / Edi Scheme...(⌘+<)で開くウィンドウの、RunのOptionsの

  • Application Language
  • Application Region

を変更してからビルドしてやればいい。

2016年9月19日月曜日

変なメッセージ:Xcode8でまだ出るまだ出る…

余計なメッセージを出さないような設定にしても出ちゃうメッセージを載せてく。

Painter Z index: (でかい数値) is too large (max 255)

iOS10シミューレタ、iOS9シミュレータ、XcodeからビルドしたiPad実機で確認
Painter Z index: 4294967169 is too large (max 255)Painter Z index: 4294967199 is too large (max 255)Painter Z index: 4294967170 is too large (max 255)Painter Z index: 4294967170 is too large (max 255)Painter Z index: 4294967169 is too large (max 255)Painter Z index: 4294967169 is too large (max 255)Painter Z index: 4294967170 is too large (max 255)Painter Z index: 4294967199 is too large (max 255)Painter Z index: 4294967199 is too large (max 255)Painter Z index: 4294967170 is too large (max 255)
MKMapViewを表示してると出る。
特にPinを刺し、ある一定以上地図をズームしてる時に、以下のようにずらずらと出る。
Paintっていうからには画面描画の塗りのことかね?
んで、Z indexっていうんだから、X軸、Y軸じゃなくてZ軸の値で。
つまりは地図を表示する過程で妙な値をMKMapViewに渡してしまい、MKMapView側が「デカすぎんぞ!」って警告してるんだと思う。
つまりは俺は悪くない! 悪いのはきっとXcode!

きっとXcode8のバグの一種で、普段なら問題なく、表示されないような些細なメッセージが出ちゃってるんだろう。
追々出ないようになるんじゃないスか?

warning: section "__textcoal_nt" is deprecated

warning: section "__const_coal" is deprecated

それまで出なかったのに、審査に出そうと思ってアーカイブしたら出たWarning。
以下のようなメッセージがいっぱい出てる。
warning: section "__textcoal_nt" is deprecated
        .section __TEXT, __textcoal_nt, coalesced, pure_instructions
                 ^      ~~~~~~~~~~~~~~
note: change section name to "__text"
        .section __TEXT, __textcoal_nt, coalesced, pure_instructions
                 ^      ~~~~~~~~~~~~~~
warning: section "__const_coal" is deprecated
        .section __TEXT, __const_coal, coalesced
                 ^      ~~~~~~~~~~~~~
note: change section name to "__const"
        .section __TEXT, __const_coal, coalesced
                 ^      ~~~~~~~~~~~~~
deprecatedってことは、バージョンが上がって非推奨のやり方になったよってことだけど、どこの何が非推奨なのかてんでわかんないっス。
まあWarningだから無視しとく。(^◇^)ハハハハ。

プライバシー設定をplistにしとかないと落ちる

シミュレータで落ちる!

iOS10、Xcode8になってから、プライバシーに関する機能を使う際に、Info.plistにあらかじめ宣言(みたいなこと)しとかないと、シミュレータで落ちてしまうようになった。

たとえばフォトライブラリにアクセスするようなAPIを使ったら、こんなん出て落ちた。
[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
アプリがクラッシュしたのは、プライバシーに敏感なデータにアクセスしようとしたためです。アプリのInfo.plistは、ユーザーにアプリがどのようにこのデータを使うかについて説明している文字列値で、NSPhotoLibraryUsageDescriptionキーを含まなければなりません。
だそうです。

 落ちないようにしましょう

アプリ名-Info.plistにPrivacy - から始まる項目を追加する(探すとメニューで出てくる)。
そこに、フォトライブラリにアクセスする際に表示させるAlertのメッセージを書き込んでおしまい。

そうすると最初のアクセス時に以下のように出て、無事クラッシュせずにアクセスできるようになった。
かあんたん(≧∇≦)
でも、もともとフォトライブラリにアクセスするような場合って、iOS側が確認のアラートを表示してくれてたよね。
メッセージ部分を入力しなければ、デフォルトでいつものメッセージを表示してくれるんだけど、メッセージがないと審査の段階で自動的にアップロードしたビルドが拒否されちゃう
一応英語で書いたけど、他言語対応はどうやるのかね?
しかしめんどくさくなったねぇ。

Info.plistに設定が必要になったらしい機能の一覧はこちらのサイト

Info.plistの候補からまとめてみた(iOS10、Xcode8時点)
  • Privacy - Bluetooth Peripheral Usage Description
    • Bluetoothを使うとき
  • Privacy - Calendars Usage Description
    • カレンダーにアクセスするとき
  • Privacy - Camera Usage Description
    • カメラを使うとき
  • Privacy - Contacts Usage Description
    • 住所録を使うとき
  • Privacy - Health Share Usage Description
    • ヘルスの機能を使うとき
  • Privacy - Health Update Usage Description
    • ヘルスのアップデートを使うとき
  • Privacy - HomeKit Usage Description
    • ホームキットを使うとき
  • Privacy - Location Always Usage Description
    • 位置情報をアプリ裏でも常に使うとき
  • Privacy - Location Usage Description
    • 位置情報を使うとき
  • Privacy - Location When In Use Usage Description
    • 場所に着いた時点(?)の位置情報を使うとき
  • Privacy - Media Library Usage Description
    • メディアライブラリを使うとき
  • Privacy - Microphone Usage Description
    • マイクを使うとき
  • Privacy - Motion Usage Description
    • モーション機能を使うとき
  • Privacy - Music Usage Description
    • ミュージックにアクセスするとき
  • Privacy - Photo Library Usage Description
    • 画像ライブラリにアクセスするとき
  • Privacy - Reminders Usage Description
    • リマインダーにアクセスするとき
  • Privacy - Siri Usage Description
    • Siriを使うとき
  • Privacy - Speech Recognition Usage Description
    • 音声認識機能を使うとき
  • Privacy - TV Provider Usage Description
    • TVプロバイダ機能(そんなのあるの?)を使うとき
  • Privacy - Video Subscriber Account Usage Description
    • ビデオ購読機能を使うとき

2016年9月18日日曜日

変なメッセージ:Xcode8、iOS10でいっぱい出た

iOS10、Xcode8にしたところ、特にシミュレータを使った時に、これまで出なかったわけのわかんないメッセージが100行以上もずらずら出てしまった。

こんなのや⇩
2016-09-19 00:34:50.662934 SkyReporter[2273:1024925] [DYMTLInitPlatform] platform initialization successful2016-09-19 00:34:50.830564 SkyReporter[2273:1024768] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles2016-09-19 00:34:50.831165 SkyReporter[2273:1024768] [MC] Reading from public effective user settings.
2016-09-19 00:35:12.281089 SkyReporter[2273:1024768] Metal GPU Frame Capture Enabled2016-09-19 00:35:12.281607 SkyReporter[2273:1024768] Metal API Validation Enabled2016-09-19 00:35:12.355170 SkyReporter[2273:1024966] [LogMessageLogging] 6.1 <private> 

こんなの⇩
objc[1207]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices (0x120acb910) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices (0x1208f5210). One of the two will be used. Which one is undefined.2016-09-18 18:12:50.341636 SkyReporter[1207:83865] bundleid: com.galakuta09.SkyReporter, enable_level: 0, persist_level: 0, propagate_with_activity: 02016-09-18 18:12:50.372739 SkyReporter[1207:83865] subsystem: com.apple.siri, category: Intents, enable_level: 1, persist_level: 1, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
デバッグ用のNSLogとかが埋もれてしまって非常に困る。

メッセージが出る理由

どうやらXcode8の設定が変なために、普段は表示されない各種情報が表示されているようだ。
これを設定すればよし
XcodeのProduct / Scheme / Edit Scheme...メニュー(⌘+<)の、左側のカラムがRun、上の選択肢がArguments、で表示されるEnvironment Variablesに、
Nameを「OS_ACTIVITY_MODE」、Valueを「disable」に設定してやることでほとんど出なくなってくれる。ありがたい。

このありがたい情報はこちらのサイトから。ありがたやありがたや。

でも、今度は逆に実機確認時にNSLogとかの表示が全く出てくれなくなった。
⌘+<ですぐに表示できる設定だから、Xcode8が直ってくれるまでは切り替えて使うしかないか…。アップルのバカ!

シミュレータメニューが変になった

Xcode8にしたら、iOSシミュレータのメニューがおかしくなりましたよ。
なんじゃこりゃ!!

ライブラリのフォルダを消す

~/ライブラリ/Developer/CoreSimulatorフォルダを消して再起動したらいいと聞いたので、消してみた。
中がそのままProfiles/Runtimesになってて、その中がこれ。ここにある白いファイル、iOSシミュレータごとの各種ランタイムで、一個1GB以上ある。HDの整理にもちょうどいいですな。
消したはいいが、完全には戻らなかった。
完全には戻らない

Xcodeから重複シミュレータを消す

XcodeのWindow/Devicesメニューを表示し、重複しているシミュレータを消すのがいいそうです


重複しているのを1個ずつ消す

iOS8とiOS9のシミュレータが消えたようなので、Xcode/Preferences.../Componentsメニューから必要な過去のシミュレータを再ダウンロードして完了。
戻りました
めんどくさいね。

2016年9月15日木曜日

iPhoneとiPadでtableViewの高さを変える

iOS10で、AutoLayoutとSizeClassesで中のLabelとかの大きさはiPhoneとiPadで変えられるけど、tableViewCellの高さを個別に変える方法がわからなかった。

viewDidLoadあたりに以下のコードを書いときゃいい。
デバイスがiPadなら70に、iPhoneなら40にという単純なコード。
せっかくSizeClassesの機能があるんだから、Cellの高さに対しても機能させろよ! と思うのは俺だけじゃあるまい。

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    self.tableView.rowHeight = 70;
}
else {
    self.tableView.rowHeight = 40;
}


なお、以下のコードを使うとセルの内容に応じてセルごとに高さを変えてくれるようになったらしいけど、今回のケースではうまくいかなかった。
self.tableView.rowHeight = UITableViewAutomaticDimension;

変なメッセージでた:Assigning to 'AppDelegate *__strong' from incompatible type 'id _Nullable'

iOS10リリースに伴い、Xcode8にしたら、

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

って書いたところに以下のWarningが出たよ。

Assigning to 'AppDelegate *__strong' from incompatible type 'id<UIApplicationDelegate> _Nullable'

互換性のないタイプの'id<UIApplicationDelegate> _Nullable'から'AppDelegate *__strong'にアサイン(割り当て)しようとしている
ってことだな。

クラス間で使うグローバル変数みたいなものをAppDelegateクラスに作っといて、それにアクセスするためのおまじないで、iOS9までは問題なかったんだけど。

appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

どうやら型のチェックを厳密にするようになったためらしく、上記のようにキャストしてやったらWarning消えただよ。めでたしめでたし。