3. LicensePlist
• A license list generator of all your
dependencies for iOS applications.
• Made of Swift Packge Manager (SwiftPM).
• ⭐759 (May 24, 2017)
• CocoaPods
• Carthage
• Source code added manually
4. Existing Tools
for displaying the licenses
• VTAcknowledgementsViewController⭐753
• TRZSlideLicenseViewController⭐121
• AcknowList⭐84
• CarthageLicenseScript⭐68
• LicensesKit⭐39
• SwiftyAcknowledgements⭐32
*Number of Stars: May 24, 2017
6. LicensePlist was born $
• Written in Swift.
• Made of Swift Packge Manager (SwiftPM).
• Supports all your dependencies, including files
added manually or using Carthage or CocoaPods.
• Generates plist files, which show up in Settings app.
12. Collect CocoaPods dependencies and licenses
platform :ios, '9.0'
inhibit_all_warnings!
use_frameworks!
target 'SomeLib' do
pod 'SDWebImage'
target 'MyApp' do
pod 'Alamofire'
end
end
Podfile
13. Collect CocoaPods dependencies and licenses
platform :ios, '9.0'
inhibit_all_warnings!
use_frameworks!
target 'SomeLib' do
pod 'SDWebImage'
target 'MyApp' do
pod 'Alamofire'
end
end
Podfile
Pods
├── Manifest.lock
├── Pods.xcodeproj
├── SDWebImage
│ ├── LICENSE
│ └── SDWebImage
└── Target Support Files
├── Pods-SomeLib
│ ├── Info.plist
│ ├── Pods-SomeLib-acknowledgements.markdown
│ ├── Pods-SomeLib-acknowledgements.plist
│ ├── Pods-SomeLib-dummy.m
│ └── Pods-SomeLib.release.xcconfig
├── Pods-SomeLib-MyApp
│ ├── Info.plist
│ ├── Pods-SomeLib-MyApp-acknowledgements.markdown
│ ├── Pods-SomeLib-MyApp-acknowledgements.plist
│ ├── Pods-SomeLib-MyApp-dummy.m
│ └── Pods-SomeLib-MyApp.release.xcconfig
└── SDWebImage
14. Collect CocoaPods dependencies and licenses
platform :ios, '9.0'
inhibit_all_warnings!
use_frameworks!
target 'SomeLib' do
pod 'SDWebImage'
target 'MyApp' do
pod 'Alamofire'
end
end
Podfile
Pods
├── Manifest.lock
├── Pods.xcodeproj
├── SDWebImage
│ ├── LICENSE
│ └── SDWebImage
└── Target Support Files
├── Pods-SomeLib
│ ├── Info.plist
│ ├── Pods-SomeLib-acknowledgements.markdown
│ ├── Pods-SomeLib-acknowledgements.plist
│ ├── Pods-SomeLib-dummy.m
│ └── Pods-SomeLib.release.xcconfig
├── Pods-SomeLib-MyApp
│ ├── Info.plist
│ ├── Pods-SomeLib-MyApp-acknowledgements.markdown
│ ├── Pods-SomeLib-MyApp-acknowledgements.plist
│ ├── Pods-SomeLib-MyApp-dummy.m
│ └── Pods-SomeLib-MyApp.release.xcconfig
└── SDWebImage
License Body
15. Collect CocoaPods dependencies and lienses
<?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>FooterText</key>
<string>This application makes use of the following third party libraries:</string>
<key>Title</key>
<string>Acknowledgements</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2016 Olivier Poitrey rs@dailymotion.com
</string>
<key>License</key>
<string>MIT</string>
<key>Title</key>
<string>SDWebImage</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>The MIT License (MIT)
Copyright (c) 2014 Le Van Nghia
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:
Pods-SomeLib-MyApp-acknowledgements.plist
16. Collect CocoaPods dependencies and lienses
<?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>FooterText</key>
<string>This application makes use of the following third party libraries:</string>
<key>Title</key>
<string>Acknowledgements</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2016 Olivier Poitrey rs@dailymotion.com
</string>
<key>License</key>
<string>MIT</string>
<key>Title</key>
<string>SDWebImage</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>The MIT License (MIT)
Copyright (c) 2014 Le Van Nghia
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:
Pods-SomeLib-MyApp-acknowledgements.plist
22. Collect GitHub libraries’ licenses
let content =
“TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAxNyBNYXNheXVraSBPbm8KnClBlcm1
pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlnLCB0byBhb…
MSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDnVCwgVE9SVCBPUiBPVEh
FUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SnIElOIENPTk5FQ1RJT04gV0lUSCB
USEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPnUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09
GVFdBUkUuCg==n”
let decoded = String(data: Data(base64Encoded: content,
options: [.ignoreUnknownCharacters])!,
encoding: .utf8)!
Parse base 64 encoded `content`
23. Collect GitHub libraries’ licenses
let content =
“TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAxNyBNYXNheXVraSBPbm8KnClBlcm1
pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlnLCB0byBhb…
MSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDnVCwgVE9SVCBPUiBPVEh
FUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SnIElOIENPTk5FQ1RJT04gV0lUSCB
USEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPnUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09
GVFdBUkUuCg==n”
let decoded = String(data: Data(base64Encoded: content,
options: [.ignoreUnknownCharacters])!,
encoding: .utf8)!
Parse base 64 encoded `content`
`content` contains ‘n’ and so it should be ignored.
24. Parallel processing by using `(NS)Operation`
Collect Carthage licenses
let queue = OperationQueue()
let carthageOperations = githubLibraries.map { GitHubLicense.download($0) }
queue.addOperations(carthageOperations,
waitUntilFinished: true)
githubLicenses = carthageOperations.map { $0.result?.value }.flatMap { $0 }
25. Parallel processing by using `(NS)Operation`
Collect Carthage licenses
let queue = OperationQueue()
let carthageOperations = githubLibraries.map { GitHubLicense.download($0) }
queue.addOperations(carthageOperations,
waitUntilFinished: true)
githubLicenses = carthageOperations.map { $0.result?.value }.flatMap { $0 }
26. Parallel processing by using `(NS)Operation`
Collect Carthage licenses
let queue = OperationQueue()
let carthageOperations = githubLibraries.map { GitHubLicense.download($0) }
queue.addOperations(carthageOperations,
waitUntilFinished: true)
githubLicenses = carthageOperations.map { $0.result?.value }.flatMap { $0 }
27. Parallel processing by using `(NS)Operation`
Collect Carthage licenses
let queue = OperationQueue()
let carthageOperations = githubLibraries.map { GitHubLicense.download($0) }
queue.addOperations(carthageOperations,
waitUntilFinished: true)
githubLicenses = carthageOperations.map { $0.result?.value }.flatMap { $0 }
About 5 times faster$
28. Parallel processing by using `(NS)Operation`
Collect Carthage licenses
let queue = OperationQueue()
let carthageOperations = githubLibraries.map { GitHubLicense.download($0) }
queue.addOperations(carthageOperations,
waitUntilFinished: true)
githubLicenses = carthageOperations.map { $0.result?.value }.flatMap { $0 }
About 5 times faster$
https://github.com/mono0926/LicensePlist/blob/36573fdc5933384534908acf32a642e81c2d9cbc/Sources/LicensePlistCore/ResultOperation.swift
Wrapped Operation class→
29. Generate plist files
let rootItems: [[String: String]] = …
let root = try! PropertyListSerialization.data(fromPropertyList: ["PreferenceSpecifiers": rootItems],
format: .xml,
options: 0)
try! root.write(to: rootPath)
Generating plist files is easy by using `PropertyListSerialization`
30. Generate plist files
let rootItems: [[String: String]] = …
let root = try! PropertyListSerialization.data(fromPropertyList: ["PreferenceSpecifiers": rootItems],
format: .xml,
options: 0)
try! root.write(to: rootPath)
• PropertyListSerialization - Foundation | Apple Developer Documentation
• Property List Programming Guide - Apple Developer
• Implementing an iOS Settings Bundle
Generating plist files is easy by using `PropertyListSerialization`
34. Links
How to create command-line tool made of SwiftPM.
• Building a command line tool using the Swift Package Manager
• Swift Package Manager (SwiftPM) - Qiita
• Swift Package Manager(SwiftPM) Homebrew - Qiita
How to get started with OSS(open source software).
• Swift - Qiita
• iOS OSS Developers.IO
• How to Get Started with Open Source – Hacker Noon