{"id":21065039,"url":"https://github.com/prolificinteractive/simcoe","last_synced_at":"2025-10-06T02:47:30.646Z","repository":{"id":52875048,"uuid":"54046743","full_name":"prolificinteractive/simcoe","owner":"prolificinteractive","description":"A simple, light analytics framework for iOS.","archived":false,"fork":false,"pushed_at":"2021-04-15T14:45:24.000Z","size":436,"stargazers_count":19,"open_issues_count":4,"forks_count":8,"subscribers_count":23,"default_branch":"master","last_synced_at":"2025-10-03T13:48:24.267Z","etag":null,"topics":["adobe","analytics","analytics-providers","analytics-tracking","carthage","cocoapods","mparticle","podfile","protocol","protocol-oriented","providers-simcoe","subspecs","track-analytics"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prolificinteractive.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-03-16T16:06:41.000Z","updated_at":"2023-05-12T16:43:48.000Z","dependencies_parsed_at":"2022-08-23T11:40:13.856Z","dependency_job_id":null,"html_url":"https://github.com/prolificinteractive/simcoe","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/prolificinteractive/simcoe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prolificinteractive%2Fsimcoe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prolificinteractive%2Fsimcoe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prolificinteractive%2Fsimcoe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prolificinteractive%2Fsimcoe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prolificinteractive","download_url":"https://codeload.github.com/prolificinteractive/simcoe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prolificinteractive%2Fsimcoe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278551497,"owners_count":26005386,"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","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["adobe","analytics","analytics-providers","analytics-tracking","carthage","cocoapods","mparticle","podfile","protocol","protocol-oriented","providers-simcoe","subspecs","track-analytics"],"created_at":"2024-11-19T17:53:16.180Z","updated_at":"2025-10-06T02:47:30.610Z","avatar_url":"https://github.com/prolificinteractive.png","language":"Swift","readme":"![Simcoe](Images/Simcoe_logo.jpg)\n\n[![Travis build status](https://img.shields.io/travis/prolificinteractive/simcoe.svg?style=flat-square)](https://travis-ci.org/prolificinteractive/simcoe)\n[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/Simcoe.svg?style=flat-square)](https://img.shields.io/cocoapods/v/Simcoe.svg)\n[![Platform](https://img.shields.io/cocoapods/p/Simcoe.svg?style=flat-square)](http://cocoadocs.org/docsets/Simcoe)\n[![Docs](https://img.shields.io/cocoapods/metrics/doc-percent/Simcoe.svg?style=flat-square)](http://cocoadocs.org/docsets/Simcoe)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\n## Description\n\nA light analytics wrapper aimed at making analytics implementation \u0026 debugging as simple and\nstreamlined as possible -- especially for projects utilizing multiple analytics providers.\n\n## Requirements\n\nSimcoe is written in Swift and utilizes dynamic frameworks for its implementation. As such, this\nlibrary requires:\n\n* Xcode 8 or greater\n* iOS 8 or greater\n\n## Installation\n\nSimcoe is made up of a core framework with additional plugins available for a variety of different analytics providers.\n\n### CocoaPods\nSimcoe is available through [CocoaPods](http://cocoapods.org). To install\nit, simply add the following line to your `Podfile`:\n\n```ruby\npod \"Simcoe\"\n```\n\nThis will give you the core SDK with the default debugging capabilities right out of the box. However, you\nwill be responsible for creating the analytics provider. Simcoe comes with a variety of provider implementations\nright out of the box, however, that can reduce the amount of work you need to do to get started. Simply include the relevant subspec in your Podfile; for instance, if your project was using Adobe Omniture to\ntrack analytics, simply specify the subspec in your project's Podfile:\n\n``\npod 'Simcoe', :subspecs =\u003e ['Adobe']\n``\n\n### Carthage\nYou can also add Simcoe to your project using [Carthage](https://github.com/Carthage/Carthage). Add the following to your `Cartfile`:\n\n```ruby\ngithub \"prolificinteractive/Simcoe\"\n```\n\n## Included Providers\n\nSimcoe comes with default implementations for a wide-variety of providers right out of the box:\n\n* [Adobe](Simcoe/Adobe/README.md)\n* [mParticle](Simcoe/mParticle/README.md)\n* [Mixpanel](Simcoe/Mixpanel/README.md)\n\n\n## Usage\n\nUsing Simcoe is simple. At the start of your application's lifecycle, simply begin running Simcoe with the providers you wish to use:\n\n`Simcoe.run(with: Adobe())`\n\nIf you do not yet know which analytics tool your project will be using, that's fine! Simply start Simcoe without arguments:\n\n`Simcoe.run()`\n\nBy default, if Simcoe is not given any providers, it will automatically create a default provider to use as a placeholder. This allows you to implement, track, and debug analytics without a provider. Then, when your\nprovider changes, simply update your `run()` call with the providers and that's it!\n\nTo facilitate debugging when using multiple providers, Simcoe contains a few options for updating the information logged in the console:\n\n* verbose\n* simple\n* none\n\nBy default, Simcoe will log all console outputs in detail (*verbose*) providing one line per item for **each** provider that was specified. *simple* will output one line per item regardless of how many providers were specified while *none* will disable all console logging. To update the *outputOption,* simply call (update this property after the `run()` command): \n\n`Simcoe.engine.tracker.outputOption = .simple`\n\nSimcoe providers a base function call for each major analytics action right out of the gate, giving a consistent API to all of your analytics tracking. For instance, to track page views:\n\n``\nSimcoe.track(pageView: \"Home Screen\")\n``\n\nThat's it! Simcoe will automatically call all of your analytics providers and request that they log that page view. This same method is uniform and consistent, no matter what providers you are using.\n\n\n### Creating an Analytics Provider\n\nWhile Simcoe comes with some analytics implementations right out of the box, sometimes you will need to roll your own. The Simcoe API makes it easy for anyone to do.\n\n#### AnalyticsTracking\n\nFirst, all analytics trackers implement this base protocol: `AnalyticsTracking`. This protocol is the only that is needed for any object to be considered a valid analytics tracker to Simcoe. This protocol allows you to define a user-readable name for your provider as well as the ability to begin or handle any setup work that your tracker requires.\n\nWhile simply implementing this protocol is all you need for your object to be a valid analytics tracker, you won't be able to do too much with it. This is because Simcoe utilizes an array of various different protocols, each one giving defining the functionality needed to handle that API event. These protocols are:\n\n* `CartLogging`\n* `CheckoutTracking`\n* `ErrorLogging`\n* `EventTracking`\n* `LifetimeValueTracking`\n* `LocationTracking`\n* `PageViewTracking`\n* `PurchaseTracking`\n* `SuperPropertyTracking`\n* `TimedEventTracking`\n* `UserAttributeTracking`\n* `ViewDetailLogging`\n\nSo for your analytics provider to be able to handle page views in the Simcoe framework, your provider should implement the `PageViewTracking` protocol. This plug-and-play API allows you to define what you want your provider to handle at a very granular level. If your provider only needs to implement location tracking and nothing else, then you need only implement the `LocationTracking` protocol (as well as the `AnalyticsTracking` protocol, of course); all other protocols are optional. This allows you full customization as to how your objects respond to Simcoe.\n\n#### Additional Tracking\n\nEach analytics implementation is different, and Simcoe doesn't expect to be the be-all, end-all of analytics implementations. What if you need to track something that is not included in the base SDK?\n\nUltimately, all tracking calls in `Simcoe` are forwarded to the default singleton: `Simcoe.engine` which publicly exposes the one tracking method: `write`. This function takes an array of all objects, a description\nof the event, and a closure to actually do the write event. Using this method will allow you to handle any type of custom analytics work you may need to do while also continuing to utilize the powerful debug and logging\ntools provided by the Simcoe framework.\n\nLet's say, for example, you are using Sqweeblytics to track the amount of Sqweebles in your application. This is clearly unique behavior, but it's important analytics data.\n\nAll you would need to do is wrap your Sqweeblytics provider in the Simcoe engine:\n\n```\nSimcoe.engine.write(toProviders: [Sqweeblytics()],\n    description: \"Tracks all of the user's sqweebles.\",\n    action: { sqweeblytics in\n        sqweeblytics.track()\n        return .Success\n})\n```\n\nThat's it! You are now able to properly track your sqweebles while continuing to utilize the Simcoe engine.\n\n## Contributing to Simcoe\n\nTo report a bug or enhancement request, feel free to file an issue under the respective heading.\n\nIf you wish to contribute to the project, fork this repo and submit a pull request. Code contributions should follow the standards specified in the [Prolific Swift Style Guide](https://github.com/prolificinteractive/swift-style-guide).\n\n## License\n\n![prolific](https://s3.amazonaws.com/prolificsitestaging/logos/Prolific_Logo_Full_Color.png)\n\nCopyright (c) 2017 Prolific Interactive\n\nSimcoe is maintained and sponsored by Prolific Interactive. It may be redistributed under the terms specified in the [LICENSE] file.\n\n[LICENSE]: ./LICENSE\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprolificinteractive%2Fsimcoe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprolificinteractive%2Fsimcoe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprolificinteractive%2Fsimcoe/lists"}