Appirater - A utility that reminds your iPhone app's users to review the app.

Related tags

App Store appirater
Overview

Introduction

Appirater is a class that you can drop into any iPhone app (iOS 4.0 or later) that will help remind your users to review your app on the App Store. The code is released under the MIT/X11, so feel free to modify and share your changes with the world. Read on below for how to get started. If you need any help using, the library, post your questions on Stack Overflow under the appirater tag.

Getting Started

CocoaPods

To add Appirater to your app, add pod "Appirater" to your Podfile.

Configuration

  1. Appirater provides class methods to configure its behavior. See [Appirater.h] Appirater.h for more information.
[Appirater setAppId:@"552035781"];
[Appirater setDaysUntilPrompt:1];
[Appirater setUsesUntilPrompt:10];
[Appirater setSignificantEventsUntilPrompt:-1];
[Appirater setTimeBeforeReminding:2];
[Appirater setDebug:YES];
  1. Call [Appirater setAppId:@"yourAppId"] with the app id provided by Apple. A good place to do this is at the beginning of your app delegate's application:didFinishLaunchingWithOptions: method.
  2. Call [Appirater appLaunched:YES] at the end of your app delegate's application:didFinishLaunchingWithOptions: method.
  3. Call [Appirater appEnteredForeground:YES] in your app delegate's applicationWillEnterForeground: method.
  4. (OPTIONAL) Call [Appirater userDidSignificantEvent:YES] when the user does something 'significant' in the app.

Development

Setting [Appirater setDebug:YES] will ensure that the rating request is shown each time the app is launched.

Production

Make sure you set [Appirater setDebug:NO] to ensure the request is not shown every time the app is launched. Also make sure that each of these components are set in the application:didFinishLaunchingWithOptions: method.

This example states that the rating request is only shown when the app has been launched 5 times and after 7 days.

[Appirater setAppId:@"770699556"];
[Appirater setDaysUntilPrompt:7];
[Appirater setUsesUntilPrompt:5];
[Appirater setSignificantEventsUntilPrompt:-1];
[Appirater setTimeBeforeReminding:2];
[Appirater setDebug:NO];
[Appirater appLaunched:YES];

If you wanted to show the request after 5 days only you can set the following:

[Appirater setAppId:@"770699556"];
[Appirater setDaysUntilPrompt:5];
[Appirater setUsesUntilPrompt:0];
[Appirater setSignificantEventsUntilPrompt:-1];
[Appirater setTimeBeforeReminding:2];
[Appirater setDebug:NO];
[Appirater appLaunched:YES];

SKStoreReviewController

In iOS 10.3, SKStoreReviewController was introduced which allows rating directly within the app without any additional setup.

Appirater automatically uses SKStoreReviewController if available. You'll need to manually link StoreKit in your App however.

If SKStoreReviewController is used, Appirater is used only to decide when to show the rating dialog to the user. Keep in mind, that SKStoreReviewController automatically limits the number of impressions, so the dialog might be displayed less frequently than your configured conditions might suggest.

License

Copyright 2017. [Arash Payan] arash. This library is distributed under the terms of the MIT/X11.

While not required, I greatly encourage and appreciate any improvements that you make to this library be contributed back for the benefit of all who use Appirater.

Ports for other SDKs

A few people have ported Appirater to other SDKs. The ports are listed here in hopes that they may assist developers of those SDKs. I don't know how closesly (if at all) they track the Objective-C version of Appirater. If you need support for any of the libraries, please contact the maintainer of the port.

