20191012のiOSに関する記事は6件です。

【Swift】 WKWebViewで表示したtitleを対応するタブボタンに表示させる。

こちらの記事で書いている、オリジナルタブブラウザアプリの、追加機能です。
タブブラウザでは、タブボタンにそのタブで開いているWebページのtitleが表示されるのが一般的だと思いますが、自作アプリでそれを実現する方法を確認しました。

開発環境

端末:MacBook Pro/MacOS 10.14.5(Mojave)
Xcode:10.2.1
Swift:5

やったこと(ポイント)

①WKWebViewで開いたWebページのtitle(titleタグの情報)を、タブボタンに表示する。

実装

画面イメージ

開いているWebページに対応するtitleがタブボタンに表示されています。
アプリ自体のUIデザインがどうかしちゃってるのは見逃して下さい。。

google
Simulator Screen Shot - iPad Air 2 - 2019-10-12 at 16.24.50.png
yahoo!japan
Simulator Screen Shot - iPad Air 2 - 2019-10-12 at 16.24.53.png
bing
Simulator Screen Shot - iPad Air 2 - 2019-10-12 at 16.24.58.png
ソースコード

要点だけ。

webView(_:didFinish:)を追加し、ページ読み込み完了時の処理を記述します。

ViewController.swift
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        let targetTag = webView.tag - 10000
        let targetBtn = view.viewWithTag(targetTag) as! UIButton
        let title = webView.title
        targetBtn.setTitle(title, for: .normal)
    }

自分がどれくらい独特な書き方しちゃってるか自覚がないですが、Webページ(WKWebView)とタブボタン(UIButton)の紐付けを、tagの値を使って制御しているので上記コードのような書き方になっています。

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】Swiftのメモリ管理を内部の仕組みから学ぶ

普段コードを書いている時に
Swiftが内部で
どのようにオブジェクトを管理しているのかについて
考えることはあまり多くないかもしれません。

しかし
非同期処理を扱う場合など

DispatchQueue.main.async { [weak self] in
    ...
}

などのように
weakといった
キーワードを使用することは多くあると思います。

これは「弱参照」と呼ばれ
直接の参照(強参照)を持たないように
Swiftに内部に指示をして
循環参照を起こさないための仕組みです。

こういった適切なメモリ管理を行わないと
メモリが解放されないことでランダムにクラッシュが起こるなど
原因がわかりづらい不具合を発生させる可能性があります。

そこで今回は
weakなどを使用することで
Swiftが何をしているのかを
内部の仕組みから見ていくことで

weakunownedの使い方や
オブジェクトのライフサイクルについて
学んでみたいと思います。

メモリの3つ仮想的な領域

メモリ自体はただのバイトの配列ですが
プログラミングという観点ですと
3つの領域に分けることがよくあります。

  • スタック領域 全てのローカル変数を保管している場所です。
  • グローバルデータ 静的な変数や定数や型のメタ情報を保管している場所です。
  • ヒープ領域 オブジェクト※を保管している場所です。         ※ 実行時にメモリを割り当てられ ある時点で解放される「寿命」を持つものを指します。 Swiftでは主に参照型(reference type)を指します。

ARC(Automatic Reference Counting)

メモリ管理には「オーナーシップ(所有権の帰属)」という概念が大切になります。
これはあるオブジェクトを誰が解放する責務を持っているかということを意味します。

詳細に関しては下記のOwnershipManifestに記載されています。
https://github.com/apple/swift/blob/master/docs/OwnershipManifesto.md

このオーナーシップを管理する仕組みとして
SwiftはARCを使用しています。

ARCはオブジェクトの参照されている数を保持しておき
カウントがゼロになるとメモリから自動で解放される仕組みです。

2つのレベルの参照(強参照と弱参照)

Swiftでは参照に2つのレベルがあります。
それが冒頭でも登場した
強参照(strong reference)

弱参照(weak reference)
です。

さらに
弱参照の派生として非参照(unowned reference)があります。

強参照(strong reference)

Swiftでは
強参照がある限り
オブジェクトは生存し続けることができ
逆になくなるとメモリから解放されます。

