2017年10月15日日曜日

帰ってきた凛としてSwift(くるくる編)

泣きながらiPhoneX対応をしています。なんであんなにワーニングが出るんでしょうか、Xcode9のStroyboard。

ウェブページを表示する画面を作っていたのですが、また見慣れないSwiftLintのワーニングが出たので、シリーズ続行です。


UIWebViewがdeprecatedになったので、WKWebViewを使うことにしました。

ページのロード中を示すインジケータの表示ですが、UIWebViewならUIWebViewDelegateを実装すれば開始と終了のイベントが取得できるので、丸いアニメーションインジケータを表示するのが簡単だと思います。WKWebViewでも、WKNavigationDelegateを実装すれば同様にコントロールできます。

(※ 今回のソースは全てSwift4で、最小限動くところまで削るためにターゲットをiOS11.0以降にしました。ご注意を。)

import UIKit
import WebKit

class SomeWeb4ViewController: UIViewController, WKNavigationDelegate {

    @IBOutlet weak var webView: WKWebView!
    @IBOutlet weak var indicatorView: UIActivityIndicatorView! //くるくるインジケータ
    
    override func viewDidLoad() {
        super.viewDidLoad()

        indicatorView.hidesWhenStopped = true //くるくるしてないときは、非表示
        
        //webページのロード
        webView.navigationDelegate = self
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
    
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        indicatorView.startAnimating() //くるくる開始
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        indicatorView.stopAnimating() //くるくる停止
    }
}
まぁ、見たとおりです。WKNavigationDelegateで、Webページのロードの開始と停止のイベントを取得しています。処理もシンプルで分かりやすいですね。

ただ、WKWebViewはKVOに対応しているので、もう少し気の利いた制御をするのがお約束なのでしょうか。そんな情報が多いです。そこで、それらを真似てナビゲーションバーの下に、横に伸びるインジケータ表示にしました。

import UIKit
import WebKit

class SomeWeb2ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!
    
    var progressView = UIProgressView()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        //プログレスバー
        let progFrame = CGRect(x: 0.0,
                               y: self.navigationController!.navigationBar.frame.size.height - 2.0,
                               width: self.navigationController!.navigationBar.frame.size.width,
                               height: 10.0)
        progressView = UIProgressView(frame: progFrame)
        progressView.progressViewStyle = .bar
        self.navigationController?.navigationBar.addSubview(progressView)
        
        //ここで、webViewのobserverを設定して
        webView.addObserver(self, forKeyPath: "loading", options: .new, context: nil)
        webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)

        //webページのロード
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
    
    //ここで進捗を受信
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "estimatedProgress"{
            progressView.setProgress(Float(webView.estimatedProgress), animated: true)
        } else if keyPath == "loading"{
            UIApplication.shared.isNetworkActivityIndicatorVisible = webView.isLoading
            if webView.isLoading {
                progressView.setProgress(0.1, animated: true) //プログレスの開始
            } else {
                progressView.setProgress(0.0, animated: false) //プログレスを消去
            }
        }
    }
    
    deinit {
        webView.removeObserver(self, forKeyPath: "estimatedProgress")
        webView.removeObserver(self, forKeyPath: "loading")
    }
}
webViewに、"loading"と"estimatedProgress"のobserverを付加して、ロードの開始、進捗、終了を取得しています。

ちなみにdeinitにある、observerの削除がないと落ちるとのことですが、11.0では落ちなかったです。だから不要、というわけでもなさそうですが。

もちろんこれでちゃんと動作するのですが、SwiftLintがワーニングを出力します。


・block_based_kvo
Block Based KVO Violation: Prefer the new block based KVO API with keypaths when using Swift 3.2 or later. (block_based_kvo)


new block based KVO API with keypaths ってなに?って感じですが、 どうやらWKWebViewに付加したobserverを func observeValue(){} で受信する方法は古いようです。

そこで、Adopting Cocoa Design Patternsの「Key-Value Observing」を参考にして、 NSKeyValueObservationを使った方法に書き換えてみました。
import UIKit
import WebKit

class SomeWeb3ViewController: UIViewController {
    
    @IBOutlet weak var webView: WKWebView!
    var progressView = UIProgressView()
    
    var obsLoading: NSKeyValueObservation? //←これ
    var obsEstimatedProgress: NSKeyValueObservation? //←これ
    