Comments
  • Problem during sending app to App Store -

    Problem during sending app to App Store - "The binary is invalid. A symbolic link resolves link outside of the binary"

    Hi,

    the app works without problem, however when sending to App Store, I get this error.

    I am using Apppirater as part of my project workspace using cocoapods. Any hints? screen shot 2013-09-12 at 11 13 16 pm

    Thanks!

    Jindrich

    opened by sarsonj 19
  • Review Page blank on iOS [Redacted]

    Review Page blank on iOS [Redacted]

    Though the link still works on iOS 6, iOS [REDACTED] redirects to a blank page. Do you think this is temporary, or is Apple removing the direct link to the review page?

    opened by coneybeare 19
  • Use SKStoreProductViewController for in-app rating (feature request)

    Use SKStoreProductViewController for in-app rating (feature request)

    Hi,

    Starting from iOS 6, it's possible to show an iTunes controller within the app with the SKITunesProductViewController class.

    I believe this could be used to rate the app. This means the user wouldn't need to abandon the app being rated in order to rate it.

    Implementing this wouldn't be trivial, since we need to push the view controller. I believe we would need to make some changes to the delegate protocol:

    1. We need to get the view controller that will be used to push and dismiss the modal controller. If the user doesn't implement this delegate method, we may fall back to jumping to the iTunes URL.

    2. We need to let the delegate know when we're pushing a view controller (e.g. so a game can pause) and when we're dismissing it (e.g. so a game can unpause).

    3. We may need to ask the delegate if we should push with animations enabled or not, as pushing with animations can be troublesome in some (rare) cases.

    Thoughts?

    Regards,

    opened by fernandonf 10
  • Move lproj directories to Appirater.bundle when using CocoaPods

    Move lproj directories to Appirater.bundle when using CocoaPods

    Issues

    When using Appirater via CocoaPods, the lproj directories are copied to the root of the main bundle. This causes two issues:

    1. They conflict with any localization in the main app.
    2. The App Store detects these localized bundles and assumes the app is fully localized into all 25+ languages Appirater supports. These Google results suggest this affects more than 1000 apps.

    Solution

    CocoaPods recommends setting spec.resource_bundles instead of spec.resources to avoid the collision from issue 1. To support this use case, the code checks if Appirater.bundle exists. If it does, it uses the string table from that bundle. If it doesn’t exist, which will be the case if the developer is using Appirater via a submodule or other method, then the main bundle will be used, as it is today.

    Caveat

    This is not backwards-compatible for users who have provided custom strings via their own AppiraterLocalizable.strings. These users must call the new method [Appirater setAlwaysUseMainBundle:YES]. To maintain semantic versioning, Appirater’s major version number should be incremented (e.g., it should become 2.0) after this is merged.

    Note for those wishing to work around the second issue before this is merged.

    You can use the Podspec from this pull request locally:

    pod 'Appirater', :podspec => 'Vendor/Appirater.podspec'
    

    You’ll need to manually create/copy AppiraterLocalizable.strings to any localized bundle(s) you have.

    opened by eager 9
  • Problem when app moves to background

    Problem when app moves to background

    If the UIAlertView is present and the user moves the app to the background, Appirater gets stuck in a vicious circle of briefly presenting the alert and then dismissing it.

    As a brute force measure, I am simply cycling through subviews from applicationDidEnterBackground: and calling dismissWithClickedButtonIndex: on the UIAlertView. This works for my particular implementation, but is obviously not safe for everyone.

    opened by dfrdmn 9
  • Not displaying Appirater Alertview

    Not displaying Appirater Alertview

    My app is swift based 9.0, installed Appirater via cocoapods. Have this code in my AppDelegate:

        Appirater.setAppId("106037XXXX") //replace X's with last 4 digits just for here
        Appirater.setDaysUntilPrompt(2)
        Appirater.setUsesUntilPrompt(10)
        Appirater.setSignificantEventsUntilPrompt(-1)
        Appirater.setTimeBeforeReminding(2)
        Appirater.setDebug(true)
    

    Code is definitely executed, but no popup appears. Tried both on simulator and actual device. Any ideas?

    Thanks

    opened by royherma 7
  • iOS 10.3 in-app review!

    iOS 10.3 in-app review!

    This is great opportunity for Appirater to show new native dialog instead of sending to AppStore devices driven by iOS 10.3 or higher.

    https://developer.apple.com/library/prerelease/content/releasenotes/General/WhatsNewIniOS/Articles/iOS10_3.html

    opened by kohtenko 6
  • templateReviewURLiOS7 is wrong

    templateReviewURLiOS7 is wrong

    it goes to details page rather than review page, below one works for me.

    @"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=APP_ID&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software"

    opened by Poordeveloper 6
  • Localized dialog box not appearing

    Localized dialog box not appearing

    Hi, I just integrated Appirater with Cocoapods but the localized version of the dialog box does not appear when I have my device's language set to Chinese or Italian (that is what I tested).

    Is there something we need to do to make sure the localized versions are used?

    I see the localizations being copied into the Appirater.bundle in the build log.

    When we integrated this before Cocoapods, my coworker had to modify the .h file to use his own version of NSLocalizedString.

    opened by thisisjeffwong 6
  • Localizable files not available when installing from cocoapods

    Localizable files not available when installing from cocoapods

    Hello,

    I installed appirater with cocoapods (pod 'Appirater', '~> 1.0.1') but the localizable files are not present. Am I missing something?

    Thanks

    opened by MartinMoizard 6
  • Create framework project for Carthage support

    Create framework project for Carthage support

    This commit adds support for installing this library via Carthage by adding this line (once merged & new release published):

    github "arashpayan/appirater" ~> 2.1
    

    Until it's merged you can use my fork with this line instead:

    github "Dschee/appirater" "master"
    
    opened by Jeehut 5
  • Variable _debug isn't thread safe

    Variable _debug isn't thread safe

    I am investigating on a crash happening in appirater. Firebase lists it as: -[Appirater incrementUseCount] + 434. If we assume that the stacktrace is accurate, it shows this line:

    if (_debug)
         NSLog(@"APPIRATER Use count: %@", @(useCount));
    

    Before we call Appirater.appLaunched(true) we are setting Appirater.setDebug(false) on a main thread. Looking at the code, I can see that static variable _debug is used without any thread safety around it.

    BTW, this only happens to 0.03% of our users so chances of reproducing that are fairly low :)

    opened by RaimundasSakalauskas 0
  • `appLaunched` should respect `canPromptForRating` parameter in debug mode

    `appLaunched` should respect `canPromptForRating` parameter in debug mode

    When turning debug mode on with [Appirater setDebug:YES] then [Appirater appLaunched:NO] always shows the rating dialog; ignoring the canPromptForRating parameter that is set to NO here. I expect the dialog to be NOT shown in this case.

    opened by manide 0
  • Added more delegate methods And respect `setOpenInAppStore` value set by user

    Added more delegate methods And respect `setOpenInAppStore` value set by user

    Currently, if setOpenInAppStore is set to true, if the user is on iOS 10.3 or above, it still uses the StoreKit's alert. This PR will change that and show the Appirater alert if the user has chosen setOpenInAppStore to be true.

    Also, this PR adds two more delegate methods to AppiraterDelegate.

    • -(void)appiraterDidDisplayAppiraterAlert:(Appirater *)appirater; Will tell if the AppiraterAlert was shown.
    • -(void)appiraterDidDisplayStoreKitAlert:(Appirater *)appirater; Will tell if the StoreKit alert was shown.
    opened by rahuljiresal 0
