前書き
いずれは対応します!と伸ばし伸ばしにしていましたが、、、
急遽、上からの指示でiphone X
対応を迫られ、現状Xcode8.3.3だったのでどうしたものかと笑
ということで、やったりました。
移行
目的
今回は、一旦ビルドができ、アプリが起動するまでが目標です。(iphoneXで)
なので、黄色い警告がたくさん出ていようが、、、、関係ない!笑
現状
Xcode 8.3.3
Swift 3.0
導入に当たって
移行に当たって、まずXcodeを9に上げたからといって、Swift4にする必要はありません。
こちら(Xcode 9を使うときの注意点)から抜粋しますが、
Xcode9では新しいバージョンであるSwift 4と、Swift 3系と互換性のあるSwift 3.2の両方が使える
つまり、Xcode9でもSwift3.2ならおっけー(互換性ある)やないかーい!ということです。
(結局Swift4への対応を先延ばしにしているだけですが笑)
実作業
①Xcode9系のダウンロード
念のため移行失敗のために、古いXcodeを残しておきたい人は
こちら(複数バージョンのXcodeを共存させる)をご覧ください。
AppStore または Apple Developer からダウンロードしてインストール。
※ちなみに自分はXcode9.1
を入れました。
②Xcodeを起動
こちら(Swift 4 マイグレーション、またはXcode9対応 メモ)を参考にするとわかりやすいです。
起動して、左側をみると、、、バージョンアップして、何個か増えています。
その中の、前から存在する三角形の奴をクリック。
すると,Warningがいくつか出てるかと思いますが、トップの2つが
Swift Conversion
Convertion to Swift 4 is available
Validate Project Settings
Update to recommended settings
のはずです。上をクリックして実行してしまうと、Swift4対応なってしまうので絶対に実行しないでください。
(今回は最小限の移行に抑えるため)
とりあえず、下をクリックして、そのまま何回かポチポチすると実行されます。
(各種コンパイル時のwarningが出てきます)
③再ビルドと修正
再ビルドを行うと、ほぼほぼどこかで失敗するはずなので、それを潰していきます。
個人的に遭遇したものを列挙していきます。
1.ライブラリの非対応エラー
ライブラリエラーが出た場合は、まず入れ直すのが前提なのですが、
例えば、ObjectMapper
を例にとれば、carthage
で導入しており、移行前は
github "Hearst-DD/ObjectMapper" ~> 2.2
となっていました。しかし、carthage update
で見事に撃沈、、、
対応方法
ここで公式Githubのブランチを見てみると、、、対応ブランチがありました。
ということで
github "Hearst-DD/ObjectMapper" "swift-4"
無事、carthage が通りました。
上記のように、個々の導入しているライブラリに対応用のブランチがないか探して見てください。あれば、後ろにブランチ名を指定してあげれば解決です!
ない場合は、自分で直すかorライブラリ撤廃を検討してください、、、。
2.対応端末(アーキテクチャ)の不一致
まずをこちらを御一読いただけると、、、
デバイスのアーキテクチャについてのまとめ
簡単に言うと、端末によって対応しているアーキテクチャーなるものが存在しており、それが網羅されていないと起きるエラーです。
古いライブラリでは、古い端末(armv7、armv7sなど)に対応しているため、既存のアプリが最新のアーキテクチャーしかビルド範囲にない場合、新しくビルドしようとするとエラーが発生することがあります。
以下、BuildSetting > All
で確認出きます。
対応方法
自力で行う場合は、
1、ライブラリをフォークして自分のリポジトリにする。
2、フォークしたリポジトリのクローン。
3、修正ブランチを適当に切る。(切らなくてもいいですが)例としてfeature/support_for_xcode9
みたいな
4、ライブラリのプロジェクトを起動。
5、BuildSetting > All
の Valid Architectures
を自分のプロジェクトと同じにする
6、修正部分をプッシュ。
7、プッシュしたリポジトリを参照する。carthageの場合は
github "ライブラリ名" "feature/support_for_xcode9"
でcarthage update
で解決します。
3.予約語のバッティング
上記のリンクにもありましたが、導入しているライブラリと、新しく入ってきたクラス名がバッティングすることがあります。
例として
- Decodable
がその一つです。ライブラリで Himotoki
、Argo
を使用している場合はバッティングします。
対応方法
今まで使用していた
Decodable
を
Argo.Decodable
と、ライブラリ名の後、書くように対応してください。
後書き
Swift4にしないので、最小限の変更で、赤い警告さえなんとかなればいけるかと思います。
ビルドエラー時も、エラーログを読めば潰せないものはないはず!!
シュミレータにiphoneXも追加され、LaunchImageも新規作成すればiphoneX 用のものが追加できているはずです!
では、楽しいXcodeライフを!