    override func viewDidLoad() {
        super.viewDidLoad()

        //プログレスバー
        let progFrame = CGRect(x: 0.0,
                               y: self.navigationController!.navigationBar.frame.size.height - 2.0,
                               width: UIScreen.main.bounds.size.width,
                               height: 10.0)
        progressView = UIProgressView(frame: progFrame)
        progressView.progressViewStyle = .bar
        self.navigationController?.navigationBar.addSubview(progressView)
        
        //ここから→
        obsLoading = observe(\.webView.loading) { _, _ in
            UIApplication.shared.isNetworkActivityIndicatorVisible = self.webView.isLoading
            if self.webView.isLoading {
                self.progressView.setProgress(0.1, animated: true) //プログレスの開始
            } else {
                self.progressView.setProgress(0.0, animated: false) //プログレスを消去
            }
        }
        obsEstimatedProgress = observe(\.webView.estimatedProgress) { _, _ in
            self.progressView.setProgress(Float(self.webView.estimatedProgress), animated: true)
        }
        //←ここまで

        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
}
Swift4におけるKVOのベストプラクティスがよくわかっていないので、本当にこれが正しいのか自信がないのですが、とりあえずワーニングが消えて、ちゃんと動きました。内心、ちょっと怪しいとは感じています。ま、そのときはそのときで随時修正します。

それにしても、なにこのバックスラッシュ。Swiftこわい。


♪♪♪


こちらもどうぞ。
凛としてSwift
凛としてSwift (血闘編ノ壱)
凛としてSwift (血闘編ノ弐)
凛としてSwift (血闘編ノ参)


2017年10月1日日曜日

チューニングなどという(そしてリベンジ編)

前回の「チューニングなどという(これはアカン編)」で、ハーモニクスを使ったチューニング方法はダメだという話を書きました。今回は、じゃあそれは何の役にも立たないかというかというと、「ちょっと待て、そこは考えどころじゃないか?」という話です。

また、5弦を基準に4弦を合わせる場合に限定して書きます。

正しいチューニング方法では、5弦の5フレットの実音に4弦の開放を合わせるというのは「チューニングなどという(まずは基本ですよ編)」で書きました。

そして、ハーモニクスを使ったチューニング方法では、5弦の5フレットのハーモニクスに4弦の7フレットのハーモニクスを合わせるのでした(でも実際は4弦が少しだけ低くなってしまう)。



そして、2つの音を同じにするよう合わせるには、音を同時に出して唸りがなくなるようにすれば良いことも書きました。

ここからは実際にチューニングをする時の動作についてです。

実音を使った正しいチューニングでは、5弦の5フレットを左手で押さえていないといけないので、ふたつの音を聞きながらペグを回すことはできません。右手でペグを回すという手もありますが、それでは両手が交差して大変ですし、5フレットを押さえている左手に変に力が入って音程も安定しないでしょう。そんなわけで、音をチェックしてはペグを回し、音をチェックして回し、の繰り返しになります。

うむ、これはそういうものなのでしょうがないですな。うんうん。

それに対して、ハーモニクスを使った方法は、音を出している間左手が自由になりますから、音を聞きながらペグを回すことができます。これはちょっと便利ですよね。

そこで、だいたい近いところまではハーモニクスを使ってから、仕上げに実音を使ったチューニングで確認するというのはどうでしょう。

ハーモニクスを使った方法は、基準となる5弦から高い方の4弦を合わせるとき、ピッタリ合わせても、4弦が正しい音程よりも少し低くなるのでした。そこで、そこからは実音でチェックしながら、少しずつ4弦を上げていって合わせるといった方法です。

ペグを回す時は低い方から巻き上げていって、正しい音に合わせるというのがお約束でしたが、これにも馴染みます。

基準となる弦から低い方の現に合わせるとき、つまり5弦の7フレットのハーモニクスに、6弦の5フレットのハーモニクスを合わせる時ですが、この場合はぴったり合わせてしまうと、6弦が少し高くなってしまうので、少し手前でやめて、そこからは、やっぱり実音で確認しながら少しづつ上げていくのがいいと思います。

ハーモニクスでざっくり合わせて、実音で正確にチェック。これですよ。

普段ギターの弦は、張りっぱなしにしている人が多いと思いますが、「ネックが弱いので、弾かないときは弦を緩めておかないとちょっと不安なんだよね」というような方は、この"ハーモニクスでざっくり、実音で正確に"というやり方は便利なのではないでしょうか。そうでなくても、弦の交換時など、全くチューニングがあっていない状態からチューニングする時には役に立ちそうです。

今回は、役に立たないチューニング方法を、なんとか使えないものかという視点で考えてみました。どうでしょうか。





「チューニングなどという(だからチューナー編)」に続きます。

2017年9月15日金曜日

Blender?

備忘録です。

Blenderの新しいバージョン2.79がリリースされたので、早速バージョンアップしてみました。

古いバージョンをアプリケーショフォルダから削除したら、ここから新しいバージョンをダウンロードして、解凍してアプリケーションフォルダに入れるだけです。フォルダ名はblenderに変更しました。まぁ、上書きでも大丈夫だとは思いますが。

アプリケーションの中にポンっ!


ちなみにBlenderフォルダの中

Blender.appをダブルクリックすると・・・

ちゃんとアップデートされています。

で、当然ドックにアイコンを作りますよね。


再起動しますよね。

あれ?

なにこのはてな。こっちが?ですわ。クリックしても反応しません。でも以前見たことがあります。

そういえば前にインストールした時に何か、ごにょごにょしたよなぁ。。。なんだっけ?
覚えていないので、グーグル先生に聞きました。そう、これこれ。

$ xattr -dr com.apple.quarantine /Applications/blender/

これで、ドックにアイコンを作り直せば、再起動しても大丈夫です。

OK!

これで次から、あたふたしなくて済みそうです。





2017年9月1日金曜日

チューニングなどという(これはアカン編)


前回、ギターのチューニング方法について書きましたが、今回はよく知られて「は」いる方法の、ハーモニクスを使ったチューニングについて書きます。

ただ最初に断っておきますが、この方法はダメです。ちゃんと音が合いません。

でもあえて説明します。

さて、音叉で5弦を合わせるところは同じです。正しく音があった5弦を基準に、順にチューニングしていきます。
  • 5弦の7フレットのハーモニクスに、6弦の5フレットのハーモニクスを合わせる。
  • 5弦の5フレットのハーモニクスに、4弦の7フレットのハーモニクスを合わせる。
  • 4弦の5フレットのハーモニクスに、3弦の7フレットのハーモニクスを合わせる。
  • 3弦の4フレットのハーモニクスに、2弦の5フレットのハーモニクスを合わせる。
  • 2弦の5フレットのハーモニクスに、1弦の7フレットのハーモニクスを合わせる。

3弦の4フレットのハーモニクスがちょっと苦しいですが、本題はそこではなく、各弦の7フレットの音がポイントです。

ここからは5弦と4弦に絞って説明していきます。

5弦の5フレットのハーモニクスはAです。そして4弦の7フレットのハーモニクスもAです。何の問題もなさそうですが、この4弦の7フレットのハーモニクスというのが曲者です。

まず大前提として、ギターはピアノやオルガンなどと同様、平均律の楽器です。フレットが均等に打たれてますからね(いうまでもなく、等間隔という意味ではなくて均等に幅が変化していきます)。

12フレットは開放弦の1オクターブ上の音になりますが、ちょうど真ん中です。正確には押さえた時に弦長が半分になります。

12フレットのハーモニクスは2倍振動なので、弦長が半分になるのと同じです。したがってこの2つの音は同じ音になります。逆に言うと、この2つの音が同じになるように調整するのが、いわゆるオクターブチューニングです。

開放弦
12フレット
12フレットのハーモニクス(開放の2倍振動)

5
フレットのハーモニクスは、5フレットがほぼ弦長の4分の3の位置にあるので4倍振動になり、正確に12フレットのさらに1オクターブ上の音になります。つまり5弦でいうと、開放弦の正確な2オクターブ上のAになるわけです。

5フレットのハーモニクス(開放の4倍振動)

さて問題の4弦の7フレットのハーモニクスです。

7フレットは、開放のほぼ3分の2の位置にあるので、そのハーモニクスは3倍振動になります。そうすると7フレットのAの1オクターブ上のA(2倍振動相当)が出そうなものなのですが。。。

平均律の正しい音程である7フレットのAは、開放の3分の2よりわずかに長いのです。その結果ハーモニクスは、7フレットの実音と比較して、わずかに高いということになります。

5フレットのハーモニクス(開放の3倍振動)
7フレット
※平均律の計算についてはまた改めて書くつもりです。

平均律の正しい音程である5弦の5フレットのハーモニクスに対して、このわずかに高い4弦の7フレットのハーモニクスが同じになるように、4弦を調整するとどうなるでしょうか。4弦の開放は本来合わせるべき、平均律のDより少し下げる(低い音にする)ことになってしまいます。

3弦のチューニングも、このわずかに低い4弦を基準にするので、さらに低くなります。
このわずかな差が、順に隣の弦、隣の弦、と積み重なってずれていって、1弦まで行った時には、随分と正確な音程から外れてしまいます。

まぁ4フレットのハーモニクスを使う時点でちょっとアレな感じではあるのですが。

前回、ギターというのはそれほど正確な音程が出せる楽器ではないとは書きましたが、限度があります。このチューニング方法はいけません。ダメですよ。






「チューニングなどという(そしてリベンジ編)」に続きます。

2017年8月15日火曜日

話題の書「アイデア大全」を斬るっ!

先日ブックオフをぶらぶらしてたら、アイデア大全を見つけました。

もったいねー。売っちゃったかー。こんなに実用的な本はないのに。

表紙に若干のスレはありますが、書き込みもなくキレイです。税込み1,260円。電子版よりちょっと安いですか。

とは言え、僕はすでに持っているので2冊目はいらんなぁ、と棚に戻そうとしたときヒラメキました。


手にとっただけで「!」が降りてくる恐ろしい本。。。


とりあえずブックオフから救出しました。

2冊のアイデア大全。

元々持っていた方は新品で購入して書店のカバーをかけてもらっていたのでとてもキレイです。


この中古のアイデア大全を、おもむろにカッターナイフで半分に。

著者さん、ごめんなさい。

さらに半分に

編集さん、ごめんなさい。

そして、さらに半分に。

本の神様、ごめんなさい。

そこでロータリーカッターの出番です。

慎重にカット。

これでバラバラになりました。

バラバラ。


あー、はいはい、スキャンして自炊ね。って思ったでしょ?
違いますよ。そんなの最初から電子版を買った方が楽チンですよ。

表紙と目次、あと、もったいないですけどアイデア史年表は捨てます。もう一冊ありますからね。
これは廃棄。


ここで2つ穴パンチの登場です。そして100均で買ったリング。

穴を開けます。


穴を開けて、リングを通せば出来上がりです。

出来上がり。


アイデア大全には42個の発想法が11章に分かれて紹介されていますが、内容的にはどこから読んでもいい作りになっています。

環状にしたことで始まりも終わりもなくなりました。ページがランダムになったわけではありませんが、ランダム「的」に開くことができますので、各発想法が順序に縛られないというか、各々独立した感が得られます。

この本は読むこと以上に、実践することこそ重要なので、いつでも手に取れるようにデスクの脇にばさっと置いて、気づいた時に数ページパラパラと読んで、ちょっと試して見るという感じで使うつもりです。

ま、それならわざわざ切る必要もないといえば、その通りなんですけどね(笑)。

ただ残念なことは、穴に対してリングが細いので、すぐに穴が傷みそうな点です。持ち運びには向いてませんね。穴が傷んだらその都度パッチで補強するというパワープレイでとりあえず我慢です。

もう少し太いリングが欲しいところ。


あと、いつまで公開されているかわかりませんが、こちらでクイズに答えると、読者特典として43個目の発想法「露伴のメトミニー」のPDFがダウンロードできます。もちろんプリントアウトして付け加えましたよ。

ちょっと手が空いたらクロヴィッツの関係アルゴリズムのアプリ化でもやってみようかなぁ。需要あるかなぁ。ってか訴えられたりしない?


と、まぁ、アイデア大全に対する鋭い批評、と思わせながらの自炊記事、に見せかけた上での、アイデア大全のカード化の話でした。ダメですか、そうですか。








2017年8月1日火曜日

チューニングなどという(まずは基本ですよ編)

ギターのチューニングについて、何回かに分けて書こうと思います。まぁ、結論としては僕の作ったアプリを使ってね(てへぺろ)、ってことではあるのですが、思うところもいろいろあるので。

まずは身もふたもないことを書きますが、ギターというのは構造的に、ピアノやオルガンなどと比べて、そんなに厳密に正確な音程を出せる楽器ではありません。オクターブチューニングをしっかり合わせても、各フレットの音ではどうしても誤差が生じます。フレットは指板に打ち込んでありますから、容易には調整できません。そもそも弦を押さえる強さの加減で音程が変わりますしね。クロマチックチューナーをお持ちなら、一度各音を測ってみてはいかがでしょうか。

とは言え、それでもチューニングはとても重要なわけで、ないがしろにはできません。

そこでまず今回は、基本的なギターのチューニング方法です。一応だらだらと言葉で書きますが、YouTubeなどでチューニング方法を検索すれば動画で説明されている方がすぐに見つかると思うので、そちらをご覧になった方がわかりやすいです。

使用するのは音叉だけです。A(ラ)の440HZのものです。音叉は楽器店で数百円で買えると思うので、一番リーズナブルで正確な方法だと思います。

音叉を鳴らす時は叩くわけですが、机のカドなど固い所に当てると狂う元になるので、太ももなんかにペシッと叩くのがいいのではないでしょうか。痛くない程度にね。

音叉はそのままでは音が小さいので、お尻の部分を何かに当てて共鳴させます。机やテーブルでもいいのですが、アコースティックギターなら、ギターが共鳴箱そのものですから、ボディに軽くあてるのがいいと思います。ただ、塗装面だと傷がついてしまうので、ピックガードやブリッジ、ブリッジピンの上など、固い部分がいいと思います。アンプをつないだエレキギターなら、音叉をピックアップに近づけるだけでアンプから音が出せます。

周りがうるさくて、直接耳で聞きたい場合は、音叉のお尻を耳の穴の1センチくらい手前(こめかみ方向)に当てればよく聞こえと思います。耳に穴に突っ込むのは危険ですからダメですよ。音叉のお尻の部分を歯で噛んでくわえてもよく聞こえます。骨伝導ってやつですね。

音叉の音とギターの5弦の12フレットのハーモニクスの音が同じになるように合わせます。

まずは2つの音をよく聞いて、なんとなく同じ音程まで近づけます。
2つの音を同時に鳴らすと、音がずれている場合はずれている分だけ唸りが発生します。びよよよよよ~んって感じで。これが近づいていくと、唸りが緩やかになります。びよ~うわぁ~んうわぁ~んうわぁ~んって感じですか。ぴったり合うと唸りはなくなって調和します。いわゆるユニゾンの調和ですね。そうなったら5弦はOKです。

これで5弦の音があったので、この5弦を基準にして他の弦を合わせていきます。この図はギターの入門書には必ず載っているものです。



