Skip to content

A toolkit to make debugging iOS applications easier πŸš€

License

Notifications You must be signed in to change notification settings

mmackowiak/DebugSwift

Β 
Β 

Repository files navigation

DebugSwift

DebugSwift is a comprehensive toolkit designed to simplify and enhance the debugging process for Swift-based applications. Whether you're troubleshooting issues or optimizing performance, DebugSwift provides a set of powerful features to make your debugging experience more efficient.

image1 image2 image3 image4 image5 image6 image11

Features

App Settings

  • Crash Reports: Access detailed crash reports for analysis and debugging.
  • Change Location: Simulate different locations for testing location-based features.
  • Console: Monitor and interact with the application's console logs.
  • Custom Info: Add custom information for quick access during debugging.
  • Version: View the current application version.
  • Build: Identify the application's build number.
  • Bundle Name: Retrieve the application's bundle name.
  • Bundle ID: Display the unique bundle identifier for the application.
  • Device Infos: Access information about the device running the application.

Interface

  • Grid: Overlay a grid on the interface to assist with layout alignment.
  • Slow Animations: Slow down animations for better visualization and debugging.
  • Showing Touches: Highlight touch events for easier interaction tracking.
  • Colorized View with Borders: Apply colorization and borders to views for improved visibility.

Network Logs

  • All Response/Request Logs: Capture and review detailed logs of all network requests and responses.

Performance

  • CPU, Memory, FPS, Memory Leak Detector: Monitor and analyze CPU usage, memory consumption, and frames per second in real-time.

Resources

  • Keychain: Inspect and manage data stored in the keychain.
  • User Defaults: View and modify user defaults for testing different application states.
  • Files: Access and analyze files stored by the application.

Getting Started

Installation

CocoaPods

Add the following line to your Podfile:

pod 'DebugSwift', :git => 'https://github.com/DebugSwift/DebugSwift.git', :branch => 'main'

Then, run:

pod install

Swift Package Manager (SPM)

Add the following dependency to your Package.swift file:

.package(url: "https://github.com/DebugSwift/DebugSwift.git", from: "main")

Then, add "DebugSwift" to your target's dependencies.

Usage

func application(
    _: UIApplication,
    didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    DebugSwift.setup()
    DebugSwift.show()

    return true
}

Usage to show or hide with shake.

extension UIWindow {
    open override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        super.motionEnded(motion, with: event)
        
        if motion == .motionShake {
            DebugSwift.toggle()
        }
    }
}

Customization

Network Configuration

If you want to ignore specific URLs, use the following code:

DebugSwift.Network.ignoredURLs = ["https://reqres.in/api/users/23"]

If you want to capture only a specific URL, use the following code:

DebugSwift.Network.onlyURLs = ["https://reqres.in/api/users/23"]

Adjust the URLs in the arrays according to your needs.

App Custom Data

DebugSwift.App.customInfo = {
    [
        .init(
            title: "Info 1",
            infos: [
                .init(title: "title 1", subtitle: "title 2")
            ]
        )
    ]
}

Results:

image5


App Custom Action

DebugSwift.App.customAction = {
    [
        .init(
            title: "Action 1",
            actions: [
                .init(title: "action 1") { [weak self] in // Important if use self
                    print("Action 1")
                }
            ]
        )
    ]
}

Results:

image6


App Custom ViewControllers in Tab Bar

DebugSwift.App.customControllers = {
    let controller1 = UITableViewController()
    controller1.title = "Custom TableVC 1"

    let controller2 = UITableViewController()
    controller2.title = "Custom TableVC 2"
    return [controller1, controller2]
}

Hide or disable Some Features

If you prefer to selectively disable certain features, DebugSwift can now deactivate unnecessary functionalities. This can assist you in development across various environments.