Harpy - Notify users when a new version of your app is available and prompt them to upgrade.

After 6 years of Harpy and 4 years of Siren, I have decided to deprecate Harpy in favor of Siren. Why? Siren is written in Swift and has a feature set

Arthur Ariel Sabintsev 2.6k Dec 29, 2022
Siren - Notify users when a new version of your app is available and prompt them to upgrade.

Siren ?? Notify users when a new version of your app is available and prompt them to upgrade. Table of Contents Meta About Features Screenshots Ports

Arthur Ariel Sabintsev 4.1k Dec 27, 2022
AppVersion - Keep users on the up-to date version of your App.

?? App Version Don't let you users to get stuck on outdated version of your app. Automatic update tracking using Semantic Versioning Buil-in UI alerts

Ameba Labs 31 Sep 30, 2022
Apphud SDK is a lightweight open-source Swift library to manage auto-renewable subscriptions and other in-app purchases in your iOS app.

Apphud SDK Apphud SDK is a lightweight open-source Swift library to manage auto-renewable subscriptions and other in-app purchases in your iOS app. No

Apphud 143 Dec 16, 2022
An easy way to access reviews for your app instead of writing repetitive and redundant codes for every app.

AppStoreReviewManager An easy way to access reviews for your app instead of writing repetitive and redundant codes for every app. Requirements iOS 9.0