SwiftではJavaのガベージコレクションのように
自動でメモリを解放する仕組みは持っていないため
循環参照を引き起こす可能性があります。

これは例えば
オブジェクトAとオブジェクトBが
お互いにお互いのオブジェクトへの参照を持っている状態です。

これを防ぐためにもweakなどの記述が必要になってきます。

弱参照(weak reference)

弱参照を使用することで
循環参照を断ち切ることができますが
弱参照を持っていたとしても
強参照がなくなればオブジェクトはメモリから解放されてしまいます。

その場合
参照しているオブジェクトを使おうとしてもnilになっています。

そのためweakを使用する時はOptionalで扱われます。

非参照(unowned reference)

弱参照とほぼ同じですが
参照しているオブジェクトを使おうとすると
assertionエラーとなってプログラムはクラッシュします。

unownedは参照がなくならないと想定しているのに
予期せず参照が解放されてしまっている不具合を発見するのに役立ちます。

unownedを使用する基準としては
参照するオブジェクトと参照されるオブジェクトの寿命が同じような時です。

例えばクラスの中でlazyをつけた変数を定義する場合に

class ViewController: UIViewController {
   lazy var label: UILabel = { [unowned self] in
      self.someSetup()
      ...
   }() 
}

これはViewControllerクラスの変数labelが
self(ここではViewController)を参照しています。

これはクラスオブジェクトが解放されるタイミングで
label変数も解放されるので
selfの参照がなくなることはありません。

参照については下記のドキュメントに詳細が記載されています。
https://github.com/apple/swift/blob/master/docs/weak.rst

Swift Runtime

ARCはSwift Runtimeというライブラリで実装されています。

他にもSwift Runtimeでは
実行時にジェネリクスやプロトコルを具体的な型に解決する
などの重要な機能を有しています。

https://github.com/apple/swift/blob/master/docs/Runtime.md

全てのオブジェクトは
HeapObjectというstruct
で表現されます。

https://github.com/apple/swift/blob/4fd0671e542299d7805e41cf9426640ab3b399af/stdlib/public/SwiftShims/HeapObject.h

HeapObjectはオブジェクトの型のメタ情報と参照カウント(RefCount)を持っています。
RefCountにはstrongweakunowned用の3種類があります。
https://github.com/apple/swift/blob/master/stdlib/public/SwiftShims/RefCount.h

SwiftのコンパイラはSIL生成段階(SIL Generation)※で
swift_retain()
swift_release()
というメソッドを適切な場所に差込みます。

これによってHeapObjectの作成や解放がされます。


SIL生成段階(SIL Generation)はSwiftのコンパイル時の一つのフェーズです。
下記のドキュメントに詳細が記載されています。
https://swift.org/compiler-stdlib/#compiler-architecture

Side Table

全てのオブジェクトは
弱参照(weak reference)用のRefCountを持っているものの
多くのオブジェクトで弱参照を持っていません。
そこで弱参照用のRefCountにメモリを割り当てても無駄になることが多いため
弱参照の情報はSide Table※という別の場所に保管され
本当に必要になった時にメモリが割り当てられるようになっています。


正式にはHeapObjectSideTableEntryです。
内部ではオブジェクトのポインタとRefCountを持っています。
https://github.com/apple/swift/blob/master/stdlib/public/SwiftShims/RefCount.h#L1199

弱参照が示すメモリアドレスは参照したいオブジェクトではなく
このSide Tableを示しています。

これによって
無駄なメモリが必要なくなることに加え
直接オブジェクトを参照していないため
オブジェクトの解放と弱参照が参照するタイミングが競合することなく
弱参照を取り除くことができます。

オブジェクトのライフサイクル

下記のコメントを参考にすると
https://github.com/apple/swift/blob/master/stdlib/public/SwiftShims/RefCount.h#L112

Swiftのオブジェクトは3つの参照の保持の仕方によって
状態を5つに分けることができます。

  • LIVE
  • DEINITING
  • DEINITED
  • FREED
  • DEAD

簡単に図にすると下記のように状態が変化していきます。

名称未設定ファイル (2).png

次にそれぞれの状態について
見ていきます。

