{"id":881,"url":"https://github.com/square/Aardvark","last_synced_at":"2025-07-30T19:33:14.226Z","repository":{"id":33029610,"uuid":"36665193","full_name":"square/Aardvark","owner":"square","description":"Aardvark is a library that makes it dead simple to create actionable bug reports.","archived":false,"fork":false,"pushed_at":"2024-01-20T00:08:47.000Z","size":10465,"stargazers_count":256,"open_issues_count":14,"forks_count":49,"subscribers_count":23,"default_branch":"master","last_synced_at":"2024-04-14T15:19:56.378Z","etag":null,"topics":["bug-reporting","ios","logging"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/square.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"Contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2015-06-01T14:14:36.000Z","updated_at":"2024-04-14T13:31:14.000Z","dependencies_parsed_at":"2023-02-12T08:00:45.336Z","dependency_job_id":"282460b0-5099-47b4-8fdb-2f718831f0cb","html_url":"https://github.com/square/Aardvark","commit_stats":{"total_commits":393,"total_committers":35,"mean_commits":"11.228571428571428","dds":0.3638676844783715,"last_synced_commit":"9f1c64d78b5c1b08bece9e394e7e0ad1008b282e"},"previous_names":[],"tags_count":55,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/square%2FAardvark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/square%2FAardvark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/square%2FAardvark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/square%2FAardvark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/square","download_url":"https://codeload.github.com/square/Aardvark/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":215182659,"owners_count":15840912,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bug-reporting","ios","logging"],"created_at":"2024-01-05T20:15:33.773Z","updated_at":"2024-08-13T13:30:18.361Z","avatar_url":"https://github.com/square.png","language":"Objective-C","funding_links":[],"categories":["Code Quality"],"sub_categories":["Other free courses","Getting Started"],"readme":"# Aardvark\n\n[![CI Status](https://img.shields.io/github/actions/workflow/status/square/aardvark/ci.yml?branch=master)](https://github.com/square/Aardvark/actions?query=workflow%3ACI+branch%3Amaster)\n[![Carthage Compatibility](https://img.shields.io/badge/carthage-✓-e2c245.svg)](https://github.com/Carthage/Carthage/)\n[![License](https://img.shields.io/cocoapods/l/Aardvark.svg)](https://cocoapods.org/pods/Aardvark)\n[![Platform](https://img.shields.io/cocoapods/p/Aardvark.svg)](https://cocoapods.org/pods/Aardvark)\n\n[![Aardvark Version](https://img.shields.io/cocoapods/v/Aardvark.svg?label=Aardvark)](https://cocoapods.org/pods/Aardvark)\n[![CoreAardvark Version](https://img.shields.io/cocoapods/v/CoreAardvark.svg?label=CoreAardvark)](https://cocoapods.org/pods/CoreAardvark)\n[![AardvarkLoggingUI Version](https://img.shields.io/cocoapods/v/AardvarkLoggingUI.svg?label=AardvarkLoggingUI)](https://cocoapods.org/pods/AardvarkLoggingUI)\n[![AardvarkMailUI Version](https://img.shields.io/cocoapods/v/AardvarkMailUI.svg?label=AardvarkMailUI)](https://cocoapods.org/pods/AardvarkMailUI)\n\nAardvark makes it dead simple to create actionable bug reports.\n\nAardvark is made up of a collection of frameworks that provide different bug reporting and logging components.\n\n* **CoreAardvark** - The core structures for Aardvark. Safe to run in app extensions.\n* **Aardvark** - The core tools for building a bug report.\n* **AardvarkMailUI** - A bug reporter implementation that sends the bug report via an email composer.\n* **AardvarkLoggingUI** - UI components for viewing Aardvark logs in an iOS app.\n\n## Getting Started\n\nThere are only three steps to get Aardvark logging and bug reporting up and running.\n\n### 1) Install Aardvark\n\nThe easiest way to get Aardvark up and running is to add a dependency on the AardvarkMailUI framework.\n\n#### Using [CocoaPods](https://cocoapods.org)\n\n```\npod 'AardvarkMailUI'\n```\n\n#### Using [Carthage](https://github.com/Carthage/Carthage)\n\n```\ngithub \"Square/Aardvark\"\n```\n\n#### Using Git Submodules\n\nManually checkout the submodule with `git submodule add git@github.com:Square/Aardvark.git`, drag Aardvark.xcodeproj to your project, and add AardvarkMailUI as a build dependency.\n\n### 2) Set up email bug reporting with a single method call\n\nIt is best to do this when you load your application’s UI.\n\nIn Swift:\n\n```swift\nAardvark.addDefaultBugReportingGestureWithEmailBugReporter(withRecipient:)\n```\n\nIn Objective-C:\n\n```objc\n[Aardvark addDefaultBugReportingGestureWithEmailBugReporterWithRecipient:]\n```\n\n### 3) Replace calls to `print` with `log`.\n\nIn Swift, replace calls to `print` with `log`. In Objective-C, replace calls to `NSLog` with `ARKLog`.\n\n## Reporting Bugs\n\nAfter doing the above, your users can report a bug by making a two-finger long-press gesture. This gesture triggers a UIAlert asking the user what went wrong. When the user enters this information, an email bug report is generated complete with an attached app screenshot and a text file containing the last 2000 logs. Screenshots are created and stored within Aardvark and do not require camera roll access.\n\n[![Bug Report Flow](BugReportFlow.gif)](BugReportFlow.gif)\n\nWant to look at logs on device? Add the AardvarkLoggingUI framework as a dependency and push an instance of [ARKLogTableViewController](Sources/AardvarkLoggingUI/Log%20Viewing/ARKLogTableViewController.h) onto the screen to view your logs.\n\n## Performance\n\nLogs are distributed to loggers on an internal background queue that will never slow down your app. Logs observed by the log store are incrementally appended to disk and not stored in memory.\n\n## Exception Logging\n\nTo turn on logging of uncaught exceptions, call `ARKEnableLogOnUncaughtException()`. When an uncaught exception occurs, the stack trace will be logged to the default log distributor. To test this out in the sample app, hold one finger down on the screen for at least 5 seconds.\n\nOnce the exception is logged, it will be propogated to any existing uncaught exception handler. By default, the exception will be logged to the default log distributor. To log to a different distributor, call `ARKEnableLogOnUncaughtExceptionToLogDistributor(...)`. You can enable logging to multiple log distributors by calling the method multiple times.\n\n## Customize Aardvark\n\nWant to customize how bug reports are filed? Pass your own object conforming to the [ARKBugReporter](Sources/Aardvark/Bug%20Reporting/ARKBugReporter.h) protocol and the desired subclass of `UIGestureRecognizer` to `[Aardvark addBugReporter:triggeringGestureRecognizerClass:]`. You can further customize how bug reports will be triggered by modifying the returned gesture recognizer.\n\nWant to change how logs are formatted? Or use different log files for different features? Or send your logs to third party services? Check out the [logging documentation](Documentation/Logging.md).\n\nWant to log with Aardvark but don’t want to use Aardvark’s bug reporting tool? Change the dependency to be on `Aardvark` and skip step #2 in the Getting Started guide.\n\n## Extensions\n\n* [AardvarkReveal](https://github.com/cashapp/AardvarkReveal) provides components for generating a bug report attachment containing a [Reveal](https://revealapp.com/) file, which can be a huge help in debugging UI issues.\n* [AardvarkCrashReport](https://github.com/cashapp/AardvarkCrashReport) provides components for generating a bug report attachment containing a crash report, either from a crash on the prior app launch or a live report showing the current state of each thread.\n\n## Requirements\n\n* Xcode 14.0 or later\n* iOS 14.0 or later\n* watchOS 7.0 or later\n\n## Contributing\n\nWe’re glad you’re interested in Aardvark, and we’d love to see where you take it. Please read our [contributing guidelines](Contributing.md) prior to submitting a Pull Request.\n\nThanks, and happy logging!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsquare%2FAardvark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsquare%2FAardvark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsquare%2FAardvark/lists"}