Jinya 4 Dec 23, 2022
🍎 An App to check whether a non-App Store app is in App Store.

AppStorify ?? An App to check whether a non-App Store app is in App Store. Benfits Use App Store's upgrade mechanism instead of app's. App Store apps

seedgou 58 Dec 7, 2022
Apple's Framework to support in-app purchases and interaction with the App Store

Apple's Framework to support in-app purchases and interaction with the App Store.

paigeshin 0 Dec 5, 2021
InAppPurchase - A Simple and Lightweight framework for In App Purchase

InAppPurchase A Simple, Lightweight and Safe framework for In App Purchase Feature Simple and Light ?? Support Promoting In-App Purchases ?? No need t

Jin Sasaki 269 Dec 15, 2022
MerchantKit - A modern In-App Purchases management framework for iOS developers

MerchantKit dramatically simplifies the work indie developers have to do in order to add premium monetizable components to their applications. Track purchased products, offer auto-renewing subscriptions, restore transactions, and much more.

Benjamin Mayo 1.1k Dec 17, 2022
SwiftyStoreKit is a lightweight In App Purchases framework for iOS, tvOS, watchOS, macOS, and Mac Catalyst ⛺

SwiftyStoreKit is a lightweight In App Purchases framework for iOS, tvOS, watchOS, macOS, and Mac Catalyst. Features Super easy-to-use block-based API

Andrea Bizzotto 6.1k Jan 7, 2023
Mercato is a lightweight In-App Purchases (StoreKit 2) library for iOS, tvOS, watchOS, macOS, and Mac Catalyst.

Mercato Mercato is a lightweight In-App Purchases (StoreKit 2) library for iOS, tvOS, watchOS, macOS, and Mac Catalyst. Installation Swift Package Man

Pavel T 49 Jan 4, 2023
An App where you can find product and see its detail.

MeliProductos Project ???? > An App where you can find product and see its detail. ???? > Una App donde puedes encontrar tus productos y ver su detall

Joaquin Segovia 3 May 6, 2022
A utility that reminds your iPhone app's users to review the app written in pure Swift.

SwiftRater SwiftRater is a class that you can drop into any iPhone app that will help remind your users to review your app on the App Store/in your ap

Takeshi Fujiki 289 Dec 12, 2022
A modern utility that reminds your iOS app's users to review the app in a non-invasive way.

SiriusRating A modern utility that reminds your iOS app's users to review the app in a non-invasive way. Features SwiftUI and UIKit support Configurab

The App Capital 5 Sep 24, 2022
Review page interaction - handy and pretty way to ask for review.

RPInteraction Overview Review page interaction - handy and pretty way to ask for review. Inspired by dribbble shot. Requirements iOS8 Installation RPI

Nurdaulet Bolatov 27 Jul 16, 2021
Review page interaction - handy and pretty way to ask for review

RPInteraction Overview Review page interaction - handy and pretty way to ask for review. Inspired by dribbble shot. Requirements iOS8 Installation RPI

Nurdaulet Bolatov 27 Jul 16, 2021
A framework to provide logic designed to prompt users at the ideal moment for a review of your app/software

ReviewKit ReviewKit is a Swift package/framework that provides logic designed to prompt users at the ideal moment for a review of your app. At a basic

Simon Mitchell 25 Jun 7, 2022
A utility application to capture and review search results from Swift Package Index.

SPISearch An app (macOS & iOS) to explore the search results from Swift Package Index. Testflight Links: SPIIndex (iOS and macOS apps) Search Ranking

Joseph Heck 5 Jul 26, 2022
Our Guillotine Menu Transitioning Animation implemented in Swift reminds a bit of a notorious killing machine.

GuillotineMenu.swift Inspired by this project on Dribbble Also, read how it was done in our blog Requirements iOS 8.0+ Xcode 10 Swift 5.0 (v 4.1+) Swi

Yalantis 2.9k Dec 13, 2022
Appstore-Review-Guidelines - A curated list of guideline which has to be taken care before submitting your application to Appstore.

Appstore Review Guidelines The App Review Guidelines provide rules and examples across a range of topics, including user interface design, functionali

Aashish Tamsya 14 Dec 16, 2022