  • 6弦の5フレットと5弦の開放が同じになるように。
  • 5弦の5フレットと4弦の開放が同じになるように。
  • 4弦の5フレットと3弦の開放が同じになるように。
  • 3弦の4フレットと2弦の開放が同じになるように。(ここだけ4フレットなので注意!)
  • 2弦の5フレットと1弦の開放が同じになるように。

と、なったら終了。と言いたいところですが、もう一度最初(音叉と5弦の12フレット)から確認します。ネックと弦の張力のバランスが変わると、当然音程も変わってきますので、再度確認が必要です。すべての音が合うまで何回か繰り返します。それが何回かは、こればっかりはそのギターのネックの強度にもよるので、何回とは言えませんが、何度やっても狂っているようなら、ナットやブリッジに何か問題があるかもしれません。身近に詳しい人がいたら見てもらうことをオススメします。

この音程が同じになるように合わせるというのが、言葉で言うと簡単なのですが、初心者にとってはなかなかハードルが高いと思います。慣れれば簡単なんですけどね。慣れないうちは、二つの音のどっちが高いのか低いのかすらよくわからないかもしれませんが、試行錯誤しながら慣れていってください。


ここでひとつペグを回す上での重要なポイントを。音を合わせる時には、低い状態からペグを巻き上げて、音があった状態にすることです。

弦はペグのポストに巻かれていると思いますが、弦の音を下げる時にこの巻かれた部分がわずかに緩みます。これがギターを弾いているうちにチューニングの狂いにつながっていきます。ギターを引くと言う行為は弦を弾くわけですが、言い換えるとほんの少し引っ張ることになるますから。

そんなわけで、音があったなと思ったら、あえてちょっとだけ弦の音を下げて、少しずつ音を確認しながら巻き上げて、音を合わせるようにするといいと思います。

唸りをチェック→ほんのちょっと巻き上げる→唸りをチェック→ほんのちょっと巻き上げる、の繰り返しですね。

とりあえず今回は以上です。何を当たり前のことをとお思いかもしれませんが、ギターのチューニングと言うのはこれが基本ですので、まずは押さえておいてください。






「チューニングなどという(これはアカン編)」に続きます。

2017年7月15日土曜日

ライセンスと謎アイコン

アプリを作るにあたって、いくつものオープンソースのライブラリなどを使わせてもらっています。ありがとうございます。

それらはBSDやMITなどのゆる~いライセンスですが、当然ライセンス条項に従った表記が必須です。そこで今回は、ライセンス条項の中の著作権表記とライセンス条項をアプリ内のどこで表示するかという話です。

Androidアプリでは専用のダイアログを用意してます。つまりライセンス表記用に画面をひとつ作っているわけです。

では、iOSではどうしているかというと、settings.bundleを使っています。本来はその名のとおり、そのアプリ固有の各種設定を操作する画面ですが、バージョンやライセンス表記に使うのにも都合がいいです。

まずプロジェクトの直下にSettings.bundleを追加します。




白いレゴブロックのようなパッケージが追加されます(どうでもいいことですけど、このアイコンどういう意味なんでしょうか)。中を見るとRoot.plistがありますので、Source Codeとして開きます。


上位のdictタグの下を変更します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <!-- ここから -->
 <key>StringsTable</key>
 <string>Root</string>
 <key>PreferenceSpecifiers</key>
 <array>
  <dict>
   <key>Type</key>
   <string>PSGroupSpecifier</string>
   <key>Title</key>
 <!-- 中略 -->
   <key>MinimumValue</key>
   <integer>0</integer>
   <key>MaximumValue</key>
   <integer>1</integer>
   <key>MinimumValueImage</key>
   <string></string>
   <key>MaximumValueImage</key>
   <string></string>
  </dict>
 </array>
 <!-- ここまで -->
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <!-- ここから -->
 <key>PreferenceSpecifiers</key>
 <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
            <key>FooterText</key>
            <string>Copyright 20xx xxxxxx All Rights Reserved.
            </string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSChildPaneSpecifier</string>
            <key>Title</key>
            <string>Legal</string>
            <key>File</key>
            <string>Legal</string>
        </dict>
 </array>
 <key>StringsTable</key>
 <string>Root</string>
 <!-- ここまで -->
</dict>
</plist>
次にいったんXcodeを離れて、Finderでプロジェクトの下のSettings.bundleを右クリックして、「パッケージの内容を表示」で開きます。

ここにお好きな名前で、.plistファイルを作成します。わかりやすいようにLegal.plistとしました。内容は以下のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string></string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
            <key>FooterText</key>
            <string>Awsome Library
                
MIT License
        
Copyright (c) 20xx FooBar Co.Ltd
        
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
        
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
        
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
            </string>
        </dict>
    </array>
</dict>
</plist>
Settings.bundleのフッターの文字列を利用しているわけです。

Xcodeに戻って、Settings.bundleを開くとLegal.plistが作成されているのが確認できます。


これで実行すれば、設定アプリの中に今作ったアプリが追加されて、中に「Legal」が追加されています。


ラベルですが、僕は「Legal」としていますが、「Acknowledgements」などとしているアプリもありますね。複数の記述をするときは、Legal.plistarrayタグの下のdictタグを繰り返せば大丈夫です。

Legal.plistに記載するライセンス条項は、そのライブラリの中の文言を改変せず、そのままコピーします。通常はLICENSEというファイル名で置かれていることが多いですね。

ただ、正直なところ、改行位置だけは修正しています。改行位置がそのままだと非常に読みにくくなってしまうので、それでは本末転倒じゃないかと、そうしています。本当はよくないのかもしれませんが、改行位置ならセーフじゃないかなぁと思っています。法的な問題なので安易に大丈夫とは言えません。その辺り、詳しい方がいらっしゃったら意見を伺いたいところです。