Implementing App Rating and Review
1. Using Store Review
| Property | Description | Values |
|---|---|---|
| requestReview() | Initiates the store review flow | void |
Note: The review prompt will only appear if the user has not already reviewed or declined to review the app.
2. Requesting Review
| Method | Description | Notes |
|---|---|---|
| requestReview() | Initiates the native review flow for the app | Only works on iOS and Android devices with Google Play Services |
Example: Requesting a Review
import { requestReview } from 'expo-in-app-review';
const hasFlowStarted = await requestReview();
console.log('Review flow started:', hasFlowStarted);
Note: The review flow will only appear if the user has previously interacted with the app and is eligible for a review request.
3. Checking Review Availability
| Property | Description | Notes |
|---|---|---|
| Review.isAvailable | Indicates if the review system is available on the current platform. | Always returns true for iOS and Android; may return false on platforms that do not support reviews. |
Example: Check Review Availability
import * as Review from 'expo-reviews';
const isReviewAvailable = await Review.isAvailableAsync();
console.log('Reviews available:', isReviewAvailable); // true or false
Note: On platforms like web or tvOS, review systems might not be supported, and
isAvailableAsync will return false.
4. Checking Store Availability
| Platform | Store Availability | Notes |
|---|---|---|
| iOS | Available | Reviews can be triggered via Linking.openURL to App Store |
| Android | Available | Reviews can be triggered via Linking.openURL to Google Play Store |
| Web | Limited | No direct review flow; requires manual redirection to store |
| Windows | Limited | No native review system; requires manual store URL |
| macOS | Limited | No built-in review system; requires manual store URL |
Example: Check Store Availability
import { Platform } from 'react-native';
import { Linking } from 'expo';
const checkStoreAvailability = () => {
if (Platform.OS === 'ios') {
return Linking.canOpenURL('itms-apps://itunes.apple.com/app/id123456789');
} else if (Platform.OS === 'android') {
return Linking.canOpenURL('market://details?id=com.example.app');
}
return false;
};
export default checkStoreAvailability;
5. Opening Store Page
| Property | Description | Example |
|---|---|---|
| openStorePage | Opens the app's store page in the device's native app store | openStorePage() |
Note: This function works on both iOS and Android devices, directing users to the appropriate app store.
6. Implementing Review Prompts
| Property | Description | Values |
|---|---|---|
| promptTitle | Title of the review prompt dialog | "Rate our app" |
| promptMessage | Message displayed in the review prompt | "Would you like to rate our app?" |
| promptYes | Text for the "Yes" button | "Rate Now" |
| promptNo | Text for the "No" button | "Maybe Later" |
| promptCancel | Text for the "Cancel" button | "Cancel" |
Example: Configuring Review Prompts
import { ReviewPrompt } from 'expo-rating';\n\nconst reviewConfig = {\n promptTitle: 'Rate our app',\n promptMessage: 'Would you like to rate our app?',\n promptYes: 'Rate Now',\n promptNo: 'Maybe Later',\n promptCancel: 'Cancel'\n};\n\nReviewPrompt.configure(reviewConfig);
Note: Review prompts are only available on iOS and Android devices. Web and Expo Go do not support this feature.
7. Tracking Review Requests
| Property | Description | Values | Notes |
|---|---|---|---|
| requestReview() | Triggers the native review request flow | void |
Must be called after user interaction (e.g., after completing a task or achieving a milestone) |
| reviewStatus | Tracks whether review was requested or declined | 'requested' | 'declined' | 'notRequested' |
Used to prevent repeated prompts and respect user decisions |
Example: Requesting a Review
import { requestReview } from 'expo-in-app-review';\n\nconst handleTaskCompletion = async () => {\n // Simulate task completion\n await requestReview();\n};
Note: On iOS, the review request will only appear if the user has previously interacted with your app and is eligible for a review.
8. Handling Review Limitations
Note: Review limitations vary by platform and are subject to change. Always check the latest guidelines from Apple and Google.
| Platform | Review Limitations | Notes |
|---|---|---|
| iOS (Apple) | 1 review per app per year |
Users can only submit one review per app annually. Additional reviews are ignored. |
| Android (Google) | 1 review per app per user |
Each user can submit only one review per app. Subsequent reviews are not counted. |
| iOS (Apple) - App Store Connect | Review request limit |
Apple may restrict review requests for apps with low ratings or poor performance. |
Example: Handling Review Limitations in Expo
import { Platform } from 'expo-modules-core';
import * as StoreReview from 'expo-store-review';
const handleReviewRequest = async () => {
if (Platform.OS === 'ios') {
// iOS: Check if review is allowed
const canRequest = await StoreReview.canRequestReview();
if (canRequest) {
// Request review
await StoreReview.requestReview();
} else {
// Handle limitation (e.g., show message or delay)
console.log('Review limit reached on iOS');
}
} else if (Platform.OS === 'android') {
// Android: Use Expo's StoreReview module
const canRequest = await StoreReview.canRequestReview();
if (canRequest) {
await StoreReview.requestReview();
} else {
console.log('Review limit reached on Android');
}
}
};
Key Limitations Summary
- iOS: Users can submit only one review per app annually.
- Android: Users can submit only one review per app per user.
- Expo's
StoreReviewmodule provides a cross-platform way to request reviews, but limitations are enforced by the native platforms.
9. Using Smart Review Triggers
Example: Configuring Smart Review Triggers
import { useReview } from 'expo-review';
const App = () => {
const { requestReview, isAvailable } = useReview();
useEffect(() => {
if (isAvailable) {
requestReview();
}
}, [isAvailable]);
return <View></View>;
};
| Property | Description | Values |
|---|---|---|
| requestReview() | Triggers the native review prompt | void |
| isAvailable | Indicates if review prompt can be shown | boolean |
Note: The review prompt will only appear if the user has not already reviewed or declined to review.
10. Redirecting to Store Listing
| Property | Description | Example |
|---|---|---|
| expo-apple-app-review | Redirects to Apple App Store review page for iOS apps | import { openReview } from 'expo-apple-app-review'; |
| expo-google-play-review | Redirects to Google Play Store review page for Android apps | import { openReview } from 'expo-google-play-review'; |
Example: Redirecting to Store Review Page
import { openReview } from 'expo-apple-app-review'; // For iOS
// Or import { openReview } from 'expo-google-play-review'; // For Android
const handleReviewRequest = () => {
openReview();
};
Note: The review flow is only available on physical devices and will not work in Expo Go or simulator environments.