{"id":32149278,"url":"https://github.com/theappcapital/siriusrating-ios","last_synced_at":"2025-10-21T09:52:23.747Z","repository":{"id":59080890,"uuid":"535267744","full_name":"theappcapital/SiriusRating-iOS","owner":"theappcapital","description":"⭐️ A non-invasive and friendly way to remind users to review or rate an iOS app.","archived":false,"fork":false,"pushed_at":"2024-10-19T18:55:24.000Z","size":1254,"stargazers_count":26,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-21T09:51:58.797Z","etag":null,"topics":["app","ios","library","rating","ratings","review","review-tools","reviews","stars","swift","utility"],"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/theappcapital.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":"2022-09-11T10:50:06.000Z","updated_at":"2025-09-03T20:13:17.000Z","dependencies_parsed_at":"2022-09-11T21:44:06.244Z","dependency_job_id":null,"html_url":"https://github.com/theappcapital/SiriusRating-iOS","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/theappcapital/SiriusRating-iOS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theappcapital%2FSiriusRating-iOS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theappcapital%2FSiriusRating-iOS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theappcapital%2FSiriusRating-iOS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theappcapital%2FSiriusRating-iOS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theappcapital","download_url":"https://codeload.github.com/theappcapital/SiriusRating-iOS/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theappcapital%2FSiriusRating-iOS/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280240305,"owners_count":26296527,"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-21T02:00:06.614Z","response_time":58,"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":["app","ios","library","rating","ratings","review","review-tools","reviews","stars","swift","utility"],"created_at":"2025-10-21T09:52:18.369Z","updated_at":"2025-10-21T09:52:23.741Z","avatar_url":"https://github.com/theappcapital.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/a9db4fb3-3e8c-4caa-85f4-c74857d135a0\" height=\"128\"\u003e\n  \u003ch1 align=\"center\"\u003eSiriusRating iOS\u003c/h1\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e See: https://github.com/theappcapital/SiriusRating-Android for Android.\u003c/p\u003e\n\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Ftheappcapital%2FSiriusRating-iOS%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/theappcapital/SiriusRating-iOS)\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Ftheappcapital%2FSiriusRating-iOS%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/theappcapital/SiriusRating-iOS)\n[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/SiriusRating.svg?style=flat-square)](https://img.shields.io/cocoapods/v/SiriusRating.svg)\n[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat-square)](https://github.com/Carthage/Carthage)\n[![Swift Package Manager](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat-square)](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat-square)\n\n\u003cimg width=\"1012\" alt=\"github-banner\" src=\"https://github.com/user-attachments/assets/bc28d818-bf8e-4b67-8dd1-1b11d8622f72\"\u003e\n\nA non-invasive and friendly way to remind users to review and rate an iOS app.\n\n## Features\n\n- [x] Supports 32 languages\n- [x] Unit tested\n- [x] Dark mode compatibility\n- [x] Supports SwiftUI and UIKit\n- [x] Configurable rating conditions\n- [x] Write your own rating conditions to further stimulate positive reviews.\n- [x] Modern, sleek design\n- [x] Non-invasive prompts\n- [x] Configurable recurring prompts with back-off factors\n- [x] Create custom prompt styles\n\n## Requirements\n- iOS 13.0+\n\n## Setup\nConfigure a SiriusRating shared instance, typically in your AppDelegate or your app's initializer.\n\n### Simple One-line Setup\n\nIn the ``application(_:didFinishLaunchingWithOptions:)`` function in AppDelegate:\n```swift\nSiriusRating.setup()\n```\n\nFor example:\n```swift\n//...\nfunc application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -\u003e Bool {\n    //...\n    SiriusRating.setup()\n\n    return true\n}\n```\n\nBy default, the user will be prompted to rate the app when the following conditions are met:\n\n- The app has been `installed for at least 30 days`,\n- The user has `opened the app at least 15 times`, and\n- The user has `completed 20 significant events`.\n\nIf the user selects 'Remind me later,' they will be prompted again after 7 days.\nIf the user declines the prompt, they will be prompted again after 30 days, with a back-off factor of 2. This means that if the user declines a second time, they will be prompted again in 60 days, a third time in 120 days, and so on.\n\n## Installation\n\n### CocoaPods\n\nTo integrate SiriusRating into your Xcode project using CocoaPods, specify it in your `Podfile`:\n\n```ruby\npod 'SiriusRating'\n```\n\n### Carthage\n\nTo integrate SiriusRating into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"theappcapital/SiriusRating-iOS\"\n```\n\n### Swift Package Manager\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/theappcapital/SiriusRating-iOS.git\", .upToNextMajor(from: \"1.0.8\"))\n]\n```\n\n## Usage\n\n### Significant event\nA significant event defines an important event that occurred in your app. In a time tracking app it might be \nthat a user registered a time entry. In a game, it might be completing a level.\n\n```swift\nSiriusRating.shared.userDidSignificantEvent()\n```\n\nSiriusRating will validate the conditions after each significant event and prompt the user if all conditions are satisfied.\n\n### Test request prompt \nTo see how the request prompt will look like in your app simply use the following code.\n\n```swift\n// For test purposes only.\nSiriusRating.shared.showRequestPrompt()\n```\n\n## Styles\n\n| StyleOneRequestPromptPresenter (light, default) | StyleOneRequestPromptPresenter (dark, default) |\n| --- | --- |\n| ![Style One (light)](https://user-images.githubusercontent.com/1652432/191007601-d2338460-605a-44c1-bb1a-de7079a091ac.png) | ![Style One (dark)](https://user-images.githubusercontent.com/1652432/191007744-f09c8d7e-2085-4258-bf92-807261a96444.png) |\n\n| StyleTwoRequestPromptPresenter (light) | StyleTwoRequestPromptPresenter (dark) |\n| --- | --- |\n| ![Style Two (light)](https://user-images.githubusercontent.com/1652432/191008227-39384b11-fd1c-4e75-a435-cdb8a4d92a1b.png) | ![Style Two (dark)](https://user-images.githubusercontent.com/1652432/191008116-9bb2e298-cfc1-41fd-99ff-2645a855a9fb.png) |\n\n## Rating conditions\n\nThe rating conditions are used to validate if the user can be prompted to rate the app. The validation process happens after the user did a significant event (`userDidSignificantEvent()`) or if configured when the app was opened. The user will be prompted to rate the app if all rating conditions are\nsatisfied (returning `true`).\n\n| Rating Condition                             | Description                                                                                                                                                                                     |\n|----------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `EnoughAppSessionsRatingCondition`           | Validates whether the app has been launched or brought into the foreground a sufficient number of times.                                                                                        |\n| `EnoughDaysUsedRatingCondition`              | Validates whether the app has been in use for a sufficient duration (in days).                                                                                                                  |\n| `EnoughSignificantEventsRatingCondition`     | Validates whether the user has completed enough significant events.                                                                                                                             |\n| `NotDeclinedToRateAnyVersionRatingCondition` | Validates that the user hasn’t declined to rate any version of the app. If declined, it checks whether enough time has passed since the initial decline before prompting again.                 |\n| `NotPostponedDueToReminderRatingCondition`   | Validates whether the user has opted to be reminded later. If so, it checks if the required number of days has passed to prompt again.                                                          |\n| `NotRatedCurrentVersionRatingCondition`      | Validates whether the user has already rated the current version of the app. The user won’t be prompted again if they’ve already rated this version.                                            |\n| `NotRatedAnyVersionRatingCondition`          | Validates that the user hasn’t rated any version of the app. If the user has previously rated the app, it checks whether enough time has passed since their last rating before prompting again. |\n\n## Customization\n\n### Custom Configuration\n\n```swift\nSiriusRating.setup(\n    requestPromptPresenter: StyleTwoRequestPromptPresenter(),\n    debugEnabled: true,\n    ratingConditions: [\n        EnoughDaysUsedRatingCondition(totalDaysRequired = 0),\n        EnoughAppSessionsRatingCondition(totalAppSessionsRequired = 0),\n        EnoughSignificantEventsRatingCondition(significantEventsRequired = 5),\n        // Essential rating conditions below: Ensure these are included to prevent the prompt from appearing continuously.\n        NotPostponedDueToReminderRatingCondition(totalDaysBeforeReminding: 14),\n        NotDeclinedToRateAnyVersionRatingCondition(daysAfterDecliningToPromptUserAgain: 30, backOffFactor: 2.0, maxRecurringPromptsAfterDeclining: 2),\n        NotRatedCurrentVersionRatingCondition(),\n        NotRatedAnyVersionRatingCondition(daysAfterRatingToPromptUserAgain: 240, maxRecurringPromptsAfterRating: UInt.max)\n    ],\n    canPromptUserToRateOnLaunch: true,\n    didOptInForReminderHandler: {\n        //...\n    },\n    didDeclineToRateHandler: {\n        //...\n    },\n    didRateHandler: {\n        //...\n    }\n)\n```\n\n### Custom rating conditions\n\nYou can write your own rating conditions in addition to the current rating conditions to further stimulate positive reviews. \n\n```swift\nclass GoodWeatherRatingCondition: RatingCondition {\n\n    private let weatherRepository: WeatherRepository\n    \n    init(weatherRepository: WeatherRepository) {\n        self.weatherRepository = weatherRepository\n    }\n    \n    func isSatisfied(dataStore: DataStore) -\u003e Bool {\n        // Only show the rating prompt when it's sunny outside.\n        return self.weatherRepository.getWeather().isSunny\n    }\n    \n}\n```\n\nTo make use of the new rating condition simply add it to list.\n\n```swift\nSiriusRating.setup(\n    ratingConditions: [\n        //...,\n        GoodWeatherRatingCondition(weatherRepository: WeatherDataRepository())\n    ]\n)\n```\n\nYou can change the presenter to the style you wish.\n```swift\nSiriusRating.setup(\n    requestPromptPresenter: StyleTwoRequestPromptPresenter()\n)\n```\n\n### Change texts\nYou can change the texts by giving the presenter a bundle that contains your custom localized strings.\n\n```swift\nSiriusRating.setup(\n    requestPromptPresenter: StyleOneRequestPromptPresenter(localizationsBundle: Bundle.main)\n)\n```\n\nThen you can change the texts in your localizable strings file, for example in: `Localizable.strings`.\n\n```swift\n// ...\n\"request_prompt_title\" = \"Rate %@\";\n\"request_prompt_duration\" = \"(duration: less than 10 seconds)\";\n\"request_prompt_description\" = \"If you enjoy using %@, would you mind taking a moment to rate it? Thanks for your support!\";\n\"request_prompt_rate_button_text\" = \"Rate %@\";\n\"request_prompt_dont_rate_button_text\" = \"No, thanks\";\n\"request_prompt_opt_in_for_reminder_button_text\" = \"Remind me later\";\n```\n\n### Change tint color\nSiriusRating will automatically use the global tint color.\n```swift\nUIView.appearance().tintColor = .red\n```\nOr you can set it manually.\n```swift\nSiriusRating.setup(\n    requestPromptPresenter: StyleOneRequestPromptPresenter(tintColor: .red)\n)\n```\n\n### Change app name\nSiriusRating will automatically use the app's display name in the localized texts. If you don't want to use this name you can set it manually.\n```swift\nSiriusRating.setup(\n    requestPromptPresenter: StyleOneRequestPromptPresenter(appName: \"App Name\")\n)\n```\n\n## License\n\nSiriusRating is released under the MIT license. [See LICENSE](https://github.com/theappcapital/SiriusRating/blob/master/LICENSE) for details.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheappcapital%2Fsiriusrating-ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheappcapital%2Fsiriusrating-ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheappcapital%2Fsiriusrating-ios/lists"}