各状態で弱参照(Side Table)があるかないかで
挙動や次に遷移する状態が変化していきます。

LIVE without side table

オブジェクト

生存している。

参照カウント

強参照1 非参照1 弱参照1で初期化される。

Side Tableと弱参照カウントのメモリ割り当て

なし 。

強参照変数の操作

正常に機能する

非参照変数の操作

正常に機能する。

弱参照変数を使用した時の挙動

起こり得ない。

弱参照変数へのオブジェクトの代入

Side Tableを追加する。
LIVE with Side Table状態になる。

次の状態への遷移

参照がゼロになった時に
deinitが呼ばれDEINITINGの状態になる。

LIVE with side table

弱参照変数の操作

正常に機能する。

それ以外は
LIVE without side tableと同じ。

DEINITING without side table

オブジェクト

deinit()を実行中。

強参照変数の操作

何も起こらない。

非参照変数を使用した時の挙動

swift_abortRetainUnowned()で処理が中断されます。
https://github.com/apple/swift/blob/ebcbaca9681816b9ebaa7ba31ef97729e707db93/include/swift/Runtime/Debug.h#L122

https://github.com/apple/swift/blob/master/stdlib/public/runtime/Errors.cpp#L451

非参照変数へオブジェクトを代入した時の挙動

正常に機能する。

弱参照変数を使用した時の挙動

起こり得ない。

弱参照変数へオブジェクトを代入した時の挙動

nilが代入される

次の状態への遷移

参照がゼロになった時の挙動
deinit()が完了し
swift_deallocObject()というメソッドが呼ばれる。

canBeFreedNow()で弱参照または非参照があるかどうかをチェックする。
canBeFreedNowがtrueの場合
オブジェクトは解放されてDEINITEDの状態になる。

DEINITING with side table

弱参照変数を使用した時の挙動

nilを返却する。

弱参照変数へオブジェクトを代入した時の挙動

nilが代入される。

canBeFreedNow()は常にfalseになり
そのままDEAD状態にはならない。

その他はDEINITING without side tableと同じ。

DEINITED without side table

オブジェクト

deinit()は完了しているが
非参照は存在している。

強参照変数の操作

起こり得ない。

非参照変数を使用した時の挙動

swift_abortRetainUnowned()の中でロードを停止している。

非参照変数へオブジェクトを代入した時の挙動

起こり得ない。

弱参照変数の操作

起こり得ない。

次の状態への遷移

非参照カウントがゼロになった時
オブジェクトは解放されてDEAD状態になる。

DEINITED with side table

弱参照変数を使用した時の挙動

nilが返却される。

弱参照変数へオブジェクトを代入した時の挙動

起こり得ない。

次の状態への遷移

非参照カウントがゼロになった時
オブジェクトは解放されて弱参照カウントが減り
オブジェクトはFREED状態になる。

他はDEINITED without side tableと同じ

FREED without side table

起こり得ない状態。

FREED with side table

オブジェクト

オブジェクトは解放されているが
弱参照がSide Tableに残っている状態。

強参照の操作

起こり得ない。

非参照の操作

起こり得ない。

弱参照変数を使用した時の挙動

nilが返却される。

弱参照変数へオブジェクトを代入した時の挙動

起こり得ない。

次の状態への遷移

弱参照カウントがゼロになった時
Side Tableオブジェクトは解放され
オブジェクトはDEAD状態になる。

DEAD

オブジェクトもSide Tableもなくなっている。

まとめ

Swiftの内部の仕組みから
メモリ管理について見ていきました。

普段はあまり意識していませんでしたが
こういう知識を知っていることで
原因がわからない不具合などの解決にも
役に立つことがあるかもしれません。

また
XcodeにはMemoryDebuggerもあり
そのグラフを理解するのに役に立つかもしれません?

もし何か間違いなどございましたら
ご指摘頂けましたらうれしいです??‍♂️

参考記事

https://www.vadimbulavin.com/swift-memory-management-arc-strong-weak-and-unowned/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UIVisualEffectViewを使ってUIVibrancyEffectだけを表示する

はじめに

UIVisualEffectViewとは

