Objective-C の新しい表記について

先日,github のライブラリを見ていて知らない表記があったので,メモ.

Objective-Cにおけるinstancetype型について

返却する型が決まっている場合,id などではなくinstancetype を使用した方がいい.
1
2
3
4
5
6
7
8
9
@interface Hoge
+ (id)hoge;
@end
 
    ↓
 
@interface Hoge
+ (instancetype)hoge;
@end

3項演算子の第2項は,省略できる.

NSString *valueString = value ? : @"";

value が値を保持している場合,そのままその値をセット.
nil の場合,@"" をセット.

iOS デバイス解像度について

iOS デバイス解像度について

– 前機種およびiPhone6/6 Plusで全画面表示に必要な解像度,比率は以下のとおり.

– スプラッシュ画像の対応は,iPhone4 以上でも 4種類が必要.

機種 必要 解像度 論理 解像度 ピクセル密度 比率
iPhone 3GS 320 × 480 320 × 480 162 ppi @1x
iPhone5/5S 640 × 1136 320 × 568 326 ppi @2x
iPhone6 750 × 1334 375 x 667 326 ppi @2x
iPhone6 Plus 1242 × 2208 414 x 736 401 ppi @3x

iPhone 6 plus 画像リソースの対応

– iPhone 6 Plus のカタログスペックは,画素数 1,080 × 1,920ピクセルの 401ppi.
– 内部的には、画素数 2,208 × 1,242 ピクセルあるものとして計算し,表示する際に縮小して表示している.
– PhotoShopなどでUIデザインする場合には,1,242 x 2,208ピクセルのサイズで作成するのがよい.

以下に各デバイスの Points, Rendered Pixels, Physical Pixels について分かりやすく,まとめられている.
The Ultimate Guide To iPhone Resolutions

スプラッシュスクリーンについて

– スプラッシュスクリーン ファイル名の数字は,論理解像度の高さ.

Default.png 320 × 480 iPhone
Default@2x.png 640 × 960 iPhoneRetina
Default-568h@2x.png 640 × 1136 iPhone5
Default-667h@2x.png 750 × 1334 iPhone6
Default-736h@3x.png 1242 × 2208 iPhone6 plus
Default-Portrait.png 768 × 1004 iPad縦
Default-Portrait@2x.png 1536 × 2008 iPadRetina縦
Default-Landscape.png 1024 × 748 iPad横
Default-Landscape@2x.png 2048 × 1496 iPadRetina横

iPhone6S Plusを購入しました.(^^)

ようやく世間でもiPhone6Sの話題が一段落したようなので,iPhone6S Plusを購入してきました.
今回は,初めての5.5インチ端末です.
過去のiPhone利用時においてはケースを付けない派だったのですが,iPhone6S Plusに関しては使用時のグリップを考慮してApple純正ケースも購入してみました.
事前にネットのレビューなどを見ていると,保護シートとケースが干渉する場合があるとのこと.
その点を考慮して比較的入手が容易な保護シートを選んでみましたが,そちらのレビューもメモしておきます.

購入したもの

今回購入したものはこんな感じです.
iPhone6sPlus,ケース,保護シート

iPhone6S Plusの容量は,128GBを選択しました.
128GBを選択すると価格は,約13万でした.結構な金額ですね.(>_<)

量販店の購入について

量販店で購入した場合,5%程度のポイントが得られること,また,キャリアのポイントもあるので,そちらも購入時に使用しました.
(以前,ヨドバシでの購入は,現金とカードで付与ポイントに違いがありましたが,カード購入でもアプリ使用を条件に,5%付与とのこと.)

私が購入したのは,ヨドバシ上野店です.12/19(土)午前中は待ち時間もなく,30分程度で購入手続きを行うことができました.
先週末にヨドバシ秋葉原店では,購入手続きは30分程度の待ちがあるようだったので,お急ぎの場合は,上野店の方が良いかもしれません.

ケースについて

ケースは,iPhone 6s Plusレザーケース – ミッドナイトブルーです.
純正品だけあり,フィット感は問題ありません.
ケース内側は,マイクロファイバーの裏地が使用されており,ケース裏の角部分の処理も綺麗にされています.
ネットのレビューでは,電源ボタンがケース着用時に押しづらいとの声もありましたが,まぁ使用には問題ないと私は判断しました.

ケース内側

保護シートについて

保護シートは,MS Products iPhone 6sPlus用 GLASS PREMIUM FILM 0.33mm 極薄 表面硬度 9H (取り付けキット付き)というものを選択しました.

amazon でも同じメーカのものがいっぱいあるようです.

量販店で取り扱っているので,入手が容易な製品だと思います.
ガラスの保護シートの場合,シートのエッジ(四隅)が浮く製品があるようですが,この製品は特に問題がありませんでした.
貼り付け直後は,若干気泡らしきものがあるようですが,指で押せば,完全に製品を隙間なく吸着できました.