Usage

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

    DebugSwift.setup(
        // Main features
        hideFeatures: [
            .network,
            .resources, 
            .performance, 
            .interface, 
            .app
        ],
        // Swizzle features
        disable: [
            .network,
            .location, 
            .views, 
            .crashManager, 
            .leaksDetector, 
            .console
        ]
    )
    DebugSwift.show()

    return true
}

Results:

image9


Collect Memory Leaks

Get the data from memory leaks in the app.

Usage

DebugSwift.Performance.LeakDetector.onDetect { data in
    // If you want to send data to some analytics

    print(data.message) // Retuns the name of the class and the error
    print(data.controller) // If is an controller leak
    print(data.view) // If is an view leak
    print(data.isDeallocation) // If is an deallocation of leak (good for false/positive)
}

Results:

image12


Change Appearance

Dynamic Theme: Easily Change the Interface Appearance from Dark to Light, Customize According to Your Needs.

Usage

func application(
    _: UIApplication,
    didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    DebugSwift.theme(appearance: .light)
    DebugSwift.setup()
    DebugSwift.show()

    return true
}

Results:

image7


Enhanced Hierarchy Tree for Deeper Application Insights (Beta)

Harness the Power of Visual Information within the iOS Hierarchy Tree to Uncover Intricate Layouts and Element Relationships in Your Application.

How to Use

Simply press and hold the circle button to reveal the Snapshot and Hierarchy for a comprehensive overview.

Results:

image8

Explore Additional Details

Enhance your understanding by pressing and holding on a specific view to reveal information such as:

  • Class
  • Subviews
  • Background Color
  • Specific attributes based on the type (e.g., UILabel: Text, Font, and TextColor).

Results:

image10


Fixing Errors

Alamofire

Not called uploadProgress

In the AppDelegate.

class AppDelegate {
    func application(
        _: UIApplication,
        didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]? = nil
    ) -> Bool {
        DebugSwift.setup()
        DebugSwift.show()

        // Call this method
        DebugSwift.Network.delegate = self
        return true
    }
}

And conform with the protocol:

extension AppDelegate: CustomHTTPProtocolDelegate {
    func urlSession(
        _ protocol: URLProtocol,
        _ session: URLSession,
        task: URLSessionTask,
        didSendBodyData bytesSent: Int64,
        totalBytesSent: Int64,
        totalBytesExpectedToSend: Int64
    ) {

        Session.default.session.getAllTasks { tasks in
            let uploadTask = tasks.first(where: { $0.taskIdentifier == task.taskIdentifier }) ?? task
            Session.default.rootQueue.async {
                Session.default.delegate.urlSession(
                    session,
                    task: uploadTask,
                    didSendBodyData: bytesSent,
                    totalBytesSent: totalBytesSent,
                    totalBytesExpectedToSend: totalBytesExpectedToSend
                )
            }
        }
    }
}

⭐ Support the Project by Leaving a Star!

Thank you for visiting our project! If you find our work helpful and would like to support us, please consider giving us a ⭐ star on GitHub. Your support is crucial for us to continue improving and adding new features.

Why Should You Star the Project?

  • Show Your Support: Let us know that you appreciate our efforts.
  • Increase Visibility: Help others discover this project.
  • Stay Updated: Get notifications on updates and new releases.
  • Motivate Us: Encouragement from the community keeps us going!

How to Leave a Star

  1. Log in to your GitHub account.
  2. Navigate to the top of this repository page.
  3. Click on the "Star" button located at the top-right corner.

Every star counts and makes a difference. Thank you for your support! 😊

GitHub stars


Contributors

Our contributors have made this project possible. Thank you!

Contributing

Contributions are welcome! If you have suggestions, improvements, or bug fixes, please submit a pull request. Let's make DebugSwift even more powerful together!


Repo Activity

Alt

Star History

Star History Chart


License

DebugSwift is licensed under the MIT License - see the LICENSE file for details.

References

About

A toolkit to make debugging iOS applications easier πŸš€

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 99.9%
  • Ruby 0.1%