UIVisualEffectViewは背後にあるViewにエフェクトをかけてくれるViewです。

UIVisualEffectViewにはBlurEffectとVibrancyEffectがあります。

Blur:背後のViewにエフェクトをかけることによって、磨りガラス様な感じになります

Vibrancy:UIBlurEffectのViewの上に置くことによって。曇りガラスの様になります。

使うときはUIVisualEffectViewにaddSubviewしないで、UIVisualEffectView.contentViewに追加します

iPhoneでパスコード入力画面や、コントロールセンターで使われており、以下のパスコード入力画面では、背景がBlurEffectでNumberButtonの背景がVibrancyEffectになっています。

IMG_7521.PNG

今回はUIBlurEffectは表示せず、UIVibrancyEffectだけ表示してみよう思います。

やってみる

まずはImageViewの上にVisual Effect View with Blur and Vibrancyを置いてみます。

スクリーンショット 2019-10-12 12.37.32.png

そうすると磨りガラス効果のViewと曇りガラス効果のViewが一気に展開されます。

スクリーンショット 2019-10-12 13.01.56.png

そこにTextなどを入れると、この様な曇りガラスのテキストになります

スクリーンショット 2019-10-12 13.43.53.png

ここからUIVibrancyEffectがかかったTextだけを表示していきたいと思います
方法としてはBlurEffectViewにmaskをかけていきます、

var mask: UIView? { get set }

maskはUIView型なので、UIImageViewやUIViewなど色々な物をUIVibrancyEffectだけを表示ことが可能です

class CatalinaViewController: UIViewController {

    @IBOutlet weak var text: UILabel!
    @IBOutlet weak var blurEffectView: UIVisualEffectView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.blurEffectView.mask = text
    }
}

アプリを実行すると・・・・・・・・・できました!!

Simulator Screen Shot - iPhone 11 Pro - 2019-10-12 at 13.52.06.png

参考リンク

UIVisualEffectView

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOS13 での問題

iOS 13 がリリースされ、既存のアプリで問題が発生しているようなので、気づいたことをメモしたいと思います。

iOS 13 での問題

  • iPhone の電話履歴からVoIPアプリで発信できない
  • iPad OS 13 で、UIDocumentInteractionController で開く共有の画面が正しく表示されない

iPhone の電話履歴からVoIPアプリで発信できない

iPhone の電話帳や履歴から発信した場合、VoIP アプリの application(_:continue:restorationHandler:) が呼び出されます。
音声通話であれば INStartAudioCallIntent、ビデオ通話であれば INStartVideoCallIntentuserActivity.interaction.intent に渡されます。
 
いえ、iOS 12 までは渡されていました・・・
 
iOS 13 では INStartCallIntent が渡されてくるようになりました。
音声かビデオかを判断するのは Intent の種類ではなく、INStartCallIntent.callCapability で判断するようになります。
 
この渡される Intent が変更された件、困ったことに xcoode 11(iOS13 SDK) でビルドしたものではなく、xcode 10.x でビルドしたアプリも同じです・・・
 
VoIP アプリでは application(_:continue:restorationHandler:) に渡されてくる Intent から contacts を取得します。
Swift の場合、Intent をキャストした際、型が合わないと nil となりますが、Objective-C の場合、キャストしてもエラーにならず、存在しないメンバにアクセスした際に初めてエラーとなります。
したがって、contacts は INStartAudioCallIntent も INStartCallIntent にも含まれているため、Objective-C で書かれたプログラムでは書き方次第では iOS 13 でも動いているようです。

iPad OS 13 で、UIDocumentInteractionController で開く共有の画面が正しく表示されない

ファイルや写真などを他のアプリに共有する際に使用する UIDocumentInteractionController ですが、よくある書き方として以下のようなコードが散見されます。

uiDocumentInteractionController.presentOpenInMenu(from: view.frame, in: view, animated: true) 

UITabBarController に追加した ViewController の中でこのコードを実行すると、iPad OS 13 では、共有先選択画面が Tab のところに小さくなって表示されます。
View の下端に表示しようとするが、Tab の高さしかないため縦が小さくなっているのではないかと思われます。
よって、iPad OS 13 対応するためには、from と in に上の方にあるコントロールを指定する工夫が必要なようです。(バグとして iOS 側で修正が入るかもしれませんが・・・)
 
