@onekeyfe/react-native-app-update 1.1.26 → 1.1.28

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.
@@ -39,6 +39,14 @@ android {
39
39
  minSdkVersion getExtOrIntegerDefault("minSdkVersion")
40
40
  targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
41
41
 
42
+ // When ONEKEY_ALLOW_SKIP_GPG_VERIFICATION env var is set to a non-empty, non-'false' value,
43
+ // enable the skip-GPG code paths. Without this flag, BuildConfig.ALLOW_SKIP_GPG_VERIFICATION
44
+ // is false and all skip-GPG logic is gated behind an immutable compile-time constant.
45
+ def allowSkipGPG = System.getenv('ONEKEY_ALLOW_SKIP_GPG_VERIFICATION') != null &&
46
+ System.getenv('ONEKEY_ALLOW_SKIP_GPG_VERIFICATION') != '' &&
47
+ System.getenv('ONEKEY_ALLOW_SKIP_GPG_VERIFICATION') != 'false'
48
+ buildConfigField("boolean", "ALLOW_SKIP_GPG_VERIFICATION", allowSkipGPG.toString())
49
+
42
50
  externalNativeBuild {
43
51
  cmake {
44
52
  cppFlags "-frtti -fexceptions -Wall -fstack-protector-all"
@@ -237,8 +237,11 @@ class ReactNativeAppUpdate : HybridReactNativeAppUpdateSpec() {
237
237
  * Verify GPG signature of an ASC file and extract the SHA256 hash.
238
238
  * Returns the SHA256 hash if signature is valid, null otherwise.
239
239
  */
240
- private fun verifyAscAndExtractSha256(ascFile: File): String? {
241
- val ascContent = ascFile.readText()
240
+ /**
241
+ * Verify GPG signature of ASC content string and extract the SHA256 hash.
242
+ * Returns the SHA256 hash if signature is valid, null otherwise.
243
+ */
244
+ private fun verifyAscContentAndExtractSha256(ascContent: String): String? {
242
245
  if (!ascContent.contains("-----BEGIN PGP SIGNED MESSAGE-----")) return null
243
246
 
244
247
  val lines = ascContent.lines()
@@ -277,6 +280,10 @@ class ReactNativeAppUpdate : HybridReactNativeAppUpdateSpec() {
277
280
  return sha256
278
281
  }
279
282
 
283
+ private fun verifyAscAndExtractSha256(ascFile: File): String? {
284
+ return verifyAscContentAndExtractSha256(ascFile.readText())
285
+ }
286
+
280
287
  /** Constant-time comparison to prevent timing attacks on hash values */
281
288
  private fun secureCompare(a: String, b: String): Boolean {
282
289
  val aBytes = a.toByteArray(Charsets.UTF_8)
@@ -349,6 +356,7 @@ class ReactNativeAppUpdate : HybridReactNativeAppUpdateSpec() {
349
356
 
350
357
  /** Returns true if the skip-GPG-verification toggle is enabled via MMKV storage. */
351
358
  private fun isSkipGPGEnabled(): Boolean {
359
+ if (!BuildConfig.ALLOW_SKIP_GPG_VERIFICATION) return false
352
360
  return try {
353
361
  val context = NitroModules.applicationContext ?: return false
354
362
  MMKV.initialize(context)
@@ -559,11 +567,11 @@ class ReactNativeAppUpdate : HybridReactNativeAppUpdateSpec() {
559
567
  val filePath = filePathFromUrl(params.downloadUrl)
560
568
  OneKeyLog.info("AppUpdate", "verifyASC: filePath=$filePath")
561
569
 
562
- // Skip GPG verification only when both DevSettings and skip-GPG toggle are enabled
563
- val devSettings = isDevSettingsEnabled()
564
- val skipGPGToggle = isSkipGPGEnabled()
570
+ // Skip GPG verification only when BuildConfig allows it AND both DevSettings and skip-GPG toggle are enabled
571
+ val devSettings = if (BuildConfig.ALLOW_SKIP_GPG_VERIFICATION) isDevSettingsEnabled() else false
572
+ val skipGPGToggle = if (BuildConfig.ALLOW_SKIP_GPG_VERIFICATION) isSkipGPGEnabled() else false
565
573
  OneKeyLog.info("AppUpdate", "verifyASC: GPG check: devSettings=$devSettings, skipGPGToggle=$skipGPGToggle")
566
- if (devSettings && skipGPGToggle) {
574
+ if (BuildConfig.ALLOW_SKIP_GPG_VERIFICATION && devSettings && skipGPGToggle) {
567
575
  OneKeyLog.warn("AppUpdate", "verifyASC: GPG verification skipped (DevSettings + skip-GPG enabled)")
568
576
  return@async
569
577
  }
@@ -836,6 +844,53 @@ class ReactNativeAppUpdate : HybridReactNativeAppUpdateSpec() {
836
844
  }
837
845
  }
838
846
 
847
+ override fun testVerification(): Promise<Boolean> {
848
+ return Promise.async {
849
+ val testSignature = """-----BEGIN PGP SIGNED MESSAGE-----
850
+ Hash: SHA256
851
+
852
+ {
853
+ "fileName": "metadata.json",
854
+ "sha256": "2ada9c871104fc40649fa3de67a7d8e33faadc18e9abd587e8bb85be0a003eba",
855
+ "size": 158590,
856
+ "generatedAt": "2025-09-19T07:49:13.000Z"
857
+ }
858
+ -----BEGIN PGP SIGNATURE-----
859
+
860
+ iQJCBAEBCAAsFiEE62iuVE8f3YzSZGJPs2mmepC/OHsFAmjNJ1IOHGRldkBvbmVr
861
+ ZXkuc28ACgkQs2mmepC/OHs6Rw/9FKHl5aNsE7V0IsFf/l+h16BYKFwVsL69alMk
862
+ CFLna8oUn0+tyECF6wKBKw5pHo5YR27o2pJfYbAER6dygDF6WTZ1lZdf5QcBMjGA
863
+ LCeXC0hzUBzSSOH4bKBTa3fHp//HdSV1F2OnkymbXqYN7WXvuQPLZ0nV6aU88hCk
864
+ HgFifcvkXAnWKoosUtj0Bban/YBRyvmQ5C2akxUPEkr4Yck1QXwzJeNRd7wMXHjH
865
+ JFK6lJcuABiB8wpJDXJkFzKs29pvHIK2B2vdOjU2rQzKOUwaKHofDi5C4+JitT2b
866
+ 2pSeYP3PAxXYw6XDOmKTOiC7fPnfLjtcPjNYNFCezVKZT6LKvZW9obnW8Q9LNJ4W
867
+ okMPgHObkabv3OqUaTA9QNVfI/X9nvggzlPnaKDUrDWTf7n3vlrdexugkLtV/tJA
868
+ uguPlI5hY7Ue5OW7ckWP46hfmq1+UaIdeUY7dEO+rPZDz6KcArpaRwBiLPBhneIr
869
+ /X3KuMzS272YbPbavgCZGN9xJR5kZsEQE5HhPCbr6Nf0qDnh+X8mg0tAB/U6F+ZE
870
+ o90sJL1ssIaYvST+VWVaGRr4V5nMDcgHzWSF9Q/wm22zxe4alDaBdvOlUseW0iaM
871
+ n2DMz6gqk326W6SFynYtvuiXo7wG4Cmn3SuIU8xfv9rJqunpZGYchMd7nZektmEJ
872
+ 91Js0rQ=
873
+ =A/Ii
874
+ -----END PGP SIGNATURE-----"""
875
+ val result = verifyAscContentAndExtractSha256(testSignature)
876
+ val isValid = result == "2ada9c871104fc40649fa3de67a7d8e33faadc18e9abd587e8bb85be0a003eba"
877
+ OneKeyLog.info("AppUpdate", "testVerification: GPG verification result: $isValid")
878
+ isValid
879
+ }
880
+ }
881
+
882
+ override fun testSkipVerification(): Promise<Boolean> {
883
+ return Promise.async {
884
+ val result = if (BuildConfig.ALLOW_SKIP_GPG_VERIFICATION) {
885
+ isDevSettingsEnabled() && isSkipGPGEnabled()
886
+ } else {
887
+ false
888
+ }
889
+ OneKeyLog.info("AppUpdate", "testSkipVerification: result=$result")
890
+ result
891
+ }
892
+ }
893
+
839
894
  override fun clearCache(): Promise<Unit> {
840
895
  return Promise.async {
841
896
  OneKeyLog.info("AppUpdate", "clearCache: starting cleanup...")
@@ -30,6 +30,16 @@ class ReactNativeAppUpdate: HybridReactNativeAppUpdateSpec {
30
30
  return Promise.resolved(withResult: ())
31
31
  }
32
32
 
33
+ func testVerification() throws -> Promise<Bool> {
34
+ OneKeyLog.debug("AppUpdate", "testVerification not available on iOS")
35
+ return Promise.resolved(withResult: true)
36
+ }
37
+
38
+ func testSkipVerification() throws -> Promise<Bool> {
39
+ OneKeyLog.debug("AppUpdate", "testSkipVerification not available on iOS")
40
+ return Promise.resolved(withResult: false)
41
+ }
42
+
33
43
  func clearCache() throws -> Promise<Void> {
34
44
  return Promise.resolved(withResult: ())
35
45
  }
@@ -22,6 +22,8 @@ export interface ReactNativeAppUpdate extends HybridObject<{
22
22
  verifyAPK(params: AppUpdateFileParams): Promise<void>;
23
23
  installAPK(params: AppUpdateFileParams): Promise<void>;
24
24
  clearCache(): Promise<void>;
25
+ testVerification(): Promise<boolean>;
26
+ testSkipVerification(): Promise<boolean>;
25
27
  addDownloadListener(callback: (event: DownloadEvent) => void): number;
26
28
  removeDownloadListener(id: number): void;
27
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ReactNativeAppUpdate.nitro.d.ts","sourceRoot":"","sources":["../../../src/ReactNativeAppUpdate.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBACf,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;IACzD,WAAW,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,WAAW,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,CAAC;IACtE,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C"}
1
+ {"version":3,"file":"ReactNativeAppUpdate.nitro.d.ts","sourceRoot":"","sources":["../../../src/ReactNativeAppUpdate.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBACf,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;IACzD,WAAW,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,WAAW,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5B,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,CAAC;IACtE,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C"}
@@ -149,6 +149,38 @@ namespace margelo::nitro::reactnativeappupdate {
149
149
  return __promise;
150
150
  }();
151
151
  }
152
+ std::shared_ptr<Promise<bool>> JHybridReactNativeAppUpdateSpec::testVerification() {
153
+ static const auto method = javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("testVerification");
154
+ auto __result = method(_javaPart);
155
+ return [&]() {
156
+ auto __promise = Promise<bool>::create();
157
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
158
+ auto __result = jni::static_ref_cast<jni::JBoolean>(__boxedResult);
159
+ __promise->resolve(static_cast<bool>(__result->value()));
160
+ });
161
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
162
+ jni::JniException __jniError(__throwable);
163
+ __promise->reject(std::make_exception_ptr(__jniError));
164
+ });
165
+ return __promise;
166
+ }();
167
+ }
168
+ std::shared_ptr<Promise<bool>> JHybridReactNativeAppUpdateSpec::testSkipVerification() {
169
+ static const auto method = javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("testSkipVerification");
170
+ auto __result = method(_javaPart);
171
+ return [&]() {
172
+ auto __promise = Promise<bool>::create();
173
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
174
+ auto __result = jni::static_ref_cast<jni::JBoolean>(__boxedResult);
175
+ __promise->resolve(static_cast<bool>(__result->value()));
176
+ });
177
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
178
+ jni::JniException __jniError(__throwable);
179
+ __promise->reject(std::make_exception_ptr(__jniError));
180
+ });
181
+ return __promise;
182
+ }();
183
+ }
152
184
  double JHybridReactNativeAppUpdateSpec::addDownloadListener(const std::function<void(const DownloadEvent& /* event */)>& callback) {
153
185
  static const auto method = javaClassStatic()->getMethod<double(jni::alias_ref<JFunc_void_DownloadEvent::javaobject> /* callback */)>("addDownloadListener_cxx");
154
186
  auto __result = method(_javaPart, JFunc_void_DownloadEvent_cxx::fromCpp(callback));
@@ -60,6 +60,8 @@ namespace margelo::nitro::reactnativeappupdate {
60
60
  std::shared_ptr<Promise<void>> verifyAPK(const AppUpdateFileParams& params) override;
61
61
  std::shared_ptr<Promise<void>> installAPK(const AppUpdateFileParams& params) override;
62
62
  std::shared_ptr<Promise<void>> clearCache() override;
63
+ std::shared_ptr<Promise<bool>> testVerification() override;
64
+ std::shared_ptr<Promise<bool>> testSkipVerification() override;
63
65
  double addDownloadListener(const std::function<void(const DownloadEvent& /* event */)>& callback) override;
64
66
  void removeDownloadListener(double id) override;
65
67
 
@@ -70,6 +70,14 @@ abstract class HybridReactNativeAppUpdateSpec: HybridObject() {
70
70
  @Keep
71
71
  abstract fun clearCache(): Promise<Unit>
72
72
 
73
+ @DoNotStrip
74
+ @Keep
75
+ abstract fun testVerification(): Promise<Boolean>
76
+
77
+ @DoNotStrip
78
+ @Keep
79
+ abstract fun testSkipVerification(): Promise<Boolean>
80
+
73
81
  abstract fun addDownloadListener(callback: (event: DownloadEvent) -> Unit): Double
74
82
 
75
83
  @DoNotStrip
@@ -30,6 +30,14 @@ namespace margelo::nitro::reactnativeappupdate::bridge::swift {
30
30
  };
31
31
  }
32
32
 
33
+ // pragma MARK: std::function<void(bool /* result */)>
34
+ Func_void_bool create_Func_void_bool(void* NON_NULL swiftClosureWrapper) noexcept {
35
+ auto swiftClosure = ReactNativeAppUpdate::Func_void_bool::fromUnsafe(swiftClosureWrapper);
36
+ return [swiftClosure = std::move(swiftClosure)](bool result) mutable -> void {
37
+ swiftClosure.call(result);
38
+ };
39
+ }
40
+
33
41
  // pragma MARK: std::function<void(const DownloadEvent& /* event */)>
34
42
  Func_void_DownloadEvent create_Func_void_DownloadEvent(void* NON_NULL swiftClosureWrapper) noexcept {
35
43
  auto swiftClosure = ReactNativeAppUpdate::Func_void_DownloadEvent::fromUnsafe(swiftClosureWrapper);
@@ -90,6 +90,40 @@ namespace margelo::nitro::reactnativeappupdate::bridge::swift {
90
90
  return Func_void_std__exception_ptr_Wrapper(std::move(value));
91
91
  }
92
92
 
93
+ // pragma MARK: std::shared_ptr<Promise<bool>>
94
+ /**
95
+ * Specialized version of `std::shared_ptr<Promise<bool>>`.
96
+ */
97
+ using std__shared_ptr_Promise_bool__ = std::shared_ptr<Promise<bool>>;
98
+ inline std::shared_ptr<Promise<bool>> create_std__shared_ptr_Promise_bool__() noexcept {
99
+ return Promise<bool>::create();
100
+ }
101
+ inline PromiseHolder<bool> wrap_std__shared_ptr_Promise_bool__(std::shared_ptr<Promise<bool>> promise) noexcept {
102
+ return PromiseHolder<bool>(std::move(promise));
103
+ }
104
+
105
+ // pragma MARK: std::function<void(bool /* result */)>
106
+ /**
107
+ * Specialized version of `std::function<void(bool)>`.
108
+ */
109
+ using Func_void_bool = std::function<void(bool /* result */)>;
110
+ /**
111
+ * Wrapper class for a `std::function<void(bool / * result * /)>`, this can be used from Swift.
112
+ */
113
+ class Func_void_bool_Wrapper final {
114
+ public:
115
+ explicit Func_void_bool_Wrapper(std::function<void(bool /* result */)>&& func): _function(std::make_unique<std::function<void(bool /* result */)>>(std::move(func))) {}
116
+ inline void call(bool result) const noexcept {
117
+ _function->operator()(result);
118
+ }
119
+ private:
120
+ std::unique_ptr<std::function<void(bool /* result */)>> _function;
121
+ } SWIFT_NONCOPYABLE;
122
+ Func_void_bool create_Func_void_bool(void* NON_NULL swiftClosureWrapper) noexcept;
123
+ inline Func_void_bool_Wrapper wrap_Func_void_bool(Func_void_bool value) noexcept {
124
+ return Func_void_bool_Wrapper(std::move(value));
125
+ }
126
+
93
127
  // pragma MARK: std::function<void(const DownloadEvent& /* event */)>
94
128
  /**
95
129
  * Specialized version of `std::function<void(const DownloadEvent&)>`.
@@ -133,6 +167,15 @@ namespace margelo::nitro::reactnativeappupdate::bridge::swift {
133
167
  return Result<std::shared_ptr<Promise<void>>>::withError(error);
134
168
  }
135
169
 
170
+ // pragma MARK: Result<std::shared_ptr<Promise<bool>>>
171
+ using Result_std__shared_ptr_Promise_bool___ = Result<std::shared_ptr<Promise<bool>>>;
172
+ inline Result_std__shared_ptr_Promise_bool___ create_Result_std__shared_ptr_Promise_bool___(const std::shared_ptr<Promise<bool>>& value) noexcept {
173
+ return Result<std::shared_ptr<Promise<bool>>>::withValue(value);
174
+ }
175
+ inline Result_std__shared_ptr_Promise_bool___ create_Result_std__shared_ptr_Promise_bool___(const std::exception_ptr& error) noexcept {
176
+ return Result<std::shared_ptr<Promise<bool>>>::withError(error);
177
+ }
178
+
136
179
  // pragma MARK: Result<double>
137
180
  using Result_double_ = Result<double>;
138
181
  inline Result_double_ create_Result_double_(double value) noexcept {
@@ -118,6 +118,22 @@ namespace margelo::nitro::reactnativeappupdate {
118
118
  auto __value = std::move(__result.value());
119
119
  return __value;
120
120
  }
121
+ inline std::shared_ptr<Promise<bool>> testVerification() override {
122
+ auto __result = _swiftPart.testVerification();
123
+ if (__result.hasError()) [[unlikely]] {
124
+ std::rethrow_exception(__result.error());
125
+ }
126
+ auto __value = std::move(__result.value());
127
+ return __value;
128
+ }
129
+ inline std::shared_ptr<Promise<bool>> testSkipVerification() override {
130
+ auto __result = _swiftPart.testSkipVerification();
131
+ if (__result.hasError()) [[unlikely]] {
132
+ std::rethrow_exception(__result.error());
133
+ }
134
+ auto __value = std::move(__result.value());
135
+ return __value;
136
+ }
121
137
  inline double addDownloadListener(const std::function<void(const DownloadEvent& /* event */)>& callback) override {
122
138
  auto __result = _swiftPart.addDownloadListener(callback);
123
139
  if (__result.hasError()) [[unlikely]] {
@@ -0,0 +1,47 @@
1
+ ///
2
+ /// Func_void_bool.swift
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2026 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ import Foundation
9
+ import NitroModules
10
+
11
+ /**
12
+ * Wraps a Swift `(_ value: Bool) -> Void` as a class.
13
+ * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`.
14
+ */
15
+ public final class Func_void_bool {
16
+ public typealias bridge = margelo.nitro.reactnativeappupdate.bridge.swift
17
+
18
+ private let closure: (_ value: Bool) -> Void
19
+
20
+ public init(_ closure: @escaping (_ value: Bool) -> Void) {
21
+ self.closure = closure
22
+ }
23
+
24
+ @inline(__always)
25
+ public func call(value: Bool) -> Void {
26
+ self.closure(value)
27
+ }
28
+
29
+ /**
30
+ * Casts this instance to a retained unsafe raw pointer.
31
+ * This acquires one additional strong reference on the object!
32
+ */
33
+ @inline(__always)
34
+ public func toUnsafe() -> UnsafeMutableRawPointer {
35
+ return Unmanaged.passRetained(self).toOpaque()
36
+ }
37
+
38
+ /**
39
+ * Casts an unsafe pointer to a `Func_void_bool`.
40
+ * The pointer has to be a retained opaque `Unmanaged<Func_void_bool>`.
41
+ * This removes one strong reference from the object!
42
+ */
43
+ @inline(__always)
44
+ public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_bool {
45
+ return Unmanaged<Func_void_bool>.fromOpaque(pointer).takeRetainedValue()
46
+ }
47
+ }
@@ -20,6 +20,8 @@ public protocol HybridReactNativeAppUpdateSpec_protocol: HybridObject {
20
20
  func verifyAPK(params: AppUpdateFileParams) throws -> Promise<Void>
21
21
  func installAPK(params: AppUpdateFileParams) throws -> Promise<Void>
22
22
  func clearCache() throws -> Promise<Void>
23
+ func testVerification() throws -> Promise<Bool>
24
+ func testSkipVerification() throws -> Promise<Bool>
23
25
  func addDownloadListener(callback: @escaping (_ event: DownloadEvent) -> Void) throws -> Double
24
26
  func removeDownloadListener(id: Double) throws -> Void
25
27
  }
@@ -231,6 +231,44 @@ open class HybridReactNativeAppUpdateSpec_cxx {
231
231
  }
232
232
  }
233
233
 
234
+ @inline(__always)
235
+ public final func testVerification() -> bridge.Result_std__shared_ptr_Promise_bool___ {
236
+ do {
237
+ let __result = try self.__implementation.testVerification()
238
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_bool__ in
239
+ let __promise = bridge.create_std__shared_ptr_Promise_bool__()
240
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_bool__(__promise)
241
+ __result
242
+ .then({ __result in __promiseHolder.resolve(__result) })
243
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
244
+ return __promise
245
+ }()
246
+ return bridge.create_Result_std__shared_ptr_Promise_bool___(__resultCpp)
247
+ } catch (let __error) {
248
+ let __exceptionPtr = __error.toCpp()
249
+ return bridge.create_Result_std__shared_ptr_Promise_bool___(__exceptionPtr)
250
+ }
251
+ }
252
+
253
+ @inline(__always)
254
+ public final func testSkipVerification() -> bridge.Result_std__shared_ptr_Promise_bool___ {
255
+ do {
256
+ let __result = try self.__implementation.testSkipVerification()
257
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_bool__ in
258
+ let __promise = bridge.create_std__shared_ptr_Promise_bool__()
259
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_bool__(__promise)
260
+ __result
261
+ .then({ __result in __promiseHolder.resolve(__result) })
262
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
263
+ return __promise
264
+ }()
265
+ return bridge.create_Result_std__shared_ptr_Promise_bool___(__resultCpp)
266
+ } catch (let __error) {
267
+ let __exceptionPtr = __error.toCpp()
268
+ return bridge.create_Result_std__shared_ptr_Promise_bool___(__exceptionPtr)
269
+ }
270
+ }
271
+
234
272
  @inline(__always)
235
273
  public final func addDownloadListener(callback: bridge.Func_void_DownloadEvent) -> bridge.Result_double_ {
236
274
  do {
@@ -20,6 +20,8 @@ namespace margelo::nitro::reactnativeappupdate {
20
20
  prototype.registerHybridMethod("verifyAPK", &HybridReactNativeAppUpdateSpec::verifyAPK);
21
21
  prototype.registerHybridMethod("installAPK", &HybridReactNativeAppUpdateSpec::installAPK);
22
22
  prototype.registerHybridMethod("clearCache", &HybridReactNativeAppUpdateSpec::clearCache);
23
+ prototype.registerHybridMethod("testVerification", &HybridReactNativeAppUpdateSpec::testVerification);
24
+ prototype.registerHybridMethod("testSkipVerification", &HybridReactNativeAppUpdateSpec::testSkipVerification);
23
25
  prototype.registerHybridMethod("addDownloadListener", &HybridReactNativeAppUpdateSpec::addDownloadListener);
24
26
  prototype.registerHybridMethod("removeDownloadListener", &HybridReactNativeAppUpdateSpec::removeDownloadListener);
25
27
  });
@@ -63,6 +63,8 @@ namespace margelo::nitro::reactnativeappupdate {
63
63
  virtual std::shared_ptr<Promise<void>> verifyAPK(const AppUpdateFileParams& params) = 0;
64
64
  virtual std::shared_ptr<Promise<void>> installAPK(const AppUpdateFileParams& params) = 0;
65
65
  virtual std::shared_ptr<Promise<void>> clearCache() = 0;
66
+ virtual std::shared_ptr<Promise<bool>> testVerification() = 0;
67
+ virtual std::shared_ptr<Promise<bool>> testSkipVerification() = 0;
66
68
  virtual double addDownloadListener(const std::function<void(const DownloadEvent& /* event */)>& callback) = 0;
67
69
  virtual void removeDownloadListener(double id) = 0;
68
70
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/react-native-app-update",
3
- "version": "1.1.26",
3
+ "version": "1.1.28",
4
4
  "description": "react-native-app-update",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -25,6 +25,10 @@ export interface ReactNativeAppUpdate
25
25
  installAPK(params: AppUpdateFileParams): Promise<void>;
26
26
  clearCache(): Promise<void>;
27
27
 
28
+ // Verification & testing
29
+ testVerification(): Promise<boolean>;
30
+ testSkipVerification(): Promise<boolean>;
31
+
28
32
  addDownloadListener(callback: (event: DownloadEvent) => void): number;
29
33
  removeDownloadListener(id: number): void;
30
34
  }