高品質なガラス素材の保護シートの場合,
・価格は,3000〜4000円
・ガラスにタッチの滑りやすさ,ブルーライト対策,のぞき見防止などの特徴
・ガラスの厚み
・サイズは,全画面保護,若干小さめ(ケースとの干渉を考慮)
などの製品ごとの違いがあるようです.

ガラス素材の使用は今回が初めてでしたが,指触りはとてもよく,操作しやすいです.
ケースとシートの隙間はこんな感じです.
全画面保護にこだわる人には気になるかもしれません.

ケースとの隙間1

ケースとの隙間2

取り付けキット

画面への貼り付け作業ですが,取り付けキットを使用してとても簡単に行うことができました.
シート貼り付けに自信がない人は,取り付けキットが大変便利だと思います.

iOS9 の新機能について

iOS9 には新機能が追加されていますが,アプリの対応調査をしていて気づいた点をメモしておきます.

Bitcode エラー対応方法は?

iOS の場合,”Enable bitcode”をオフにすることでエラーは回避できる.
OFF にした場合,アプリが App Thinning 対応にならない.

Bitcode とは?

Xcode7 の新機能「App Thinning」に対応するための設定項目.
設定項目は,プロジェクトファイル – TARGETS – Build Settings – Build Options – Enable Bitcode に項目がある.

watchOS Developer Library – プレリリース より
App Thinning (iOS, watchOS)
デバイスに最適化されたサイズのアプリをダウンロード可能とするための技術.
以下の3つの要素で構成される.

  • Slicing (iOS) デバイスに適したアプリバンドルとする.
  • Bitcode (iOS, watchOS) コンパイルされたプログラムの中間表現.
  • On-Demand Resources (iOS) 必要になったタイミングで,リソースを追加ダウンロードする.

参考: https://developer.apple.com/library/prerelease/watchos/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html

Note: For iOS apps, bitcode is the default, but optional. If you provide bitcode, all apps and frameworks in the app bundle need to include bitcode. 
For watchOS apps, bitcode is required.

ちなみに,iOS はオプション、 watchOS は必須とのこと.

以下にていねいな説明がありました.
参考: App Thinning メモ

Bitcode を生成するには?

AppStore への提出時に,ビルド済みのバイナリではなく,中間形式でアップロードする.

検索API とは?

iOS9 の Spotlight や Safari の検索機能で,アプリや Web コンテンツから情報が見つけられるようになる.
“Universal Links”という仕組みでアプリ,Web へユーザを誘導することができる.

iOS9 では,以下の3つの検索用APIが提供されている.

  • NSUserActivity アプリに関連したユーザのアクティビティを記録して,検索対象とする.
  • Core Spotlight アプリのコンテンツへのリンクを可能とする.
  • Web Markup Webサイトを適切にマークアップすれば,コンテンツが検索可能となる.Smart App Banner を追加すれば,Webサイトからアプリへ誘導することが可能となる.

いろいろ紹介されているみたいです.
参考: iOS 9はディープリンク機能のある検索APIを提供…ほかのアプリのコンテンツも検索

GenerateDSYMFile の警告について

最近,アプリの iOS9 上での動作検証のために,Xcode7 beta5 を使用している.
そこで,出力された以下の警告について少し調べてみました.

warning: Could not resolve external type ………

上記の警告を回避するには,以下の設定で開発時にはとりあえず,抑止することができるようです.

Xcodeの "Build Settings"→"Build Options"→"Debug Information Format" の項目を
"DWARF with dSYM file" から "DWARF" に設定する.

dSYM を作成しないのだから,出力はされないのでしょう.

ですが,dSYM bundle は本番リリース後のクラッシュ解析には必要です.
開発時には利用することがないので,ビルドの “Debug Information Format” を “DWARF with dSYM File” から “DWARF” に変更すると,ビルド時間が短縮できる.といった紹介がネット上では良くされているようです.

ちなみに DWARF とは、広く使われているデバッグ用データフォーマットの規格です.
参考: DWARF

.dSYMファイルとは?

.dSYMファイルは,デバックシンボル群を保存するファイルで,このファイルがあればアドレスしか書かれていない.crash ファイルからシンボルを確認することができます.

ビルド時に生成されるものなので,.crashのログが出力されたバイナリと同じビルドで生成された.dSYMファイルでなければ解析できないため,注意が必要.
以下のリンクには丁寧な説明があります.

参考: [iOS] アプリのクラッシュログを解析する方法

iOS9 で通信プロトコルを https → http とする方法

開発している iOS アプリの iOS9 対応を行っていて、気づいた点をメモ。

