├── 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 |  text 2 | 3 | # TinyConsole 4 | 5 | Platform iOS Carthage compatible License MIT 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 |  text 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 |  text 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 | --------------------------------------------------------------------------------