LoginSignup
66
62

More than 5 years have passed since last update.

既存プロジェクトを swift2.0,Xcode7 へ移行した時のTips

Last updated at Posted at 2015-09-24

移行した時のメモを残していきます。細かい構文などについては触れません。
swift1.2 > 2.0
Xcode6.4 > 7.0 7.1

iPhone6: iOS 9.0.1 9.1
下記で書いている実行時のことは、実機で確認したものになります。

※ 当記事のミスや追記した方が良いことがあれば、コメントを頂けると嬉しいです。

Xcodeの複数バージョンを共存させる

前提として、すでにXcodeをインストールしているとします。

Apple公式ダウンロードページ - Downloads for Apple Developers から
Xcode7.0などインストールしたいバージョンのdmgファイルをダウンロードする。

ある程度時間がかかるので、その間にすでにインストールされているXcodeと共存させるために
すでにインストールされている Xcode.app を Xcode6.4.app などバージョンが分かる名前に変更する。

後はダウンロード完了を待って、dmgを開き中に入っているXcode.appをいつも通りドラッグアンドドロップするだけです。
こちらのXcode.appも名前を変更してバージョンを明記しておくといいと思います。

※ 追記

Carthageを利用している場合、このままではcarthage updateで以下の様なエラーが発生する可能性があります。

A shell task failed with exit code 72:
xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH

この場合は以下のように、Xcodeのパスを変更してあげれば治ります。

sudo xcode-select -switch /Applications/Xcode7.0.app/Contents/Developer

既存プロジェクトを swift2.0,Xcode7.x に対応させる

既存プロジェクトを初めて開いた時

swidt2.0に対応させるようにコードを変更するか問われるダイアログが表示されます。
これによって、ある程度は自動でコードを変更してくれます。
Before・Afterのプレビューが表示されるので、この時にどんな風にコードが変わるのか見ておくと良いでしょう。

スクリーンショット 2015-09-24 7.58.17.png

You must rebuild it with bitcode enabled

GoogleAnalyticsを利用していて発生しました。

ld: '/hoge-project/Pods/GoogleAnalytics/Libraries/libGoogleAnalytics.a(GAITrackerImpl.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7

利用しているライブラリやフレームワークがbitcodeに対応していない場合に発生します。
Xcode7.0のデフォルトでbitcodが有効になっているので

Build Setting > Build Options > Enable Bitcode で YES になっているものを NO へ変更することで無効にできます。

※ 追記

bitcodeをNOにしてストアへ出す際、Archive > Validate で include bitcode. のチェックを外す必要があります。

しない場合、このようなエラーが発生しvalidateが完了しません。

The archive did not contain <DVTFilePath:~~~

bitcodeについては、すでにQiitaに書いてくださっている人がいるので参考ページを載せておきます。

参考ページ

LLVM bitcode基礎知識
Error during submission

URLScheme が開けない

Instagramへ遷移しようと canOpenURL を実行して発生しました。

-canOpenURL: failed for URL: "instagram://app" - error: "This app is not allowed to query for scheme instagram"

外部アプリを開く際には、使用する URLScheme を列挙する必要があります。

Info.plist に LSApplicationQueriesSchemes: Array を追加し、その中に String で利用したいSchemeを書くことで開けるようになります。

スクリーンショット 2015-09-24 9.02.40.png

参考ページ

iOS 9 not opening Instagram app with URL SCHEME
【追記】iOS9でcanOpenURLを有効にする方法
iOS9でのcanOpenURL

WebView でページが開けない

WebView で広告を表示しようとして発生しました。

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

デフォルトではhttpでの接続ができなくなっています。(App Transport Security)
http接続をしたい場合、AppTransportSecurity を全部or一部(ドメイン)無効にします。

Info.plist に App Transport Security Settings: Dictionary で追加し、その中に

  • 全部無効にする場合: Allow Arbitrary Loads: Boolean YES として追加する。

スクリーンショット 2015-11-04 10.01.45.png

  • 一部無効にする場合 (推奨) : Exception Domains: Dictionary で 追加し、その中に ドメイン > NSTemporaryExceptionAllowsInsecureHTTPLoads: Boolean YES, NSTemporaryExceptionRequiresForwardSecrecy: Boolean NO として追加する。

サブドメインも許可する場合 NSIncludesSubdomains: Boolean YES として追加する。

スクリーンショット 2015-11-04 10.00.00.png

※ 追記

URLに接続できなかった場合、以下のようなログが流れます。

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

このままでは実際にどのようなURLが引っかかったか分からないので、ログを見る必要があります。
通信にCFNetworkというフレームワークが利用されているので、そのログを出力するために下記のコードをAppDelegate.swiftに記述します。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        setenv("CFNETWORK_DIAGNOSTICS","3",1)

        return true
]

実装後に実行して、実際に通信でNSURLSession/NSURLConnection HTTP load failedを発生させます。
Window > Devices を開き、実行した時のデバイスでアプリを選択して歯車マークを押し、Download Container を選択しログを任意の場所に保存します。

保存したログ com.example.app 2015-10-11 01:28.36.311.xcappdata はディレクトリになっています。
com.example.app 2015-10-11 01:28.36.311.xcappdata/AppData/Library/Logs/CrashReporter/CFNetwork_com.example.app_0000.nwlrb.log のようなファイルにログが出力されているので、適当なもので開きます。

NSURLSession/NSURLConnection HTTP load failedエラーの末尾にある -9802 などの数字を検索して、どのようなURLが引っかかっているのかを確認することができます。

参考ページ

iOS9 ATS問題
[iOS 9] iOS 9 で追加された App Transport Security の概要
【iOS9】HTTP→HTTPSだと!App Transport Security(ATS)について
iOS9 : App Transport Securityの確認方法

CGContextSaveGState, CGContextTranslateCTM, CGContextRestoreGState invalid context 0x0

※この問題はXcode7.1で修正され、発生しなくなりました

ステータスバーを隠そうとして発生しました。

CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

Info.plist > View controller-based status bar appearance を NO にすると発生するようです。
Xcode7.0 になってから発生する不具合のようで Xcode7.1 beta2 でも実行してみたが変わりませんでした。
現在これの対処はできないようです。

参考ページ

'invalid context 0x0' after Migration to iOS 9

※ 追記

確定の情報ではなく可能性として考えられることですが
iOS9から、UIAplicationクラスのステータスバーに関するメソッドが一部、Deprecatedになっています。
これが原因かもしれません。しかし、他に代わりになるメソッドは見当たりません。
試しに実機iOS8で実行してみたところ、このエラーは発生しませんでした。

現状の対応としてはViewController側で動的に隠すことぐらいでしょうか。

override func prefersStatusBarHidden() -> Bool {
    return true
}

ただ、UIImagePickerControllerなどを表示する際はステータスバーが表示されてしまいます。
その後に最後、ステータスバーも隠すことが可能です。
しかし、これも戻った時一瞬ステータスバーが見えてしまうので良くない動作です。
なので完全な動作を求める場合、やはり公式の対応待ちという状態だと思います。

参考ページ

Error Message in Debug Area

66
62
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
62