しかし、from と in を上方のコントロールに指定して、xcode 10.x でビルドしたところ、iPhone (iOS 13) では共有先選択画面が全画面表示してしまいました。。。
まぁ、見えないよりぜんぜん良いのですけどね。。。
 
ちなみに同じコードを xcode 11 でビルドすると、いつものように下半分くらいに共有先選択画面が表示されます。。。

Apple さん・・・・・

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Xcodeのライセンスエラー

CocoaPodsで pod install しようとしたらエラーが発生しました。

❯ rbenv exec pod install --repo-update
Traceback (most recent call last):
    4: from /Path/to/your/project/vendor/bin/pod:29:in `<main>'
    3: from /Path/to/your/project/vendor/bin/pod:29:in `load'
    2: from /Path/to/your/project/vendor/bundle/ruby/2.6.0/gems/cocoapods-1.7.5/bin/pod:55:in `<top (required)>'
    1: from /Path/to/your/project/vendor/bundle/ruby/2.6.0/gems/cocoapods-1.7.5/lib/cocoapods/command.rb:50:in `run'
/Path/to/your/project/vendor/bundle/ruby/2.6.0/gems/cocoapods-1.7.5/lib/cocoapods/command.rb:169:in `verify_xcode_license_approved!': [!] You have not agreed to the Xcode license, which you must do to use CocoaPods. Agree to the license by running: `xcodebuild -license`. (Pod::Informative)

Xcodeのライセンスに同意していないので怒られているようです。
そういえば最近Xcodeをアップデートしたし、過去にもこんなことがあった気がします。

前提

❯ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15
BuildVersion:   19A583

❯ xcodebuild -version
Xcode 11.1
Build version 11A1027

Xcodeを起動してライセンスに同意

Xcodeを起動すると、XcodeとiOS SDKのライセンスへ同意を求めるダイアログが表示されます。

スクリーンショット 2019-10-12 6.20.13.png

ライセンスの内容に同意したい場合は Agree をクリックします。

コマンドラインからライセンスに同意

エラーメッセージにも記載されているように、 xcodebuild コマンドを使って(Xcodeを起動せずに)ライセンスに同意できます。

ライセンスを表示するためEnterキーの入力を求められる
❯ sudo xcodebuild -license
Password:


You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.

Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'

プロンプトに Enter キーを入力するとビューワーにライセンスが表示されます。

続きを読む場合は Space キー、ビューワーを終了する場合は q キーを入力します。

続きを読む場合はSpaceキー、ビューワーを終了する場合はqキーを入力
Xcode and Apple SDKs Agreement

PLEASE SCROLL DOWN AND READ ALL OF THE FOLLOWING TERMS AND CONDITIONS CAREFULLY BEFORE USING THE APPLE SOFTWARE OR APPLE SERVICES.  THIS IS A LEGAL AGREEMENT BETWEEN YOU AND APPLE.  IF YOU AGREE TO BE BOUND BY ALL OF THE TERMS AND CONDITI
ONS, CLICK THE “AGREE” BUTTON.  BY CLICKING “AGREE” OR BY DOWNLOADING, USING OR COPYING ANY PART OF THIS APPLE SOFTWARE OR USING ANY PART OF THE APPLE SERVICES, YOU ARE AGREEING ON YOUR OWN BEHALF AND/OR ON BEHALF OF YOUR COMPANY OR ORGAN
IZATION TO THE TERMS AND CONDITIONS STATED BELOW.  IF YOU DO NOT OR CANNOT AGREE TO THE TERMS OF THIS AGREEMENT, YOU CANNOT USE THIS APPLE SOFTWARE OR THE APPLE SERVICES.  DO NOT DOWNLOAD OR USE THIS APPLE SOFTWARE OR APPLE SERVICES IN TH
AT CASE.

1.      Definitions
Whenever capitalized in this Agreement:

“Agreement” means this Xcode and Apple SDKs Agreement.

“Apple” means Apple Inc., a California corporation with its principal place of business at One Infinite Loop, Cupertino, California 95014, U.S.A.

...

“Updates” means bug fixes, updates, upgrades, modifications, enhancements and supplements to the Apple Software or Apple Services, and any new releases or versions thereof.
Software License Agreements Press 'space' for more, or 'q' to quit

ライセンスの内容に同意したい場合は agree を入力します。 print を入力するとライセンスの内容を印刷できます。同意しない場合は cancel を入力します。

ライセンスの内容に同意を求められる
8.7     Entire Agreement; Governing Language
This Agreement constitutes the entire agreement between the parties with respect to the use of the Apple Software and Apple Services licensed hereunder and supersedes all prior understandings regarding such subject matter.  Notwithstanding the foregoing, to the extent that You have entered into the Apple Developer Program License Agreement (PLA) with Apple and are validly licensed by Apple to exercise additional rights, or to use additional features or functionality of the Apple Software or Apple Services under the PLA, You acknowledge and agree that the PLA shall govern Your use of such additional rights and privileges.  No amendment to or modification of this Agreement will be binding unless in writing and signed by Apple.  The parties hereto confirm that they have requested that this Agreement and all related documents be drafted in English.  Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais.


EA1647
8/7/2019


By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel]

ライセンスの内容はXcodeのAbout Box 1 または /Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf で確認できます。

Xcodeライセンスの内容
You can view the license agreements in Xcode's About Box, or at /Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf

まとめ

XcodeとiOS SDKのライセンスに同意することで無事解決しました :tada:

❯ rbenv exec pod install --repo-update
...
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There are 4 dependencies from the Podfile and 11 total pods installed.

プロジェクトをXcodeで起動する前にパッケージ依存管理ツールを実行することは結構あると思いますが、それがXcodeのアップデート直後だったりすると今回のようなエラーに出くわします。

この記事が誰かの助けになればうれしいです :smile:


  1. 「About Boxって何?」と思い調べたところ「Macintoshコンピューターにおいてソフトウェアの作成者やバージョン、連絡先などが表示されるウィンドウ」( 英辞郎 on the WEBより )との情報がみつかりました 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CocoaPodsのXcodeライセンスエラー

CocoaPodsで pod install しようとしたら次のようなエラーが発生しました。

❯ rbenv exec pod install --repo-update
Traceback (most recent call last):
    4: from /Path/to/your/project/vendor/bin/pod:29:in `<main>'
    3: from /Path/to/your/project/vendor/bin/pod:29:in `load'
    2: from /Path/to/your/project/vendor/bundle/ruby/2.6.0/gems/cocoapods-1.7.5/bin/pod:55:in `<top (required)>'
    1: from /Path/to/your/project/vendor/bundle/ruby/2.6.0/gems/cocoapods-1.7.5/lib/cocoapods/command.rb:50:in `run'
/Path/to/your/project/vendor/bundle/ruby/2.6.0/gems/cocoapods-1.7.5/lib/cocoapods/command.rb:169:in `verify_xcode_license_approved!': [!] You have not agreed to the Xcode license, which you must do to use CocoaPods. Agree to the license by running: `xcodebuild -license`. (Pod::Informative)
command.rb
def self.verify_xcode_license_approved!
  if `/usr/bin/xcrun clang 2>&1` =~ /license/ && !$?.success?
    raise Informative, 'You have not agreed to the Xcode license, which ' \
      'you must do to use CocoaPods. Agree to the license by running: ' \
      '`xcodebuild -license`.'
  end