既存のアプリが iOS9 環境で通信できない場合,通信プロトコルが http → https とされるていないか?確認する.
通信が https に強制されることが原因で通信できていない場合は,info.plist に以下の設定を追記することで回避することができる.

1
2
3
4
5
<key>NSAppTransportSecurity</key>
	<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
</dict>

【参考】
App Transport Security

iOS9でHTTP通信がSSL通信になるのを防ぐ方法

GDC の dispatch_release() を ARC 対応する方法

久々に ARC を適用していない iOS アプリ開発に携わっていたのだが,ようやくそのアプリも ARC 対応することになり,[… release]; とか [… retain]; とか [super dealloc]; とか消したりして対応していたのだが,どうしても警告がとれない箇所があったので,解決方法をメモ.

1
2
3
4
5
6
- (void)dealloc
{
#if !OS_OBJECT_USE_OBJC
    dispatch_release(self.semaphore);
#endif
}

参照:iOS6(ARC)でのGCDのメモリ管理

iPad アプリのリアルタイム計測ができない場合に確認する項目

iPad アプリで Google Analytics ライブラリを更新し、リアルタイム計測のテスト時につまずいたのでメモ。
新規に Google Analytics を設定する際には問題になることは少ないかと思うが、既存アプリで新しい担当者がライブラリ バージョンアップを担当した場合などは注意する必要があるかも知れない…私はそれで問題に気づくのに時間がかかりました。。。(>_<) 【iPad アプリのリアルタイム計測ができない場合に確認する項目】
・(当然ですが…)アプリの実装が適切に行われているか?
・不要なフィルタリングが設定されていないか?
・[アナリティクス設定] の”ビュー”は、”モバイル アプリ”とされているか?

【リアルタイム計測ができなかった原因】
・Google Analytics の設定のため、リアルタイム計測が確認できなかった。
Google Analytics は トラッキングID ごとに、”プロパティー”、”ビュー”という概念があり、
ビューが ”モバイル アプリ”でないと、iPad アプリからの送信データをリアルタイムに集計ができない模様。

・新規にビューを”モバイル アプリ”で作成し、検証したところ、iPad アプリからのデータをリアルタイムに集計ができた。

【モバイル アプリのビューを作成する方法】
[アナリティクス設定] 画面には、”アカウント”、”プロパティ”、”ビュー”の設定項目がある。

モバイルアプリをリアルタイム集計するには、”ビュー”に新たに”モバイルアプリ”用のビューを作成する必要がある。
[すべてのウェブサイトのデータ]を選択し、[新しいビューを作成]を選択する。
[このビューでトラッキングするデータ]にて[モバイル アプリ]を選択する。

UILabel 省略文字(三点リーダ)のテキストカラーが変更されないことがある

“Deployment Target” が iOS 6.x のアプリを、iOS 7.x で動作させた場合に、掲題の問題が発生した。

iOS 6.x は問題がなく、iOS 7.x で問題が発生する。

三点リーダのテキストカラーが変更されない

三点リーダのテキストカラーが変更されない

問題が発生したコードは、textColor プロパティーで文字色を変更していた。

1
_label1.textColor = color;

対処方法

attributedText プロパティーを使用することで問題が解消された。

1
2
3
4
NSAttributedString *attributedString;
attributedString = [[NSAttributedString alloc] initWithString:@"UILabel テキストの三点リーダの色がおかしくなる"
                                                 attributes:@{ NSForegroundColorAttributeName : color }];
_label1.attributedText = attributedString;

参考: UILabel dotted line color bug in iOS 7.1

実機での自動実行を行う xcodebuildコマンドのパラメータ設定

iOS 開発でもテスト自動化が流行っているようですね。
というわけで、テストコードを実機で動かすためのコマンドを調べました。
シミュレータ上で自動実行するパラメータ設定はいろいろ紹介されているようですが、
実機での自動実行を行うパラメータ設定を見つけることが出来ず、少し苦労したのでメモ。

最初からxcodebuild(1) Mac OS X Developer Tools Manual Pageを参照しろとの話もありますが…

以下のシェルスクリプトで実機でのテストコード自動実行ができます。

1
2
3
4
5
6
7
8
9
10
11
#! /bin/sh
 
# iPhone (iOS 実機)
PROJECT="(プロジェクト名).xcodeproj"
SCHEME="(スキーマ名)"
DESTINATION="platform=iOS,name=(実機の名前。省略可。),id=(識別子 UDID)"
 
xcodebuild -project ${PROJECT} \
     -scheme ${SCHEME} \
     -destination "${DESTINATION}" \
     test

また、パラメータで指定されている”スキーマ名”、”Destination”は以下の画面で確認できる。

xcodeでのスキーマ名、Destination の確認方法

xcodeでのスキーマ名、Destination の確認方法