Skip to content

ヽ༼ಠل͜ಠ༽ノ Harlow is an advanced iOS In App logging & debugging 🐛 framework written in Swift, with comprehensive logs for Analytics, Networking, Errors, Crashes and Print logs

License

stanwood/Harlow

Repository files navigation

banner

Swift Version iOS 10+ Maintainability Build Status Debugging and testing iOS applications can be quite a long task due to the nature of Software Development. Harlow tool provides reach information on Analytics, Errors, Logging, Networking, and UITesting to simplify this process.

Demo Harlow

Table of contents

Author

Tal Zion tal.zion@stanwood.io

Installation

pod 'Harlow', :configurations => ['Debug'] # Make sure to only use Harlow for development only.

Usage

#if DEBUG
import Harlow
#endif

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    #if DEBUG
    lazy var debugger: Harlow = Harlow()
    #endif

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        #if DEBUG
        debugger.isEnabled = true
        #endif
    }
}

Other options

debugger.isDebuggingDataPersistenceEneabled = true /// Enables local data persistance
debugger.enabledServices: [Service] = [.logs, .errors] /// The services you would like to enable. Default is se to `allCases`
debugger.tintColor = .red /// Change the tint color
debugger.errorCodesExceptions = [4097] /// Add error code exceptions
debugger.isShakeEnabled = true // Defaults to `true`. When this is `true`, shaking the device will enable/disable the Debugger
debugger.isEnabled = true

Adding logs

Analytics

Option 1.

Set up your tracking payload:

public func payload() -> [String:String] {

    var payload: [String:String] = ["eventName": eventName]

    if let itemId = itemId {
        payload["itemId"] = itemId
    }

    if let category = category {
        payload["category"] = category
    }

    if let contentType = contentType {
        payload["contentType"] = contentType
    }

    if let screenName = screenName {
        payload["screenName"] = screenName
    }

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

    payload["createdAt"] = dateFormatter.string(from: Date())

    return payload
}

Post it to:

func post(_ payload: [String:String]) {
    let notificationCentre = NotificationCenter.default
    let notification = Notification.init(name: Notification.Name(rawValue: "io.stanwood.debugger.didReceiveAnalyticsItem"), object: nil, userInfo: payload)
    notificationCentre.post(notification)
}
Option 2.

Use StanwoodAnalytics as your tracking framework

#if DEBUG
analyticsBuilder = analyticsBuilder.setDebuggerNotifications(enabled: true)
#endif

Networking

Harlow works by default with URLSessiosn.shared and request are beeing logged for free. You can also register a custom condiguration:

let configuration = URLSessionConfiguration.waitsForConnectivity

debugger.regsiter(custom: configuration)

/// Use with URLSession || any networking libraries such as Alamofire and Moya
let session = URLSession(configuration: configuration)

Module

Error

Harlow will log NSError by default. To add log exceptions:

debugger.errorCodesExceptions = [4097] /// Add error code exceptions

Logs

Harlow will log print && debugPrint by default.

Configuration:

  1. Create a new Bridging-Header file and add -DEBUG suffix

logs-1

  1. Import Harlow
@import Harlow;

Note: Make sure to add any other imported libraries from your main header file

  1. Set Bridging-Header-DEBUG.h in the relevant configurations in the build settings.

logs-3

Crashes

Harlow will log Signal and NSException crashes by default.

Licence

Harlow is under MIT licence. See the LICENSE file for more info.

Changelog

A brief summary of each Harlow release can be found in the CHANGELOG.