end

Xcodeのライセンスに同意していないので怒られているようです。
そういえば最近Xcodeをアップデートしたし、過去にもこんなことがあった気がします。

前提

❯ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15
BuildVersion:   19A583

❯ xcodebuild -version
Xcode 11.1
Build version 11A1027

Xcodeを起動してライセンスに同意

Xcodeを起動すると、XcodeとiOS SDKのライセンスへ同意を求めるダイアログが表示されます。

スクリーンショット 2019-10-12 6.20.13.png

ライセンスの内容に同意したい場合は Agree をクリックします。

コマンドラインからライセンスに同意

エラーメッセージにも記載されているとおり、 xcodebuild コマンドを使って(Xcodeを起動せずに)ライセンスに同意することもできます。

ライセンスを表示するためEnterキーの入力を求められる
❯ sudo xcodebuild -license
Password:


You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.

Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'

プロンプトに Enter キーを入力するとビューワーにライセンスが表示されます。

続きを読む場合は Space キー、ビューワーを終了する場合は q キーを入力します。

続きを読む場合はSpaceキー、ビューワーを終了する場合はqキーを入力
Xcode and Apple SDKs Agreement

PLEASE SCROLL DOWN AND READ ALL OF THE FOLLOWING TERMS AND CONDITIONS CAREFULLY BEFORE USING THE APPLE SOFTWARE OR APPLE SERVICES.  THIS IS A LEGAL AGREEMENT BETWEEN YOU AND APPLE.  IF YOU AGREE TO BE BOUND BY ALL OF THE TERMS AND CONDITI
ONS, CLICK THE “AGREE” BUTTON.  BY CLICKING “AGREE” OR BY DOWNLOADING, USING OR COPYING ANY PART OF THIS APPLE SOFTWARE OR USING ANY PART OF THE APPLE SERVICES, YOU ARE AGREEING ON YOUR OWN BEHALF AND/OR ON BEHALF OF YOUR COMPANY OR ORGAN
IZATION TO THE TERMS AND CONDITIONS STATED BELOW.  IF YOU DO NOT OR CANNOT AGREE TO THE TERMS OF THIS AGREEMENT, YOU CANNOT USE THIS APPLE SOFTWARE OR THE APPLE SERVICES.  DO NOT DOWNLOAD OR USE THIS APPLE SOFTWARE OR APPLE SERVICES IN TH
AT CASE.

