react-native-rate-app 1.2.3 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/RateApp.podspec +1 -1
- package/ios/RateApp-Bridging-Header.h +1 -0
- package/ios/RateApp.mm +6 -46
- package/ios/RateApp.swift +50 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -120,9 +120,12 @@ To enable in-app reviews for the Samsung Galaxy Store, ensure that your app is c
|
|
|
120
120
|
- **Development Mode**: The in-app review dialog is always displayed in development mode, regardless of rate limits. This is useful for testing purposes.
|
|
121
121
|
- **Best Practices**: According to operating system guidelines, it is recommended to request a review during a natural flow in your app, rather than from a button. For example, you might request a review after a user has completed a task or achieved a milestone within your app.
|
|
122
122
|
|
|
123
|
-
[Apple Documentation](https://developer.apple.com/documentation/storekit/skstorereviewcontroller/3566727-requestreview#discussion)<br>
|
|
123
|
+
[Apple Documentation iOS 14+](https://developer.apple.com/documentation/storekit/skstorereviewcontroller/3566727-requestreview#discussion)<br>
|
|
124
|
+
[Apple Documentation iOS 16+](https://developer.apple.com/documentation/storekit/requestreviewaction)<br>
|
|
124
125
|
[Google Documentation](https://developer.android.com/guide/playcore/in-app-review)
|
|
125
126
|
|
|
127
|
+
Below iOS 16 library is using the deprecated SKStoreReviewController and on iOS 16+ it uses the new RequestReviewAction API. Both implementations provide the same functionality and user experience.
|
|
128
|
+
|
|
126
129
|
### `RateApp.openStoreForReview(options)`
|
|
127
130
|
|
|
128
131
|
Opens the app store page for the app, allowing the user to leave a review.
|
package/RateApp.podspec
CHANGED
|
@@ -14,7 +14,7 @@ Pod::Spec.new do |s|
|
|
|
14
14
|
s.platforms = { :ios => min_ios_version_supported }
|
|
15
15
|
s.source = { :git => "https://github.com/huextrat/react-native-rate-app.git", :tag => "#{s.version}" }
|
|
16
16
|
|
|
17
|
-
s.source_files = "ios/**/*.{h,m,mm,cpp}"
|
|
17
|
+
s.source_files = "ios/**/*.{h,m,mm,cpp,swift}"
|
|
18
18
|
s.private_header_files = "ios/generated/**/*.h"
|
|
19
19
|
|
|
20
20
|
# Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
package/ios/RateApp.mm
CHANGED
|
@@ -1,55 +1,15 @@
|
|
|
1
|
-
#import
|
|
2
|
-
#import <StoreKit/StoreKit.h>
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
static NSString *const kUnsupportedPlatformError = @"unsupported_platform";
|
|
3
|
+
@interface RCT_EXTERN_MODULE(RateApp, NSObject)
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
RCT_EXPORT_MODULE()
|
|
9
|
-
|
|
10
|
-
RCT_EXPORT_METHOD(requestReview:(RCTPromiseResolveBlock)resolve
|
|
5
|
+
RCT_EXTERN_METHOD(requestReview:(RCTPromiseResolveBlock)resolve
|
|
11
6
|
reject:(RCTPromiseRejectBlock)reject)
|
|
12
|
-
{
|
|
13
|
-
UIWindowScene *scene = [self findActiveScene];
|
|
14
|
-
if (scene) {
|
|
15
|
-
[SKStoreReviewController requestReviewInScene:scene];
|
|
16
|
-
resolve(@(YES));
|
|
17
|
-
} else {
|
|
18
|
-
reject(kNoActiveSceneError, @"No active scene found", nil);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
7
|
|
|
22
|
-
|
|
8
|
+
RCT_EXTERN_METHOD(requestReviewAppGallery:(RCTPromiseResolveBlock)resolve
|
|
23
9
|
reject:(RCTPromiseRejectBlock)reject)
|
|
24
|
-
{
|
|
25
|
-
// Since this is iOS, we should reject with an appropriate message
|
|
26
|
-
reject(kUnsupportedPlatformError, @"App Gallery reviews are not supported on iOS", nil);
|
|
27
|
-
}
|
|
28
10
|
|
|
29
|
-
|
|
11
|
+
RCT_EXTERN_METHOD(requestReviewGalaxyStore:(NSString *)packageName
|
|
30
12
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
31
13
|
reject:(RCTPromiseRejectBlock)reject)
|
|
32
|
-
{
|
|
33
|
-
// Since this is iOS, we should reject with an appropriate message
|
|
34
|
-
reject(kUnsupportedPlatformError, @"Galaxy Store reviews are not supported on iOS", nil);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
- (UIWindowScene *) findActiveScene {
|
|
38
|
-
for (UIWindowScene *scene in UIApplication.sharedApplication.connectedScenes) {
|
|
39
|
-
if (scene.activationState == UISceneActivationStateForegroundActive) {
|
|
40
|
-
return scene;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return nil;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Don't compile this code when we build for the old architecture.
|
|
47
|
-
#ifdef RCT_NEW_ARCH_ENABLED
|
|
48
|
-
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
49
|
-
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
50
|
-
{
|
|
51
|
-
return std::make_shared<facebook::react::NativeRateAppSpecJSI>(params);
|
|
52
|
-
}
|
|
53
|
-
#endif
|
|
54
14
|
|
|
55
|
-
@end
|
|
15
|
+
@end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import StoreKit
|
|
3
|
+
|
|
4
|
+
@objc(RateApp)
|
|
5
|
+
class RateApp: NSObject {
|
|
6
|
+
|
|
7
|
+
private let noActiveSceneError = "no_active_scene"
|
|
8
|
+
private let unsupportedPlatformError = "unsupported_platform"
|
|
9
|
+
|
|
10
|
+
@objc
|
|
11
|
+
static func requiresMainQueueSetup() -> Bool {
|
|
12
|
+
return false
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@objc
|
|
16
|
+
func requestReview(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
17
|
+
if let scene = findActiveScene() {
|
|
18
|
+
if #available(iOS 16.0, *) {
|
|
19
|
+
Task { @MainActor in
|
|
20
|
+
AppStore.requestReview(in: scene)
|
|
21
|
+
}
|
|
22
|
+
} else {
|
|
23
|
+
SKStoreReviewController.requestReview(in: scene)
|
|
24
|
+
}
|
|
25
|
+
resolve(true)
|
|
26
|
+
} else {
|
|
27
|
+
reject(noActiveSceneError, "No active scene found", nil)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@objc
|
|
32
|
+
func requestReviewAppGallery(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
33
|
+
reject(unsupportedPlatformError, "App Gallery reviews are not supported on iOS", nil)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@objc
|
|
37
|
+
func requestReviewGalaxyStore(_ packageName: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
38
|
+
reject(unsupportedPlatformError, "Galaxy Store reviews are not supported on iOS", nil)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private func findActiveScene() -> UIWindowScene? {
|
|
42
|
+
for scene in UIApplication.shared.connectedScenes {
|
|
43
|
+
if let windowScene = scene as? UIWindowScene,
|
|
44
|
+
windowScene.activationState == .foregroundActive {
|
|
45
|
+
return windowScene
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return nil
|
|
49
|
+
}
|
|
50
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-rate-app",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "React Native module for In App Rating on Android and iOS",
|
|
5
5
|
"source": "src/index.tsx",
|
|
6
6
|
"main": "lib/commonjs/index.js",
|
|
@@ -65,14 +65,14 @@
|
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@biomejs/biome": "1.9.4",
|
|
68
|
-
"@commitlint/cli": "19.
|
|
69
|
-
"@commitlint/config-conventional": "19.
|
|
68
|
+
"@commitlint/cli": "19.8.0",
|
|
69
|
+
"@commitlint/config-conventional": "19.8.0",
|
|
70
70
|
"@react-native-community/cli": "15.1.3",
|
|
71
71
|
"@semantic-release/changelog": "6.0.3",
|
|
72
72
|
"@semantic-release/git": "10.0.1",
|
|
73
73
|
"@types/jest": "29.5.14",
|
|
74
74
|
"@types/react": "19.0.10",
|
|
75
|
-
"commitlint": "19.
|
|
75
|
+
"commitlint": "19.8.0",
|
|
76
76
|
"del-cli": "6.0.0",
|
|
77
77
|
"expo": "^52.0.31",
|
|
78
78
|
"husky": "9.1.7",
|