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")
}
}