1.      Definitions
Whenever capitalized in this Agreement:

“Agreement” means this Xcode and Apple SDKs Agreement.

“Apple” means Apple Inc., a California corporation with its principal place of business at One Infinite Loop, Cupertino, California 95014, U.S.A.

...

“Updates” means bug fixes, updates, upgrades, modifications, enhancements and supplements to the Apple Software or Apple Services, and any new releases or versions thereof.
Software License Agreements Press 'space' for more, or 'q' to quit

ライセンスの内容に同意したい場合は agree を入力します。 print を入力するとライセンスの内容を印刷できます。同意しない場合は cancel を入力します。

ライセンスの内容に同意を求められる
8.7     Entire Agreement; Governing Language
This Agreement constitutes the entire agreement between the parties with respect to the use of the Apple Software and Apple Services licensed hereunder and supersedes all prior understandings regarding such subject matter.  Notwithstanding the foregoing, to the extent that You have entered into the Apple Developer Program License Agreement (PLA) with Apple and are validly licensed by Apple to exercise additional rights, or to use additional features or functionality of the Apple Software or Apple Services under the PLA, You acknowledge and agree that the PLA shall govern Your use of such additional rights and privileges.  No amendment to or modification of this Agreement will be binding unless in writing and signed by Apple.  The parties hereto confirm that they have requested that this Agreement and all related documents be drafted in English.  Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais.


EA1647
8/7/2019


By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel]

ライセンスの内容はXcodeのAbout Box 1 または /Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf で確認できます。

Xcodeライセンスの内容
You can view the license agreements in Xcode's About Box, or at /Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf

まとめ

XcodeとiOS SDKのライセンスに同意することで無事解決しました :tada:

❯ rbenv exec pod install --repo-update
...
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There are 4 dependencies from the Podfile and 11 total pods installed.

プロジェクトをXcodeで起動する前にパッケージ依存管理ツールを実行することは結構あると思いますが、それがXcodeのアップデート直後だったりすると今回のようなエラーに出くわします。

この記事が誰かの助けになればうれしいです :smile:


  1. 「About Boxって何?」と思い調べたところ「Macintoshコンピューターにおいてソフトウェアの作成者やバージョン、連絡先などが表示されるウィンドウ」( 英辞郎 on the WEBより )との情報がみつかりました 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む