LicensePlistのデータを取得してDocumentファイルに保存する

はじめに

ライブラリのライセンスを設定ではなくアプリ内に持つアプリの開発を行っており、ライブラリを追加するたびにテキストファイルを修正して保存していたのですが、LicensePlistで出力した値をDocumentファイルに保存することで自動化することができました。

フォルダ構成

プロジェクト直下にLicensePlistで出力したbundleファイルを置いています。LicensePlistの導入は他の記事でたくさん紹介されている為省略します。

コード

Plistの読み込みとファイル保存

だいぶ冗長なコードになってしまいましたが、これでライセンスファイルをサクッと保存することができます。

        // 共通のパス
        let licensePlistPath = "./Settings.bundle/com.mono0926.LicensePlist"
        
        let fileManager = FileManager.default
        //com.mono0926.LicensePlistフォルダ以下のfile名一覧
        var files: [String]
        //licenseの文字列
        var footerTextData: [String] = []
        var typeData: [String] = []
        if let path: String = Bundle.main.path(forResource: licensePlistPath, ofType: "") {
            do {
                files = try fileManager.contentsOfDirectory(atPath: path)
                files.forEach {
                    let searchPath = licensePlistPath + "/" + $0
                    
                    let filePath = Bundle.main.path(forResource: searchPath, ofType: nil)
                    if let infoList = NSMutableDictionary(contentsOfFile: filePath!) {
                        let data = infoList.value(forKeyPath: "PreferenceSpecifiers") as? [[String: String]]
                        if let footerData = data![0]["FooterText"] {
                            footerTextData.append(String(describing: footerData))
                        }
                    }
                }

                //documentディレクトリへの書き込み
                if let dir = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask ).first {
                    
                    let filePath = dir.appendingPathComponent( "license.txt" )
                    
                    var text: String = ""
                    for(i, name) in files.enumerated() {
                        //.plistがついてしまっているのでsplitして名前だけにする
                        let libraryName = name.split(separator: ".")
                        text.append(String(libraryName.first ?? ""))
                        text.append("\n")
                        text.append("\n")
                        text.append(footerTextData[i])
                        text.append("\n")
                    }
                    do {
                        try text.write(to: filePath, atomically: true, encoding: .utf8)
                    } catch {
                        print("Writeing error")
                    }
                }
            } catch {
                print("Reference failure")
            }
        }

ファイル名一覧を取得する部分は前に書いた記事があるのでそちらを参考にしてみてください。

documentフォルダの読み込み

        if let dir = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask ).first {
            
            let path_file_name = dir.appendingPathComponent("license.txt")
            
            do {
                let text = try String( contentsOf: path_file_name, encoding: String.Encoding.utf8 )
                print( text )
            } catch {
                print("reading error")
            }
        }

参考文献

[Swift4] プロパティリスト(.plist)の読み書きまとめ

[Swift] Dictionaryをこねくり回すネタ集

Cannot convert value of type ‘subSequence’ (aka ‘String.CharacterView’) to type ‘String’ in collection

Swiftでファイルの読み込みと保存

Swift

前の記事

グレースケール変換
Swift

次の記事

Metalで画像の描画