├── TinyConsole-Demo.gif
├── TinyConsole-Open.png
├── TinyConsole-Banner.png
├── TinyConsole-Hierarchy.png
├── TinyConsole.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── xcshareddata
│ └── xcschemes
│ │ ├── TinyConsole.xcscheme
│ │ └── TinyConsole-Example.xcscheme
└── project.pbxproj
├── TinyConsole
├── Extensions
│ ├── UIButtonExtensions.swift
│ ├── NSAttributedStringExtensions.swift
│ ├── UIViewControllerExtensions.swift
│ ├── UITextViewExtensions.swift
│ ├── UIViewExtensions.swift
│ └── UIAlertActionExtensions.swift
├── Supporting Files
│ ├── TinyConsole.h
│ └── Info.plist
├── TinyConsoleViewController.swift
├── TinyConsoleController.swift
└── TinyConsole.swift
├── TinyConsole-Example
├── AppDelegate.swift
├── MainViewController.swift
├── Info.plist
├── Base.lproj
│ └── LaunchScreen.storyboard
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
└── MainTableData.swift
├── LICENSE
├── .gitignore
└── README.md
/TinyConsole-Demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmo/TinyConsole/HEAD/TinyConsole-Demo.gif
--------------------------------------------------------------------------------
/TinyConsole-Open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmo/TinyConsole/HEAD/TinyConsole-Open.png
--------------------------------------------------------------------------------
/TinyConsole-Banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmo/TinyConsole/HEAD/TinyConsole-Banner.png
--------------------------------------------------------------------------------
/TinyConsole-Hierarchy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmo/TinyConsole/HEAD/TinyConsole-Hierarchy.png
--------------------------------------------------------------------------------
/TinyConsole.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/TinyConsole.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/TinyConsole/Extensions/UIButtonExtensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIButtonExtensions.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran on 30.09.19.
6 | //
7 |
8 | import UIKit
9 |
10 | internal extension UIButton {
11 | func applyMiniStyle() {
12 | contentEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
13 | backgroundColor = UIColor(white: 1.0, alpha: 0.1)
14 | layer.cornerRadius = 4
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/TinyConsole/Extensions/NSAttributedStringExtensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSAttributedStringExtensions.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran on 30.09.19.
6 | //
7 |
8 | import Foundation
9 |
10 | internal extension NSAttributedString {
11 | static func breakLine() -> NSAttributedString {
12 | return NSAttributedString(string: "\n")
13 | }
14 |
15 | var range: NSRange {
16 | return NSRange(location: 0, length: length)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/TinyConsole/Supporting Files/TinyConsole.h:
--------------------------------------------------------------------------------
1 | //
2 | // TinyConsole.h
3 | // TinyConsole
4 | //
5 | // Created by Devran Uenal on 28.11.16.
6 | //
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for TinyConsole.
12 | FOUNDATION_EXPORT double TinyConsoleVersionNumber;
13 |
14 | //! Project version string for TinyConsole.
15 | FOUNDATION_EXPORT const unsigned char TinyConsoleVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 |
19 |
20 |
--------------------------------------------------------------------------------
/TinyConsole/Extensions/UIViewControllerExtensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewControllerExtensions.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran on 30.09.19.
6 | //
7 |
8 | import UIKit
9 |
10 | internal extension UIViewController {
11 | func removeAllChildren() {
12 | children.forEach {
13 | $0.willMove(toParent: nil)
14 | }
15 |
16 | for view in view.subviews {
17 | view.removeFromSuperview()
18 | }
19 | children.forEach {
20 | $0.removeFromParent()
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/TinyConsole/Extensions/UITextViewExtensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITextViewExtensions.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran on 30.09.19.
6 | //
7 |
8 | import Foundation
9 |
10 | internal extension UITextView {
11 | static let console: UITextView = {
12 | let textView = UITextView()
13 | textView.backgroundColor = UIColor.black
14 | textView.isEditable = false
15 | textView.alwaysBounceVertical = true
16 | return textView
17 | }()
18 |
19 | func clear() {
20 | text = ""
21 | }
22 |
23 | func boundsHeightLessThenContentSizeHeight() -> Bool {
24 | return bounds.height < contentSize.height
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/TinyConsole/Extensions/UIViewExtensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewExtensions.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran on 29.09.19.
6 | //
7 |
8 | import Foundation
9 |
10 | internal extension UIView {
11 | enum Anchor {
12 | case top
13 | case bottom
14 | }
15 |
16 | func attach(anchor: Anchor, to view: UIView) {
17 | translatesAutoresizingMaskIntoConstraints = false
18 | switch anchor {
19 | case .top:
20 | topAnchor.constraint(equalTo: view.topAnchor).isActive = true
21 | case .bottom:
22 | bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
23 | }
24 |
25 | leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
26 | rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/TinyConsole/Supporting Files/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | $(MARKETING_VERSION)
19 | CFBundleVersion
20 | $(CURRENT_PROJECT_VERSION)
21 | NSPrincipalClass
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/TinyConsole-Example/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // TinyConsole-Example
4 | //
5 | // Created by Devran Uenal on 28.11.16.
6 | //
7 | //
8 |
9 | import TinyConsole
10 | import UIKit
11 |
12 | @UIApplicationMain
13 | class AppDelegate: UIResponder, UIApplicationDelegate {
14 | var window: UIWindow?
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | window = UIWindow(frame: UIScreen.main.bounds)
18 |
19 | let tabBarController = UITabBarController()
20 | tabBarController.viewControllers = [
21 | UINavigationController(rootViewController: MainViewController())
22 | ]
23 |
24 | window?.rootViewController = TinyConsole.createViewController(rootViewController: tabBarController)
25 | window?.makeKeyAndVisible()
26 |
27 | return true
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Devran Ünal
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/TinyConsole-Example/MainViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainViewController.swift
3 | // TinyConsole-Example
4 | //
5 | // Created by Devran Uenal on 28.11.16.
6 | //
7 | //
8 |
9 | import TinyConsole
10 | import UIKit
11 |
12 | class MainViewController: UITableViewController {
13 | lazy var mainTableData: MainTableData = {
14 | let mainTableData = MainTableData()
15 | mainTableData.registerCellsForTableView(tableView)
16 | return mainTableData
17 | }()
18 |
19 | init() {
20 | super.init(style: .grouped)
21 | commonInit()
22 | }
23 |
24 | required init?(coder: NSCoder) {
25 | super.init(coder: coder)
26 | commonInit()
27 | }
28 |
29 | func commonInit() {
30 | title = "Main"
31 | }
32 |
33 | override func viewDidLoad() {
34 | tableView.delegate = mainTableData
35 | tableView.dataSource = mainTableData
36 |
37 | super.viewDidLoad()
38 | }
39 |
40 | override func viewDidAppear(_ animated: Bool) {
41 | super.viewDidAppear(animated)
42 |
43 | printWelcome()
44 | }
45 | }
46 |
47 | extension MainViewController {
48 | func printWelcome() {
49 | TinyConsole.print("Welcome to TinyConsole")
50 | TinyConsole.addLine()
51 | TinyConsole.print("NOW", color: UIColor.red)
52 | TinyConsole.print("IN", color: UIColor.green)
53 | TinyConsole.print("COLOR", color: UIColor.blue)
54 | TinyConsole.addLine()
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/TinyConsole-Example/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIRequiredDeviceCapabilities
26 |
27 | armv7
28 |
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## We Hate DS_Store
6 | .DS_Store
7 |
8 | ## Build generated
9 | build/
10 | DerivedData/
11 |
12 | ## Various settings
13 | *.pbxuser
14 | !default.pbxuser
15 | *.mode1v3
16 | !default.mode1v3
17 | *.mode2v3
18 | !default.mode2v3
19 | *.perspectivev3
20 | !default.perspectivev3
21 | xcuserdata/
22 |
23 | ## Other
24 | *.moved-aside
25 | *.xcuserstate
26 |
27 | ## Obj-C/Swift specific
28 | *.hmap
29 | *.ipa
30 | *.dSYM.zip
31 | *.dSYM
32 |
33 | ## Playgrounds
34 | timeline.xctimeline
35 | playground.xcworkspace
36 |
37 | # Swift Package Manager
38 | #
39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
40 | # Packages/
41 | .build/
42 |
43 | # CocoaPods
44 | #
45 | # We recommend against adding the Pods directory to your .gitignore. However
46 | # you should judge for yourself, the pros and cons are mentioned at:
47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
48 | #
49 | # Pods/
50 |
51 | # Carthage
52 | #
53 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
54 | # Carthage/Checkouts
55 |
56 | Carthage/Build
57 |
58 | # fastlane
59 | #
60 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
61 | # screenshots whenever they are needed.
62 | # For more information about the recommended setup visit:
63 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
64 |
65 | fastlane/report.xml
66 | fastlane/Preview.html
67 | fastlane/screenshots
68 | fastlane/test_output
69 |
--------------------------------------------------------------------------------
/TinyConsole-Example/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/TinyConsole-Example/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/TinyConsole/Extensions/UIAlertActionExtensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIAlertActionExtensions.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran on 30.09.19.
6 | //
7 |
8 | import MessageUI
9 |
10 | internal extension UIAlertAction {
11 | static let cancel: UIAlertAction = {
12 | UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
13 | }()
14 |
15 | static let clear: UIAlertAction = {
16 | UIAlertAction(title: "Clear", style: .destructive) {
17 | (action: UIAlertAction) in
18 | TinyConsole.clear()
19 | }
20 | }()
21 |
22 | static func okAddLog(with alert: UIAlertController) -> UIAlertAction {
23 | return UIAlertAction(title: "Add Log", style: .default) {
24 | (action: UIAlertAction) in
25 | guard let text = alert.textFields?.first?.text, !text.isEmpty else {
26 | return
27 | }
28 | TinyConsole.print(text)
29 | }
30 | }
31 |
32 | static func ok() -> UIAlertAction {
33 | return UIAlertAction(title: "OK", style: .default, handler: nil)
34 | }
35 | }
36 |
37 | internal extension UIAlertAction {
38 | typealias MailInitiator = UIViewController & MFMailComposeViewControllerDelegate
39 |
40 | static func sendMail(on viewController: MailInitiator) -> UIAlertAction {
41 | UIAlertAction(title: "Send Email", style: .default) {
42 | (action: UIAlertAction) in
43 | DispatchQueue.main.async {
44 | guard let text = TinyConsole.shared.textView?.text else {
45 | return
46 | }
47 |
48 | if MFMailComposeViewController.canSendMail() {
49 | let composeViewController = MFMailComposeViewController()
50 | composeViewController.mailComposeDelegate = viewController
51 | composeViewController.setSubject("Console Log")
52 | composeViewController.setMessageBody(text, isHTML: false)
53 | viewController.present(composeViewController, animated: true, completion: nil)
54 | } else {
55 | let alert = UIAlertController(title: "Email account required",
56 | message: "Please configure an email account in Mail",
57 | preferredStyle: .alert)
58 | alert.addAction(UIAlertAction.ok())
59 | viewController.present(alert, animated: true, completion: nil)
60 | }
61 | }
62 | }
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/TinyConsole.xcodeproj/xcshareddata/xcschemes/TinyConsole.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
52 |
53 |
59 |
60 |
66 |
67 |
68 |
69 |
71 |
72 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/TinyConsole.xcodeproj/xcshareddata/xcschemes/TinyConsole-Example.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/TinyConsole/TinyConsoleViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TinyConsoleViewController.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran Uenal on 28.11.16.
6 | //
7 | //
8 |
9 | import UIKit
10 | import MessageUI
11 |
12 | /// This UIViewController
13 | class TinyConsoleViewController: UIViewController {
14 | private let stackView: UIStackView = {
15 | let stackView = UIStackView()
16 | stackView.axis = .vertical
17 | stackView.alignment = .fill
18 | stackView.spacing = 4
19 | return stackView
20 | }()
21 |
22 | private let consoleTextView = UITextView.console
23 |
24 | open override func viewDidLoad() {
25 | super.viewDidLoad()
26 | TinyConsole.shared.textView = consoleTextView
27 | view.addSubview(consoleTextView)
28 | view.addSubview(stackView)
29 | setupConstraints()
30 |
31 | let customTextButton = UIButton(type: .system)
32 | customTextButton.setTitle("Text", for: .normal)
33 | customTextButton.addTarget(self, action: #selector(customText(sender:)), for: .touchUpInside)
34 | customTextButton.applyMiniStyle()
35 | stackView.addArrangedSubview(customTextButton)
36 |
37 | let lineButton = UIButton(type: .system)
38 | lineButton.setTitle("Line", for: .normal)
39 | lineButton.addTarget(self, action: #selector(addLine(sender:)), for: .touchUpInside)
40 | lineButton.applyMiniStyle()
41 | stackView.addArrangedSubview(lineButton)
42 |
43 | let clearButton = UIButton(type: .system)
44 | clearButton.setTitle("More", for: .normal)
45 | clearButton.addTarget(self, action: #selector(additionalActions(sender:)), for: .touchUpInside)
46 | clearButton.applyMiniStyle()
47 | stackView.addArrangedSubview(clearButton)
48 | }
49 |
50 | private func setupConstraints() {
51 | consoleTextView.translatesAutoresizingMaskIntoConstraints = false
52 | consoleTextView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
53 | consoleTextView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
54 | view.safeAreaLayoutGuide.rightAnchor.constraint(equalTo: consoleTextView.rightAnchor).isActive = true
55 | view.bottomAnchor.constraint(equalTo: consoleTextView.bottomAnchor).isActive = true
56 |
57 | stackView.translatesAutoresizingMaskIntoConstraints = false
58 | stackView.topAnchor.constraint(equalTo: view.topAnchor, constant: 8).isActive = true
59 | view.safeAreaLayoutGuide.rightAnchor.constraint(equalTo: stackView.rightAnchor, constant: 8).isActive = true
60 | }
61 |
62 | @objc func customText(sender: AnyObject) {
63 | let alert = UIAlertController(title: "Custom Log", message: "Enter text you want to log.", preferredStyle: .alert)
64 | alert.addTextField { $0.keyboardType = .default }
65 | alert.addAction(.okAddLog(with: alert))
66 | alert.addAction(.cancel)
67 | present(alert, animated: true, completion: nil)
68 | }
69 |
70 | @objc func additionalActions(sender: AnyObject) {
71 | let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
72 | alert.addAction(.sendMail(on: self))
73 | alert.addAction(.clear)
74 | alert.addAction(.cancel)
75 | present(alert, animated: true, completion: nil)
76 | }
77 |
78 | @objc func addLine(sender: AnyObject) {
79 | TinyConsole.addLine()
80 | }
81 | }
82 |
83 | extension TinyConsoleViewController: MFMailComposeViewControllerDelegate {
84 | func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
85 | controller.dismiss(animated: true, completion: nil)
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/TinyConsole-Example/MainTableData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainTableData.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran Uenal on 11.12.16.
6 | //
7 | //
8 |
9 | import TinyConsole
10 | import UIKit
11 |
12 | class MainTableData: NSObject {
13 | }
14 |
15 | enum Section: CaseIterable {
16 | case actions
17 | case numbered
18 |
19 | static func getSection(_ section: Int) -> Section {
20 | return self.allCases[section]
21 | }
22 | }
23 |
24 | enum ActionRow: String, CaseIterable {
25 | case toggle = "Toggle"
26 | case addLog = "Add Log"
27 | case addLine = "Add Line"
28 | case clear = "Clear"
29 | case resize = "Resize"
30 |
31 | static func getActionRow(_ actionRow: Int) -> ActionRow {
32 | return self.allCases[actionRow]
33 | }
34 | }
35 |
36 | extension MainTableData: UITableViewDataSource {
37 | func registerCellsForTableView(_ tableView: UITableView) {
38 | tableView.register(UITableViewCell.self, forCellReuseIdentifier: "default")
39 | }
40 |
41 | func numberOfSections(in tableView: UITableView) -> Int {
42 | return Section.allCases.count
43 | }
44 |
45 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
46 | switch Section.getSection(section) {
47 | case .actions:
48 | return ActionRow.allCases.count
49 | case .numbered:
50 | return 30
51 | }
52 | }
53 |
54 | func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
55 | switch Section.getSection(section) {
56 | case .actions:
57 | return "Actions"
58 | case .numbered:
59 | return "Numbered Rows"
60 | }
61 | }
62 |
63 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
64 | let cell = tableView.dequeueReusableCell(withIdentifier: "default", for: indexPath)
65 | switch Section.getSection(indexPath.section) {
66 | case .actions:
67 | cell.textLabel?.text = ActionRow.getActionRow(indexPath.row).rawValue
68 | case .numbered:
69 | cell.textLabel?.text = "Row \(indexPath.row)"
70 | }
71 | return cell
72 | }
73 | }
74 |
75 | extension MainTableData: UITableViewDelegate {
76 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
77 | switch Section.getSection(indexPath.section) {
78 | case .actions:
79 | didSelectActionRow(atIndexPath: indexPath)
80 | case .numbered:
81 | didSelectNumberedRow(atIndexPath: indexPath)
82 | }
83 | tableView.deselectRow(at: indexPath, animated: true)
84 | }
85 |
86 | func didSelectActionRow(atIndexPath indexPath: IndexPath) {
87 | switch ActionRow.getActionRow(indexPath.row) {
88 | case .addLog:
89 | addLog()
90 | case .toggle:
91 | toggle()
92 | case .addLine:
93 | addLine()
94 | case .clear:
95 | clear()
96 | case .resize:
97 | resize()
98 | }
99 | }
100 |
101 | func didSelectNumberedRow(atIndexPath indexPath: IndexPath) {
102 | TinyConsole.print("Tapped on \(indexPath.row)")
103 | }
104 | }
105 |
106 | extension MainTableData {
107 | @objc func toggle() {
108 | TinyConsole.toggleWindowMode()
109 | }
110 |
111 | @objc func addLog() {
112 | TinyConsole.print("Hello World")
113 | }
114 |
115 | @objc func clear() {
116 | TinyConsole.clear()
117 | }
118 |
119 | @objc func addLine() {
120 | TinyConsole.addLine()
121 | }
122 |
123 | @objc func resize() {
124 | TinyConsole.setHeight(height: CGFloat.random(in: 120..<220))
125 | }
126 | }
127 |
128 |
--------------------------------------------------------------------------------
/TinyConsole/TinyConsoleController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TinyConsoleController.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran Uenal on 28.11.16.
6 | //
7 | //
8 |
9 | import UIKit
10 |
11 | /// This UIViewController holds both, the `rootViewController`
12 | /// of your application and the `consoleViewController`.
13 | open class TinyConsoleController: UIViewController {
14 | /// The kind of window modes that are supported by TinyConsole
15 | ///
16 | /// - collapsed: the console is hidden
17 | /// - expanded: the console is shown
18 | public enum WindowMode {
19 | case collapsed
20 | case expanded
21 | }
22 |
23 | var rootViewController: UIViewController {
24 | didSet {
25 | setupViewControllers()
26 | setupConstraints()
27 | }
28 | }
29 |
30 | // MARK: - Private Properties
31 |
32 | private var animationDuration = 0.25
33 |
34 | private var consoleViewController: TinyConsoleViewController = {
35 | TinyConsoleViewController()
36 | }()
37 |
38 | private lazy var consoleViewHeightConstraint: NSLayoutConstraint? = {
39 | return consoleViewController.view.heightAnchor.constraint(equalToConstant: 0)
40 | }()
41 |
42 | private func updateHeightConstraint() {
43 | consoleViewHeightConstraint?.isActive = false
44 | consoleViewHeightConstraint?.constant = consoleWindowMode == .collapsed ? 0 : consoleHeight
45 | consoleViewHeightConstraint?.isActive = true
46 | }
47 |
48 | // MARK: - Public Properties
49 |
50 | public var consoleHeight: CGFloat = 200 {
51 | didSet {
52 | UIView.animate(withDuration: animationDuration) {
53 | self.updateHeightConstraint()
54 | self.view.layoutIfNeeded()
55 | }
56 | }
57 | }
58 |
59 | public var consoleWindowMode: WindowMode = .collapsed {
60 | didSet {
61 | updateHeightConstraint()
62 | }
63 | }
64 |
65 | // MARK: - Initializer
66 |
67 | init() {
68 | rootViewController = UIViewController()
69 | super.init(nibName: nil, bundle: nil)
70 | }
71 |
72 | public required init?(coder aDecoder: NSCoder) {
73 | assertionFailure("Interface Builder is not supported")
74 | rootViewController = UIViewController()
75 | super.init(coder: aDecoder)
76 | }
77 |
78 | // MARK: - Public Methods
79 |
80 | open override func viewDidLoad() {
81 | super.viewDidLoad()
82 |
83 | setupViewControllers()
84 | setupConstraints()
85 | }
86 |
87 | open override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
88 | if motion == .motionShake {
89 | toggleWindowMode()
90 | }
91 | }
92 |
93 | // MARK: - Private Methods
94 |
95 | internal func toggleWindowMode() {
96 | consoleWindowMode = consoleWindowMode == .collapsed ? .expanded : .collapsed
97 | UIView.animate(withDuration: animationDuration) {
98 | self.view.layoutIfNeeded()
99 | }
100 | }
101 |
102 | private func setupViewControllers() {
103 | removeAllChildren()
104 |
105 | addChild(consoleViewController)
106 | view.addSubview(consoleViewController.view)
107 | consoleViewController.didMove(toParent: self)
108 |
109 | addChild(rootViewController)
110 | view.addSubview(rootViewController.view)
111 | rootViewController.didMove(toParent: self)
112 | }
113 |
114 | private func setupConstraints() {
115 | rootViewController.view.attach(anchor: .top, to: view)
116 |
117 | consoleViewController.view.attach(anchor: .bottom, to: view)
118 | consoleViewHeightConstraint?.isActive = true
119 |
120 | rootViewController.view.bottomAnchor.constraint(equalTo: consoleViewController.view.topAnchor).isActive = true
121 | }
122 | }
123 |
124 |
--------------------------------------------------------------------------------
/TinyConsole/TinyConsole.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TinyConsole.swift
3 | // TinyConsole
4 | //
5 | // Created by Devran Uenal on 28.11.16.
6 | //
7 | //
8 |
9 | import UIKit
10 |
11 | open class TinyConsole {
12 | public static var shared = TinyConsole()
13 | var textView: UITextView?
14 | var consoleController: TinyConsoleController
15 |
16 | static var textAppearance: [NSAttributedString.Key: Any] = {
17 | return [
18 | .font: UIFont(name: "Menlo", size: 12.0),
19 | .foregroundColor: UIColor.white
20 | ].compactMapValues({ $0 })
21 | }()
22 |
23 | private init() {
24 | consoleController = TinyConsoleController()
25 | }
26 |
27 | private lazy var dateFormatter: DateFormatter = {
28 | let formatter = DateFormatter()
29 | formatter.dateStyle = .none
30 | formatter.timeStyle = .medium
31 | return formatter
32 | }()
33 |
34 | private var currentTimeStamp: String {
35 | return dateFormatter.string(from: Date())
36 | }
37 |
38 | // MARK: - Create View Contoller
39 | public static func createViewController(rootViewController: UIViewController) -> UIViewController {
40 | set(rootViewController: rootViewController)
41 | return shared.consoleController
42 | }
43 |
44 | public static func set(rootViewController: UIViewController) {
45 | shared.consoleController.rootViewController = rootViewController
46 | }
47 |
48 | // MARK: - Actions
49 |
50 | public static func scrollToBottom() {
51 | guard let
52 | textView = shared.textView,
53 | textView.boundsHeightLessThenContentSizeHeight() else { return }
54 |
55 | textView.layoutManager.ensureLayout(for: textView.textContainer)
56 | let offset = CGPoint(x: 0, y: (textView.contentSize.height - textView.frame.size.height))
57 | textView.setContentOffset(offset, animated: true)
58 | }
59 |
60 | public static func toggleWindowMode() {
61 | DispatchQueue.main.async {
62 | shared.consoleController.toggleWindowMode()
63 | }
64 | }
65 |
66 | public static func print(_ text: String, color: UIColor = UIColor.white, global: Bool = true) {
67 | let formattedText = NSMutableAttributedString(string: text)
68 | formattedText.addAttributes(textAppearance, range: formattedText.range)
69 | formattedText.addAttribute(.foregroundColor, value: color, range: formattedText.range)
70 |
71 | print(formattedText, global: global)
72 | }
73 |
74 | public static func print(_ text: NSAttributedString, global: Bool = true) {
75 | // When we leave this method and global is true, we want to print it to console
76 | defer {
77 | if global {
78 | Swift.print(text.string)
79 | }
80 | }
81 |
82 | guard let textView = shared.textView else { return }
83 |
84 | DispatchQueue.main.async {
85 | let timeStamped = NSMutableAttributedString(string: "\(shared.currentTimeStamp) ")
86 | let range = NSRange(location: 0, length: timeStamped.length)
87 |
88 | timeStamped.addAttributes(textAppearance, range: range)
89 | timeStamped.append(text)
90 | timeStamped.append(.breakLine())
91 |
92 | let newText = NSMutableAttributedString(attributedString: textView.attributedText)
93 | newText.append(timeStamped)
94 |
95 | textView.attributedText = newText
96 | scrollToBottom()
97 | }
98 | }
99 |
100 | public static func clear() {
101 | DispatchQueue.main.async {
102 | shared.textView?.clear()
103 | scrollToBottom()
104 | }
105 | }
106 |
107 | public static func error(_ text: String) {
108 | print(text, color: UIColor.red)
109 | }
110 |
111 | public static func addLine() {
112 | print("-----------", color: UIColor.red)
113 | }
114 |
115 | public static func setHeight(height: CGFloat) {
116 | shared.consoleController.consoleHeight = height
117 | }
118 | }
119 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # TinyConsole
4 |
5 |
6 |
7 | TinyConsole is a tiny log console to display information while using your iOS app and written in Swift.
8 |
9 | ## Usage
10 |
11 | Wrap your Main ViewController inside of a `TinyConsoleController` like so:
12 |
13 | ```swift
14 | TinyConsole.createViewController(rootViewController: MyMainViewController())
15 | ```
16 |
17 | ### Actions
18 |
19 | #### Hide and Show
20 |
21 | Shake your device to toggle the console.
22 | If you’re using the Simulator, press ⌃ ctrl-⌘ cmd-z.
23 |
24 | #### Console output
25 |
26 | ```swift
27 | // Print message
28 | TinyConsole.print("hello")
29 |
30 | // Print messages any color you want
31 | TinyConsole.print("green text", color: UIColor.green)
32 |
33 | // Print a red error message
34 | TinyConsole.error("something went wrong")
35 |
36 | // Print a marker for orientation
37 | TinyConsole.addLine()
38 |
39 | // Clear console
40 | TinyConsole.clear()
41 | ```
42 |
43 | ## Implementation Example
44 |
45 | Instead of
46 |
47 | ```swift
48 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
49 | window = UIWindow(frame: UIScreen.main.bounds)
50 | window?.rootViewController = MyMainViewController()
51 | window?.makeKeyAndVisible()
52 | return true
53 | }
54 | ```
55 |
56 | write
57 |
58 | ```swift
59 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
60 | window = UIWindow(frame: UIScreen.main.bounds)
61 | window?.rootViewController = TinyConsole.createViewController(rootViewController: MyMainViewController())
62 | window?.makeKeyAndVisible()
63 | return true
64 | }
65 | ```
66 |
67 | alternatively, check out the example project included in this repository.
68 |
69 | ## Demo
70 |
71 |
72 |
73 | ## Requirements
74 |
75 | * Xcode 11
76 | * Swift 5
77 | * iOS 11 or greater
78 |
79 | ## Installation
80 |
81 | ### [Carthage](https://github.com/Carthage/Carthage)
82 |
83 | Add this to your Cartfile:
84 |
85 | ```ruby
86 | github "Cosmo/TinyConsole"
87 | ```
88 |
89 | ### Manually
90 |
91 | Just drag the source files into your project.
92 |
93 | ## Hierarchy
94 |
95 |
96 |
97 | ## Core Team
98 |
99 | - [@Cosmo](https://github.com/Cosmo), Devran "Cosmo" Uenal
100 | - [@mRs-](https://github.com/mRs-), Marius Landwehr
101 | - [@ohitsdaniel](https://github.com/ohitsdaniel), Daniel Peter
102 |
103 | ## Thanks
104 |
105 | Many thanks to [**the contributors**](https://github.com/Cosmo/TinyConsole/graphs/contributors) of this project.
106 |
107 |
108 | ## Contact
109 |
110 | * Devran "Cosmo" Uenal
111 | * Twitter: [@maccosmo](http://twitter.com/maccosmo)
112 | * LinkedIn: [devranuenal](https://www.linkedin.com/in/devranuenal)
113 |
114 | ## Other Projects
115 |
116 | * [BinaryKit](https://github.com/Cosmo/BinaryKit) — BinaryKit helps you to break down binary data into bits and bytes and easily access specific parts.
117 | * [Clippy](https://github.com/Cosmo/Clippy) — Clippy from Microsoft Office is back and runs on macOS! Written in Swift.
118 | * [GrammaticalNumber](https://github.com/Cosmo/GrammaticalNumber) — Turns singular words to the plural and vice-versa in Swift.
119 | * [HackMan](https://github.com/Cosmo/HackMan) — Stop writing boilerplate code yourself. Let hackman do it for you via the command line.
120 | * [ISO8859](https://github.com/Cosmo/ISO8859) — Convert ISO8859 1-16 Encoded Text to String in Swift. Supports iOS, tvOS, watchOS and macOS.
121 | * [SpriteMap](https://github.com/Cosmo/SpriteMap) — SpriteMap helps you to extract sprites out of a sprite map. Written in Swift.
122 | * [StringCase](https://github.com/Cosmo/StringCase) — Converts String to lowerCamelCase, UpperCamelCase and snake_case. Tested and written in Swift.
123 |
124 | ## License
125 |
126 | TinyConsole is released under the [MIT License](http://www.opensource.org/licenses/MIT).
127 |
--------------------------------------------------------------------------------
/TinyConsole.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 450284DE1DFD878C00922381 /* MainTableData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450284DD1DFD878C00922381 /* MainTableData.swift */; };
11 | 455463482341729800F5B78F /* UIViewControllerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455463472341729800F5B78F /* UIViewControllerExtensions.swift */; };
12 | 4554634A2341773600F5B78F /* NSAttributedStringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455463492341773600F5B78F /* NSAttributedStringExtensions.swift */; };
13 | 4554634C23418E6F00F5B78F /* UIButtonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4554634B23418E6F00F5B78F /* UIButtonExtensions.swift */; };
14 | 4554634E2341901F00F5B78F /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 4554634D2341901F00F5B78F /* README.md */; };
15 | 457B894F1DF4DB74001DD49C /* TinyConsole.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4585FDCB1DEC54B800DDF5EB /* TinyConsole.framework */; };
16 | 457B89501DF4DB74001DD49C /* TinyConsole.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4585FDCB1DEC54B800DDF5EB /* TinyConsole.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
17 | 4585FDD81DEC54D300DDF5EB /* TinyConsole.h in Headers */ = {isa = PBXBuildFile; fileRef = 4585FDD61DEC54D300DDF5EB /* TinyConsole.h */; settings = {ATTRIBUTES = (Public, ); }; };
18 | 4585FDDA1DEC552600DDF5EB /* TinyConsoleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4585FDD91DEC552600DDF5EB /* TinyConsoleController.swift */; };
19 | 4585FDDC1DEC557000DDF5EB /* TinyConsole.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4585FDDB1DEC557000DDF5EB /* TinyConsole.swift */; };
20 | 4585FDDE1DEC559D00DDF5EB /* TinyConsoleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4585FDDD1DEC559D00DDF5EB /* TinyConsoleViewController.swift */; };
21 | 4585FDE61DEC58BB00DDF5EB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4585FDE51DEC58BB00DDF5EB /* AppDelegate.swift */; };
22 | 4585FDE81DEC58BB00DDF5EB /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4585FDE71DEC58BB00DDF5EB /* MainViewController.swift */; };
23 | 4585FDED1DEC58BB00DDF5EB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4585FDEC1DEC58BB00DDF5EB /* Assets.xcassets */; };
24 | 4585FDF01DEC58BB00DDF5EB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4585FDEE1DEC58BB00DDF5EB /* LaunchScreen.storyboard */; };
25 | 45A3359A23412FB700F96AFA /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45A3359923412FB700F96AFA /* UIViewExtensions.swift */; };
26 | 45A3359C23416D5A00F96AFA /* UIAlertActionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45A3359B23416D5A00F96AFA /* UIAlertActionExtensions.swift */; };
27 | 45A3359E23416DCA00F96AFA /* UITextViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45A3359D23416DCA00F96AFA /* UITextViewExtensions.swift */; };
28 | /* End PBXBuildFile section */
29 |
30 | /* Begin PBXContainerItemProxy section */
31 | 457B89511DF4DB74001DD49C /* PBXContainerItemProxy */ = {
32 | isa = PBXContainerItemProxy;
33 | containerPortal = 4585FDC01DEC532500DDF5EB /* Project object */;
34 | proxyType = 1;
35 | remoteGlobalIDString = 4585FDCA1DEC54B800DDF5EB;
36 | remoteInfo = TinyConsole;
37 | };
38 | /* End PBXContainerItemProxy section */
39 |
40 | /* Begin PBXCopyFilesBuildPhase section */
41 | 457B89531DF4DB74001DD49C /* Embed Frameworks */ = {
42 | isa = PBXCopyFilesBuildPhase;
43 | buildActionMask = 2147483647;
44 | dstPath = "";
45 | dstSubfolderSpec = 10;
46 | files = (
47 | 457B89501DF4DB74001DD49C /* TinyConsole.framework in Embed Frameworks */,
48 | );
49 | name = "Embed Frameworks";
50 | runOnlyForDeploymentPostprocessing = 0;
51 | };
52 | /* End PBXCopyFilesBuildPhase section */
53 |
54 | /* Begin PBXFileReference section */
55 | 450284DD1DFD878C00922381 /* MainTableData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainTableData.swift; sourceTree = ""; };
56 | 455463472341729800F5B78F /* UIViewControllerExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewControllerExtensions.swift; sourceTree = ""; };
57 | 455463492341773600F5B78F /* NSAttributedStringExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSAttributedStringExtensions.swift; sourceTree = ""; };
58 | 4554634B23418E6F00F5B78F /* UIButtonExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIButtonExtensions.swift; sourceTree = ""; };
59 | 4554634D2341901F00F5B78F /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
60 | 4585FDCB1DEC54B800DDF5EB /* TinyConsole.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TinyConsole.framework; sourceTree = BUILT_PRODUCTS_DIR; };
61 | 4585FDD51DEC54D300DDF5EB /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
62 | 4585FDD61DEC54D300DDF5EB /* TinyConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TinyConsole.h; sourceTree = ""; };
63 | 4585FDD91DEC552600DDF5EB /* TinyConsoleController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TinyConsoleController.swift; sourceTree = ""; };
64 | 4585FDDB1DEC557000DDF5EB /* TinyConsole.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TinyConsole.swift; sourceTree = ""; };
65 | 4585FDDD1DEC559D00DDF5EB /* TinyConsoleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TinyConsoleViewController.swift; sourceTree = ""; };
66 | 4585FDE31DEC58BB00DDF5EB /* TinyConsole-Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TinyConsole-Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
67 | 4585FDE51DEC58BB00DDF5EB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
68 | 4585FDE71DEC58BB00DDF5EB /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; };
69 | 4585FDEC1DEC58BB00DDF5EB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
70 | 4585FDEF1DEC58BB00DDF5EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
71 | 4585FDF11DEC58BB00DDF5EB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
72 | 45A3359923412FB700F96AFA /* UIViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = ""; };
73 | 45A3359B23416D5A00F96AFA /* UIAlertActionExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIAlertActionExtensions.swift; sourceTree = ""; };
74 | 45A3359D23416DCA00F96AFA /* UITextViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITextViewExtensions.swift; sourceTree = ""; };
75 | /* End PBXFileReference section */
76 |
77 | /* Begin PBXFrameworksBuildPhase section */
78 | 4585FDC71DEC54B800DDF5EB /* Frameworks */ = {
79 | isa = PBXFrameworksBuildPhase;
80 | buildActionMask = 2147483647;
81 | files = (
82 | );
83 | runOnlyForDeploymentPostprocessing = 0;
84 | };
85 | 4585FDE01DEC58BB00DDF5EB /* Frameworks */ = {
86 | isa = PBXFrameworksBuildPhase;
87 | buildActionMask = 2147483647;
88 | files = (
89 | 457B894F1DF4DB74001DD49C /* TinyConsole.framework in Frameworks */,
90 | );
91 | runOnlyForDeploymentPostprocessing = 0;
92 | };
93 | /* End PBXFrameworksBuildPhase section */
94 |
95 | /* Begin PBXGroup section */
96 | 4585FDBF1DEC532500DDF5EB = {
97 | isa = PBXGroup;
98 | children = (
99 | 4554634D2341901F00F5B78F /* README.md */,
100 | 4585FDCD1DEC54B800DDF5EB /* TinyConsole */,
101 | 4585FDE41DEC58BB00DDF5EB /* TinyConsole-Example */,
102 | 4585FDCC1DEC54B800DDF5EB /* Products */,
103 | );
104 | sourceTree = "";
105 | };
106 | 4585FDCC1DEC54B800DDF5EB /* Products */ = {
107 | isa = PBXGroup;
108 | children = (
109 | 4585FDCB1DEC54B800DDF5EB /* TinyConsole.framework */,
110 | 4585FDE31DEC58BB00DDF5EB /* TinyConsole-Example.app */,
111 | );
112 | name = Products;
113 | sourceTree = "";
114 | };
115 | 4585FDCD1DEC54B800DDF5EB /* TinyConsole */ = {
116 | isa = PBXGroup;
117 | children = (
118 | 4585FDDB1DEC557000DDF5EB /* TinyConsole.swift */,
119 | 4585FDD91DEC552600DDF5EB /* TinyConsoleController.swift */,
120 | 4585FDDD1DEC559D00DDF5EB /* TinyConsoleViewController.swift */,
121 | 45A3359F23416DF800F96AFA /* Extensions */,
122 | 4585FDD41DEC54D300DDF5EB /* Supporting Files */,
123 | );
124 | path = TinyConsole;
125 | sourceTree = "";
126 | };
127 | 4585FDD41DEC54D300DDF5EB /* Supporting Files */ = {
128 | isa = PBXGroup;
129 | children = (
130 | 4585FDD51DEC54D300DDF5EB /* Info.plist */,
131 | 4585FDD61DEC54D300DDF5EB /* TinyConsole.h */,
132 | );
133 | path = "Supporting Files";
134 | sourceTree = "";
135 | };
136 | 4585FDE41DEC58BB00DDF5EB /* TinyConsole-Example */ = {
137 | isa = PBXGroup;
138 | children = (
139 | 4585FDE51DEC58BB00DDF5EB /* AppDelegate.swift */,
140 | 4585FDE71DEC58BB00DDF5EB /* MainViewController.swift */,
141 | 450284DD1DFD878C00922381 /* MainTableData.swift */,
142 | 45A3359823412D2D00F96AFA /* Supporting Files */,
143 | );
144 | path = "TinyConsole-Example";
145 | sourceTree = "";
146 | };
147 | 45A3359823412D2D00F96AFA /* Supporting Files */ = {
148 | isa = PBXGroup;
149 | children = (
150 | 4585FDEC1DEC58BB00DDF5EB /* Assets.xcassets */,
151 | 4585FDEE1DEC58BB00DDF5EB /* LaunchScreen.storyboard */,
152 | 4585FDF11DEC58BB00DDF5EB /* Info.plist */,
153 | );
154 | name = "Supporting Files";
155 | sourceTree = "";
156 | };
157 | 45A3359F23416DF800F96AFA /* Extensions */ = {
158 | isa = PBXGroup;
159 | children = (
160 | 45A3359923412FB700F96AFA /* UIViewExtensions.swift */,
161 | 45A3359B23416D5A00F96AFA /* UIAlertActionExtensions.swift */,
162 | 45A3359D23416DCA00F96AFA /* UITextViewExtensions.swift */,
163 | 455463472341729800F5B78F /* UIViewControllerExtensions.swift */,
164 | 455463492341773600F5B78F /* NSAttributedStringExtensions.swift */,
165 | 4554634B23418E6F00F5B78F /* UIButtonExtensions.swift */,
166 | );
167 | path = Extensions;
168 | sourceTree = "";
169 | };
170 | /* End PBXGroup section */
171 |
172 | /* Begin PBXHeadersBuildPhase section */
173 | 4585FDC81DEC54B800DDF5EB /* Headers */ = {
174 | isa = PBXHeadersBuildPhase;
175 | buildActionMask = 2147483647;
176 | files = (
177 | 4585FDD81DEC54D300DDF5EB /* TinyConsole.h in Headers */,
178 | );
179 | runOnlyForDeploymentPostprocessing = 0;
180 | };
181 | /* End PBXHeadersBuildPhase section */
182 |
183 | /* Begin PBXNativeTarget section */
184 | 4585FDCA1DEC54B800DDF5EB /* TinyConsole */ = {
185 | isa = PBXNativeTarget;
186 | buildConfigurationList = 4585FDD11DEC54B800DDF5EB /* Build configuration list for PBXNativeTarget "TinyConsole" */;
187 | buildPhases = (
188 | 4585FDC61DEC54B800DDF5EB /* Sources */,
189 | 4585FDC71DEC54B800DDF5EB /* Frameworks */,
190 | 4585FDC81DEC54B800DDF5EB /* Headers */,
191 | 4585FDC91DEC54B800DDF5EB /* Resources */,
192 | );
193 | buildRules = (
194 | );
195 | dependencies = (
196 | );
197 | name = TinyConsole;
198 | productName = TinyConsole;
199 | productReference = 4585FDCB1DEC54B800DDF5EB /* TinyConsole.framework */;
200 | productType = "com.apple.product-type.framework";
201 | };
202 | 4585FDE21DEC58BB00DDF5EB /* TinyConsole-Example */ = {
203 | isa = PBXNativeTarget;
204 | buildConfigurationList = 4585FDF21DEC58BB00DDF5EB /* Build configuration list for PBXNativeTarget "TinyConsole-Example" */;
205 | buildPhases = (
206 | 4585FDDF1DEC58BB00DDF5EB /* Sources */,
207 | 4585FDE01DEC58BB00DDF5EB /* Frameworks */,
208 | 4585FDE11DEC58BB00DDF5EB /* Resources */,
209 | 457B89531DF4DB74001DD49C /* Embed Frameworks */,
210 | );
211 | buildRules = (
212 | );
213 | dependencies = (
214 | 457B89521DF4DB74001DD49C /* PBXTargetDependency */,
215 | );
216 | name = "TinyConsole-Example";
217 | productName = "TinyConsole-Example";
218 | productReference = 4585FDE31DEC58BB00DDF5EB /* TinyConsole-Example.app */;
219 | productType = "com.apple.product-type.application";
220 | };
221 | /* End PBXNativeTarget section */
222 |
223 | /* Begin PBXProject section */
224 | 4585FDC01DEC532500DDF5EB /* Project object */ = {
225 | isa = PBXProject;
226 | attributes = {
227 | LastSwiftUpdateCheck = 0810;
228 | LastUpgradeCheck = 1110;
229 | TargetAttributes = {
230 | 4585FDCA1DEC54B800DDF5EB = {
231 | CreatedOnToolsVersion = 8.1;
232 | LastSwiftMigration = 1110;
233 | ProvisioningStyle = Automatic;
234 | };
235 | 4585FDE21DEC58BB00DDF5EB = {
236 | CreatedOnToolsVersion = 8.1;
237 | LastSwiftMigration = 1110;
238 | ProvisioningStyle = Manual;
239 | };
240 | };
241 | };
242 | buildConfigurationList = 4585FDC31DEC532500DDF5EB /* Build configuration list for PBXProject "TinyConsole" */;
243 | compatibilityVersion = "Xcode 3.2";
244 | developmentRegion = en;
245 | hasScannedForEncodings = 0;
246 | knownRegions = (
247 | en,
248 | Base,
249 | );
250 | mainGroup = 4585FDBF1DEC532500DDF5EB;
251 | productRefGroup = 4585FDCC1DEC54B800DDF5EB /* Products */;
252 | projectDirPath = "";
253 | projectRoot = "";
254 | targets = (
255 | 4585FDCA1DEC54B800DDF5EB /* TinyConsole */,
256 | 4585FDE21DEC58BB00DDF5EB /* TinyConsole-Example */,
257 | );
258 | };
259 | /* End PBXProject section */
260 |
261 | /* Begin PBXResourcesBuildPhase section */
262 | 4585FDC91DEC54B800DDF5EB /* Resources */ = {
263 | isa = PBXResourcesBuildPhase;
264 | buildActionMask = 2147483647;
265 | files = (
266 | 4554634E2341901F00F5B78F /* README.md in Resources */,
267 | );
268 | runOnlyForDeploymentPostprocessing = 0;
269 | };
270 | 4585FDE11DEC58BB00DDF5EB /* Resources */ = {
271 | isa = PBXResourcesBuildPhase;
272 | buildActionMask = 2147483647;
273 | files = (
274 | 4585FDF01DEC58BB00DDF5EB /* LaunchScreen.storyboard in Resources */,
275 | 4585FDED1DEC58BB00DDF5EB /* Assets.xcassets in Resources */,
276 | );
277 | runOnlyForDeploymentPostprocessing = 0;
278 | };
279 | /* End PBXResourcesBuildPhase section */
280 |
281 | /* Begin PBXSourcesBuildPhase section */
282 | 4585FDC61DEC54B800DDF5EB /* Sources */ = {
283 | isa = PBXSourcesBuildPhase;
284 | buildActionMask = 2147483647;
285 | files = (
286 | 4585FDDA1DEC552600DDF5EB /* TinyConsoleController.swift in Sources */,
287 | 4554634A2341773600F5B78F /* NSAttributedStringExtensions.swift in Sources */,
288 | 4585FDDE1DEC559D00DDF5EB /* TinyConsoleViewController.swift in Sources */,
289 | 45A3359A23412FB700F96AFA /* UIViewExtensions.swift in Sources */,
290 | 45A3359C23416D5A00F96AFA /* UIAlertActionExtensions.swift in Sources */,
291 | 4585FDDC1DEC557000DDF5EB /* TinyConsole.swift in Sources */,
292 | 4554634C23418E6F00F5B78F /* UIButtonExtensions.swift in Sources */,
293 | 45A3359E23416DCA00F96AFA /* UITextViewExtensions.swift in Sources */,
294 | 455463482341729800F5B78F /* UIViewControllerExtensions.swift in Sources */,
295 | );
296 | runOnlyForDeploymentPostprocessing = 0;
297 | };
298 | 4585FDDF1DEC58BB00DDF5EB /* Sources */ = {
299 | isa = PBXSourcesBuildPhase;
300 | buildActionMask = 2147483647;
301 | files = (
302 | 450284DE1DFD878C00922381 /* MainTableData.swift in Sources */,
303 | 4585FDE81DEC58BB00DDF5EB /* MainViewController.swift in Sources */,
304 | 4585FDE61DEC58BB00DDF5EB /* AppDelegate.swift in Sources */,
305 | );
306 | runOnlyForDeploymentPostprocessing = 0;
307 | };
308 | /* End PBXSourcesBuildPhase section */
309 |
310 | /* Begin PBXTargetDependency section */
311 | 457B89521DF4DB74001DD49C /* PBXTargetDependency */ = {
312 | isa = PBXTargetDependency;
313 | target = 4585FDCA1DEC54B800DDF5EB /* TinyConsole */;
314 | targetProxy = 457B89511DF4DB74001DD49C /* PBXContainerItemProxy */;
315 | };
316 | /* End PBXTargetDependency section */
317 |
318 | /* Begin PBXVariantGroup section */
319 | 4585FDEE1DEC58BB00DDF5EB /* LaunchScreen.storyboard */ = {
320 | isa = PBXVariantGroup;
321 | children = (
322 | 4585FDEF1DEC58BB00DDF5EB /* Base */,
323 | );
324 | name = LaunchScreen.storyboard;
325 | sourceTree = "";
326 | };
327 | /* End PBXVariantGroup section */
328 |
329 | /* Begin XCBuildConfiguration section */
330 | 4585FDC41DEC532500DDF5EB /* Debug */ = {
331 | isa = XCBuildConfiguration;
332 | buildSettings = {
333 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
334 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
335 | CLANG_WARN_BOOL_CONVERSION = YES;
336 | CLANG_WARN_COMMA = YES;
337 | CLANG_WARN_CONSTANT_CONVERSION = YES;
338 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
339 | CLANG_WARN_EMPTY_BODY = YES;
340 | CLANG_WARN_ENUM_CONVERSION = YES;
341 | CLANG_WARN_INFINITE_RECURSION = YES;
342 | CLANG_WARN_INT_CONVERSION = YES;
343 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
344 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
345 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
346 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
347 | CLANG_WARN_STRICT_PROTOTYPES = YES;
348 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
349 | CLANG_WARN_UNREACHABLE_CODE = YES;
350 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
351 | ENABLE_STRICT_OBJC_MSGSEND = YES;
352 | ENABLE_TESTABILITY = YES;
353 | GCC_NO_COMMON_BLOCKS = YES;
354 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
355 | GCC_WARN_ABOUT_RETURN_TYPE = YES;
356 | GCC_WARN_UNDECLARED_SELECTOR = YES;
357 | GCC_WARN_UNINITIALIZED_AUTOS = YES;
358 | GCC_WARN_UNUSED_FUNCTION = YES;
359 | GCC_WARN_UNUSED_VARIABLE = YES;
360 | ONLY_ACTIVE_ARCH = YES;
361 | };
362 | name = Debug;
363 | };
364 | 4585FDC51DEC532500DDF5EB /* Release */ = {
365 | isa = XCBuildConfiguration;
366 | buildSettings = {
367 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
368 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
369 | CLANG_WARN_BOOL_CONVERSION = YES;
370 | CLANG_WARN_COMMA = YES;
371 | CLANG_WARN_CONSTANT_CONVERSION = YES;
372 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
373 | CLANG_WARN_EMPTY_BODY = YES;
374 | CLANG_WARN_ENUM_CONVERSION = YES;
375 | CLANG_WARN_INFINITE_RECURSION = YES;
376 | CLANG_WARN_INT_CONVERSION = YES;
377 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
378 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
379 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
381 | CLANG_WARN_STRICT_PROTOTYPES = YES;
382 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
383 | CLANG_WARN_UNREACHABLE_CODE = YES;
384 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
385 | ENABLE_STRICT_OBJC_MSGSEND = YES;
386 | GCC_NO_COMMON_BLOCKS = YES;
387 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
388 | GCC_WARN_ABOUT_RETURN_TYPE = YES;
389 | GCC_WARN_UNDECLARED_SELECTOR = YES;
390 | GCC_WARN_UNINITIALIZED_AUTOS = YES;
391 | GCC_WARN_UNUSED_FUNCTION = YES;
392 | GCC_WARN_UNUSED_VARIABLE = YES;
393 | };
394 | name = Release;
395 | };
396 | 4585FDD21DEC54B800DDF5EB /* Debug */ = {
397 | isa = XCBuildConfiguration;
398 | buildSettings = {
399 | ALWAYS_SEARCH_USER_PATHS = NO;
400 | CLANG_ANALYZER_NONNULL = YES;
401 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
402 | CLANG_CXX_LIBRARY = "libc++";
403 | CLANG_ENABLE_MODULES = YES;
404 | CLANG_ENABLE_OBJC_ARC = YES;
405 | CLANG_WARN_BOOL_CONVERSION = YES;
406 | CLANG_WARN_CONSTANT_CONVERSION = YES;
407 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
408 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
409 | CLANG_WARN_EMPTY_BODY = YES;
410 | CLANG_WARN_ENUM_CONVERSION = YES;
411 | CLANG_WARN_INFINITE_RECURSION = YES;
412 | CLANG_WARN_INT_CONVERSION = YES;
413 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
414 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
415 | CLANG_WARN_UNREACHABLE_CODE = YES;
416 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
417 | CODE_SIGN_IDENTITY = "";
418 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
419 | COPY_PHASE_STRIP = NO;
420 | CURRENT_PROJECT_VERSION = 1;
421 | DEBUG_INFORMATION_FORMAT = dwarf;
422 | DEFINES_MODULE = YES;
423 | DEVELOPMENT_TEAM = "";
424 | DYLIB_COMPATIBILITY_VERSION = 1;
425 | DYLIB_CURRENT_VERSION = 1;
426 | DYLIB_INSTALL_NAME_BASE = "@rpath";
427 | ENABLE_STRICT_OBJC_MSGSEND = YES;
428 | ENABLE_TESTABILITY = YES;
429 | GCC_C_LANGUAGE_STANDARD = gnu99;
430 | GCC_DYNAMIC_NO_PIC = NO;
431 | GCC_NO_COMMON_BLOCKS = YES;
432 | GCC_OPTIMIZATION_LEVEL = 0;
433 | GCC_PREPROCESSOR_DEFINITIONS = (
434 | "DEBUG=1",
435 | "$(inherited)",
436 | );
437 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
438 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
439 | GCC_WARN_UNDECLARED_SELECTOR = YES;
440 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
441 | GCC_WARN_UNUSED_FUNCTION = YES;
442 | GCC_WARN_UNUSED_VARIABLE = YES;
443 | INFOPLIST_FILE = "$(SRCROOT)/TinyConsole/Supporting Files/Info.plist";
444 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
445 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
446 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
447 | MARKETING_VERSION = 2.0.1;
448 | MTL_ENABLE_DEBUG_INFO = YES;
449 | ONLY_ACTIVE_ARCH = YES;
450 | PRODUCT_BUNDLE_IDENTIFIER = com.devranuenal.TinyConsole;
451 | PRODUCT_NAME = "$(TARGET_NAME)";
452 | SDKROOT = iphoneos;
453 | SKIP_INSTALL = YES;
454 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
455 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
456 | SWIFT_VERSION = 5.0;
457 | TARGETED_DEVICE_FAMILY = "1,2";
458 | VERSIONING_SYSTEM = "apple-generic";
459 | VERSION_INFO_PREFIX = "";
460 | };
461 | name = Debug;
462 | };
463 | 4585FDD31DEC54B800DDF5EB /* Release */ = {
464 | isa = XCBuildConfiguration;
465 | buildSettings = {
466 | ALWAYS_SEARCH_USER_PATHS = NO;
467 | CLANG_ANALYZER_NONNULL = YES;
468 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
469 | CLANG_CXX_LIBRARY = "libc++";
470 | CLANG_ENABLE_MODULES = YES;
471 | CLANG_ENABLE_OBJC_ARC = YES;
472 | CLANG_WARN_BOOL_CONVERSION = YES;
473 | CLANG_WARN_CONSTANT_CONVERSION = YES;
474 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
475 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
476 | CLANG_WARN_EMPTY_BODY = YES;
477 | CLANG_WARN_ENUM_CONVERSION = YES;
478 | CLANG_WARN_INFINITE_RECURSION = YES;
479 | CLANG_WARN_INT_CONVERSION = YES;
480 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
481 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
482 | CLANG_WARN_UNREACHABLE_CODE = YES;
483 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
484 | CODE_SIGN_IDENTITY = "";
485 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
486 | COPY_PHASE_STRIP = NO;
487 | CURRENT_PROJECT_VERSION = 1;
488 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
489 | DEFINES_MODULE = YES;
490 | DEVELOPMENT_TEAM = "";
491 | DYLIB_COMPATIBILITY_VERSION = 1;
492 | DYLIB_CURRENT_VERSION = 1;
493 | DYLIB_INSTALL_NAME_BASE = "@rpath";
494 | ENABLE_NS_ASSERTIONS = NO;
495 | ENABLE_STRICT_OBJC_MSGSEND = YES;
496 | GCC_C_LANGUAGE_STANDARD = gnu99;
497 | GCC_NO_COMMON_BLOCKS = YES;
498 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
499 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
500 | GCC_WARN_UNDECLARED_SELECTOR = YES;
501 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
502 | GCC_WARN_UNUSED_FUNCTION = YES;
503 | GCC_WARN_UNUSED_VARIABLE = YES;
504 | INFOPLIST_FILE = "$(SRCROOT)/TinyConsole/Supporting Files/Info.plist";
505 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
506 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
507 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
508 | MARKETING_VERSION = 2.0.1;
509 | MTL_ENABLE_DEBUG_INFO = NO;
510 | PRODUCT_BUNDLE_IDENTIFIER = com.devranuenal.TinyConsole;
511 | PRODUCT_NAME = "$(TARGET_NAME)";
512 | SDKROOT = iphoneos;
513 | SKIP_INSTALL = YES;
514 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
515 | SWIFT_VERSION = 5.0;
516 | TARGETED_DEVICE_FAMILY = "1,2";
517 | VALIDATE_PRODUCT = YES;
518 | VERSIONING_SYSTEM = "apple-generic";
519 | VERSION_INFO_PREFIX = "";
520 | };
521 | name = Release;
522 | };
523 | 4585FDF31DEC58BB00DDF5EB /* Debug */ = {
524 | isa = XCBuildConfiguration;
525 | buildSettings = {
526 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
527 | ALWAYS_SEARCH_USER_PATHS = NO;
528 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
529 | CLANG_ANALYZER_NONNULL = YES;
530 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
531 | CLANG_CXX_LIBRARY = "libc++";
532 | CLANG_ENABLE_MODULES = YES;
533 | CLANG_ENABLE_OBJC_ARC = YES;
534 | CLANG_WARN_BOOL_CONVERSION = YES;
535 | CLANG_WARN_CONSTANT_CONVERSION = YES;
536 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
537 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
538 | CLANG_WARN_EMPTY_BODY = YES;
539 | CLANG_WARN_ENUM_CONVERSION = YES;
540 | CLANG_WARN_INFINITE_RECURSION = YES;
541 | CLANG_WARN_INT_CONVERSION = YES;
542 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
543 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
544 | CLANG_WARN_UNREACHABLE_CODE = YES;
545 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
546 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
547 | COPY_PHASE_STRIP = NO;
548 | DEBUG_INFORMATION_FORMAT = dwarf;
549 | DEVELOPMENT_TEAM = "";
550 | ENABLE_STRICT_OBJC_MSGSEND = YES;
551 | ENABLE_TESTABILITY = YES;
552 | GCC_C_LANGUAGE_STANDARD = gnu99;
553 | GCC_DYNAMIC_NO_PIC = NO;
554 | GCC_NO_COMMON_BLOCKS = YES;
555 | GCC_OPTIMIZATION_LEVEL = 0;
556 | GCC_PREPROCESSOR_DEFINITIONS = (
557 | "DEBUG=1",
558 | "$(inherited)",
559 | );
560 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
561 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
562 | GCC_WARN_UNDECLARED_SELECTOR = YES;
563 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
564 | GCC_WARN_UNUSED_FUNCTION = YES;
565 | GCC_WARN_UNUSED_VARIABLE = YES;
566 | INFOPLIST_FILE = "TinyConsole-Example/Info.plist";
567 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
568 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
569 | MTL_ENABLE_DEBUG_INFO = YES;
570 | ONLY_ACTIVE_ARCH = YES;
571 | PRODUCT_BUNDLE_IDENTIFIER = "com.devranuenal.TinyConsole-Example";
572 | PRODUCT_NAME = "$(TARGET_NAME)";
573 | SDKROOT = iphoneos;
574 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
575 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
576 | SWIFT_SWIFT3_OBJC_INFERENCE = Default;
577 | SWIFT_VERSION = 5.0;
578 | TARGETED_DEVICE_FAMILY = "1,2";
579 | };
580 | name = Debug;
581 | };
582 | 4585FDF41DEC58BB00DDF5EB /* Release */ = {
583 | isa = XCBuildConfiguration;
584 | buildSettings = {
585 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
586 | ALWAYS_SEARCH_USER_PATHS = NO;
587 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
588 | CLANG_ANALYZER_NONNULL = YES;
589 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
590 | CLANG_CXX_LIBRARY = "libc++";
591 | CLANG_ENABLE_MODULES = YES;
592 | CLANG_ENABLE_OBJC_ARC = YES;
593 | CLANG_WARN_BOOL_CONVERSION = YES;
594 | CLANG_WARN_CONSTANT_CONVERSION = YES;
595 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
596 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
597 | CLANG_WARN_EMPTY_BODY = YES;
598 | CLANG_WARN_ENUM_CONVERSION = YES;
599 | CLANG_WARN_INFINITE_RECURSION = YES;
600 | CLANG_WARN_INT_CONVERSION = YES;
601 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
602 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
603 | CLANG_WARN_UNREACHABLE_CODE = YES;
604 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
605 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
606 | COPY_PHASE_STRIP = NO;
607 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
608 | DEVELOPMENT_TEAM = "";
609 | ENABLE_NS_ASSERTIONS = NO;
610 | ENABLE_STRICT_OBJC_MSGSEND = YES;
611 | GCC_C_LANGUAGE_STANDARD = gnu99;
612 | GCC_NO_COMMON_BLOCKS = YES;
613 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
614 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
615 | GCC_WARN_UNDECLARED_SELECTOR = YES;
616 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
617 | GCC_WARN_UNUSED_FUNCTION = YES;
618 | GCC_WARN_UNUSED_VARIABLE = YES;
619 | INFOPLIST_FILE = "TinyConsole-Example/Info.plist";
620 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
621 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
622 | MTL_ENABLE_DEBUG_INFO = NO;
623 | PRODUCT_BUNDLE_IDENTIFIER = "com.devranuenal.TinyConsole-Example";
624 | PRODUCT_NAME = "$(TARGET_NAME)";
625 | SDKROOT = iphoneos;
626 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
627 | SWIFT_SWIFT3_OBJC_INFERENCE = Default;
628 | SWIFT_VERSION = 5.0;
629 | TARGETED_DEVICE_FAMILY = "1,2";
630 | VALIDATE_PRODUCT = YES;
631 | };
632 | name = Release;
633 | };
634 | /* End XCBuildConfiguration section */
635 |
636 | /* Begin XCConfigurationList section */
637 | 4585FDC31DEC532500DDF5EB /* Build configuration list for PBXProject "TinyConsole" */ = {
638 | isa = XCConfigurationList;
639 | buildConfigurations = (
640 | 4585FDC41DEC532500DDF5EB /* Debug */,
641 | 4585FDC51DEC532500DDF5EB /* Release */,
642 | );
643 | defaultConfigurationIsVisible = 0;
644 | defaultConfigurationName = Release;
645 | };
646 | 4585FDD11DEC54B800DDF5EB /* Build configuration list for PBXNativeTarget "TinyConsole" */ = {
647 | isa = XCConfigurationList;
648 | buildConfigurations = (
649 | 4585FDD21DEC54B800DDF5EB /* Debug */,
650 | 4585FDD31DEC54B800DDF5EB /* Release */,
651 | );
652 | defaultConfigurationIsVisible = 0;
653 | defaultConfigurationName = Release;
654 | };
655 | 4585FDF21DEC58BB00DDF5EB /* Build configuration list for PBXNativeTarget "TinyConsole-Example" */ = {
656 | isa = XCConfigurationList;
657 | buildConfigurations = (
658 | 4585FDF31DEC58BB00DDF5EB /* Debug */,
659 | 4585FDF41DEC58BB00DDF5EB /* Release */,
660 | );
661 | defaultConfigurationIsVisible = 0;
662 | defaultConfigurationName = Release;
663 | };
664 | /* End XCConfigurationList section */
665 | };
666 | rootObject = 4585FDC01DEC532500DDF5EB /* Project object */;
667 | }
668 |
--------------------------------------------------------------------------------