native-update 1.0.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.
Files changed (184) hide show
  1. package/CapacitorNativeUpdate.podspec +18 -0
  2. package/LICENSE +21 -0
  3. package/Readme.md +451 -0
  4. package/android/build.gradle +92 -0
  5. package/android/gradle/wrapper/gradle-wrapper.properties +8 -0
  6. package/android/gradle.properties +17 -0
  7. package/android/proguard-rules.pro +29 -0
  8. package/android/settings.gradle +2 -0
  9. package/android/src/main/AndroidManifest.xml +34 -0
  10. package/android/src/main/java/com/aoneahsan/nativeupdate/AppReviewPlugin.kt +153 -0
  11. package/android/src/main/java/com/aoneahsan/nativeupdate/AppUpdatePlugin.kt +275 -0
  12. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundNotificationManager.kt +390 -0
  13. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateManager.kt +46 -0
  14. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdatePlugin.kt +333 -0
  15. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateWorker.kt +251 -0
  16. package/android/src/main/java/com/aoneahsan/nativeupdate/CapacitorNativeUpdatePlugin.kt +265 -0
  17. package/android/src/main/java/com/aoneahsan/nativeupdate/LiveUpdatePlugin.kt +526 -0
  18. package/android/src/main/java/com/aoneahsan/nativeupdate/NotificationActionReceiver.kt +99 -0
  19. package/android/src/main/java/com/aoneahsan/nativeupdate/SecurityManager.kt +249 -0
  20. package/dist/esm/__tests__/bundle-manager.test.d.ts +1 -0
  21. package/dist/esm/__tests__/bundle-manager.test.js +123 -0
  22. package/dist/esm/__tests__/bundle-manager.test.js.map +1 -0
  23. package/dist/esm/__tests__/config.test.d.ts +1 -0
  24. package/dist/esm/__tests__/config.test.js +69 -0
  25. package/dist/esm/__tests__/config.test.js.map +1 -0
  26. package/dist/esm/__tests__/integration.test.d.ts +1 -0
  27. package/dist/esm/__tests__/integration.test.js +78 -0
  28. package/dist/esm/__tests__/integration.test.js.map +1 -0
  29. package/dist/esm/__tests__/security.test.d.ts +1 -0
  30. package/dist/esm/__tests__/security.test.js +54 -0
  31. package/dist/esm/__tests__/security.test.js.map +1 -0
  32. package/dist/esm/__tests__/version-manager.test.d.ts +1 -0
  33. package/dist/esm/__tests__/version-manager.test.js +45 -0
  34. package/dist/esm/__tests__/version-manager.test.js.map +1 -0
  35. package/dist/esm/app-review/app-review-manager.d.ts +24 -0
  36. package/dist/esm/app-review/app-review-manager.js +195 -0
  37. package/dist/esm/app-review/app-review-manager.js.map +1 -0
  38. package/dist/esm/app-review/index.d.ts +5 -0
  39. package/dist/esm/app-review/index.js +6 -0
  40. package/dist/esm/app-review/index.js.map +1 -0
  41. package/dist/esm/app-review/platform-review-handler.d.ts +20 -0
  42. package/dist/esm/app-review/platform-review-handler.js +138 -0
  43. package/dist/esm/app-review/platform-review-handler.js.map +1 -0
  44. package/dist/esm/app-review/review-conditions-checker.d.ts +22 -0
  45. package/dist/esm/app-review/review-conditions-checker.js +155 -0
  46. package/dist/esm/app-review/review-conditions-checker.js.map +1 -0
  47. package/dist/esm/app-review/review-rate-limiter.d.ts +23 -0
  48. package/dist/esm/app-review/review-rate-limiter.js +164 -0
  49. package/dist/esm/app-review/review-rate-limiter.js.map +1 -0
  50. package/dist/esm/app-review/types.d.ts +41 -0
  51. package/dist/esm/app-review/types.js +2 -0
  52. package/dist/esm/app-review/types.js.map +1 -0
  53. package/dist/esm/app-update/app-update-checker.d.ts +13 -0
  54. package/dist/esm/app-update/app-update-checker.js +104 -0
  55. package/dist/esm/app-update/app-update-checker.js.map +1 -0
  56. package/dist/esm/app-update/app-update-installer.d.ts +19 -0
  57. package/dist/esm/app-update/app-update-installer.js +123 -0
  58. package/dist/esm/app-update/app-update-installer.js.map +1 -0
  59. package/dist/esm/app-update/app-update-manager.d.ts +28 -0
  60. package/dist/esm/app-update/app-update-manager.js +199 -0
  61. package/dist/esm/app-update/app-update-manager.js.map +1 -0
  62. package/dist/esm/app-update/app-update-notifier.d.ts +14 -0
  63. package/dist/esm/app-update/app-update-notifier.js +100 -0
  64. package/dist/esm/app-update/app-update-notifier.js.map +1 -0
  65. package/dist/esm/app-update/index.d.ts +6 -0
  66. package/dist/esm/app-update/index.js +7 -0
  67. package/dist/esm/app-update/index.js.map +1 -0
  68. package/dist/esm/app-update/platform-app-update.d.ts +19 -0
  69. package/dist/esm/app-update/platform-app-update.js +129 -0
  70. package/dist/esm/app-update/platform-app-update.js.map +1 -0
  71. package/dist/esm/app-update/types.d.ts +58 -0
  72. package/dist/esm/app-update/types.js +12 -0
  73. package/dist/esm/app-update/types.js.map +1 -0
  74. package/dist/esm/background-update/background-scheduler.d.ts +17 -0
  75. package/dist/esm/background-update/background-scheduler.js +195 -0
  76. package/dist/esm/background-update/background-scheduler.js.map +1 -0
  77. package/dist/esm/background-update/index.d.ts +3 -0
  78. package/dist/esm/background-update/index.js +3 -0
  79. package/dist/esm/background-update/index.js.map +1 -0
  80. package/dist/esm/background-update/notification-manager.d.ts +29 -0
  81. package/dist/esm/background-update/notification-manager.js +89 -0
  82. package/dist/esm/background-update/notification-manager.js.map +1 -0
  83. package/dist/esm/core/analytics.d.ts +70 -0
  84. package/dist/esm/core/analytics.js +137 -0
  85. package/dist/esm/core/analytics.js.map +1 -0
  86. package/dist/esm/core/cache-manager.d.ts +72 -0
  87. package/dist/esm/core/cache-manager.js +275 -0
  88. package/dist/esm/core/cache-manager.js.map +1 -0
  89. package/dist/esm/core/config.d.ts +48 -0
  90. package/dist/esm/core/config.js +83 -0
  91. package/dist/esm/core/config.js.map +1 -0
  92. package/dist/esm/core/errors.d.ts +51 -0
  93. package/dist/esm/core/errors.js +80 -0
  94. package/dist/esm/core/errors.js.map +1 -0
  95. package/dist/esm/core/logger.d.ts +21 -0
  96. package/dist/esm/core/logger.js +109 -0
  97. package/dist/esm/core/logger.js.map +1 -0
  98. package/dist/esm/core/performance.d.ts +53 -0
  99. package/dist/esm/core/performance.js +140 -0
  100. package/dist/esm/core/performance.js.map +1 -0
  101. package/dist/esm/core/plugin-manager.d.ts +66 -0
  102. package/dist/esm/core/plugin-manager.js +148 -0
  103. package/dist/esm/core/plugin-manager.js.map +1 -0
  104. package/dist/esm/core/security.d.ts +93 -0
  105. package/dist/esm/core/security.js +315 -0
  106. package/dist/esm/core/security.js.map +1 -0
  107. package/dist/esm/definitions.d.ts +639 -0
  108. package/dist/esm/definitions.js +103 -0
  109. package/dist/esm/definitions.js.map +1 -0
  110. package/dist/esm/index.d.ts +12 -0
  111. package/dist/esm/index.js +16 -0
  112. package/dist/esm/index.js.map +1 -0
  113. package/dist/esm/live-update/bundle-manager.d.ts +94 -0
  114. package/dist/esm/live-update/bundle-manager.js +310 -0
  115. package/dist/esm/live-update/bundle-manager.js.map +1 -0
  116. package/dist/esm/live-update/certificate-pinning.d.ts +38 -0
  117. package/dist/esm/live-update/certificate-pinning.js +78 -0
  118. package/dist/esm/live-update/certificate-pinning.js.map +1 -0
  119. package/dist/esm/live-update/download-manager.d.ts +67 -0
  120. package/dist/esm/live-update/download-manager.js +319 -0
  121. package/dist/esm/live-update/download-manager.js.map +1 -0
  122. package/dist/esm/live-update/update-manager.d.ts +52 -0
  123. package/dist/esm/live-update/update-manager.js +294 -0
  124. package/dist/esm/live-update/update-manager.js.map +1 -0
  125. package/dist/esm/live-update/version-manager.d.ts +84 -0
  126. package/dist/esm/live-update/version-manager.js +335 -0
  127. package/dist/esm/live-update/version-manager.js.map +1 -0
  128. package/dist/esm/plugin.d.ts +6 -0
  129. package/dist/esm/plugin.js +283 -0
  130. package/dist/esm/plugin.js.map +1 -0
  131. package/dist/esm/security/crypto.d.ts +25 -0
  132. package/dist/esm/security/crypto.js +70 -0
  133. package/dist/esm/security/crypto.js.map +1 -0
  134. package/dist/esm/security/validator.d.ts +60 -0
  135. package/dist/esm/security/validator.js +143 -0
  136. package/dist/esm/security/validator.js.map +1 -0
  137. package/dist/esm/web.d.ts +74 -0
  138. package/dist/esm/web.js +595 -0
  139. package/dist/esm/web.js.map +1 -0
  140. package/dist/plugin.cjs.js +2 -0
  141. package/dist/plugin.cjs.js.map +1 -0
  142. package/dist/plugin.esm.js +2 -0
  143. package/dist/plugin.esm.js.map +1 -0
  144. package/dist/plugin.js +3 -0
  145. package/dist/plugin.js.map +1 -0
  146. package/docs/APP_REVIEW_GUIDE.md +768 -0
  147. package/docs/BUNDLE_SIGNING.md +264 -0
  148. package/docs/LIVE_UPDATES_GUIDE.md +650 -0
  149. package/docs/MIGRATION.md +192 -0
  150. package/docs/NATIVE_UPDATES_GUIDE.md +694 -0
  151. package/docs/QUICK_START.md +606 -0
  152. package/docs/README.md +111 -0
  153. package/docs/REMAINING_FEATURES.md +139 -0
  154. package/docs/api/app-review-api.md +259 -0
  155. package/docs/api/app-update-api.md +238 -0
  156. package/docs/api/events-api.md +451 -0
  157. package/docs/api/live-update-api.md +265 -0
  158. package/docs/background-updates.md +392 -0
  159. package/docs/examples/advanced-scenarios.md +410 -0
  160. package/docs/examples/basic-usage.md +185 -0
  161. package/docs/features/app-reviews.md +975 -0
  162. package/docs/features/app-updates.md +785 -0
  163. package/docs/features/live-updates.md +633 -0
  164. package/docs/getting-started/configuration.md +468 -0
  165. package/docs/getting-started/installation.md +209 -0
  166. package/docs/getting-started/quick-start.md +379 -0
  167. package/docs/guides/deployment-guide.md +333 -0
  168. package/docs/guides/migration-from-codepush.md +142 -0
  169. package/docs/guides/security-best-practices.md +1057 -0
  170. package/docs/guides/testing-guide.md +373 -0
  171. package/docs/production-readiness.md +478 -0
  172. package/docs/security/certificate-pinning.md +122 -0
  173. package/docs/server-requirements.md +147 -0
  174. package/ios/Plugin/AppReview/AppReviewPlugin.swift +158 -0
  175. package/ios/Plugin/AppUpdate/AppUpdatePlugin.swift +234 -0
  176. package/ios/Plugin/BackgroundUpdate/BackgroundNotificationManager.swift +329 -0
  177. package/ios/Plugin/BackgroundUpdate/BackgroundUpdatePlugin.swift +396 -0
  178. package/ios/Plugin/CapacitorNativeUpdatePlugin.m +45 -0
  179. package/ios/Plugin/CapacitorNativeUpdatePlugin.swift +190 -0
  180. package/ios/Plugin/Info.plist +43 -0
  181. package/ios/Plugin/LiveUpdate/LiveUpdatePlugin.swift +689 -0
  182. package/ios/Plugin/LiveUpdate/WebViewConfiguration.swift +45 -0
  183. package/ios/Plugin/Security/SecurityManager.swift +289 -0
  184. package/package.json +90 -0
@@ -0,0 +1,265 @@
1
+ package com.aoneahsan.nativeupdate
2
+
3
+ import com.getcapacitor.Plugin
4
+ import com.getcapacitor.PluginCall
5
+ import com.getcapacitor.PluginMethod
6
+ import com.getcapacitor.annotation.CapacitorPlugin
7
+ import com.getcapacitor.annotation.Permission
8
+ import android.Manifest
9
+
10
+ @CapacitorPlugin(
11
+ name = "CapacitorNativeUpdate",
12
+ permissions = [
13
+ Permission(
14
+ strings = [Manifest.permission.WRITE_EXTERNAL_STORAGE],
15
+ alias = "storage"
16
+ )
17
+ ]
18
+ )
19
+ class CapacitorNativeUpdatePlugin : Plugin() {
20
+
21
+ private lateinit var liveUpdatePlugin: LiveUpdatePlugin
22
+ private lateinit var appUpdatePlugin: AppUpdatePlugin
23
+ private lateinit var appReviewPlugin: AppReviewPlugin
24
+ private lateinit var backgroundUpdatePlugin: BackgroundUpdatePlugin
25
+ private lateinit var securityManager: SecurityManager
26
+
27
+ override fun load() {
28
+ super.load()
29
+
30
+ // Initialize sub-plugins
31
+ liveUpdatePlugin = LiveUpdatePlugin(activity, context)
32
+ appUpdatePlugin = AppUpdatePlugin(activity, context)
33
+ appReviewPlugin = AppReviewPlugin(activity, context)
34
+ backgroundUpdatePlugin = BackgroundUpdatePlugin()
35
+ securityManager = SecurityManager(context)
36
+
37
+ // Register plugins with manager for background access
38
+ BackgroundUpdateManager.registerLiveUpdatePlugin(liveUpdatePlugin)
39
+ BackgroundUpdateManager.registerAppUpdatePlugin(appUpdatePlugin)
40
+
41
+ // Set up listeners
42
+ liveUpdatePlugin.setProgressListener { progress ->
43
+ notifyListeners("downloadProgress", progress)
44
+ }
45
+
46
+ liveUpdatePlugin.setStateChangeListener { state ->
47
+ notifyListeners("updateStateChanged", state)
48
+ }
49
+ }
50
+
51
+ @PluginMethod
52
+ fun configure(call: PluginCall) {
53
+ val config = call.getObject("config")
54
+
55
+ if (config == null) {
56
+ call.reject("Configuration object is required")
57
+ return
58
+ }
59
+
60
+ try {
61
+ // Validate security settings
62
+ val securityConfig = config.getJSObject("security")
63
+ if (securityConfig != null) {
64
+ securityManager.configure(securityConfig)
65
+ }
66
+
67
+ // Configure sub-plugins
68
+ config.getJSObject("liveUpdate")?.let {
69
+ liveUpdatePlugin.configure(it)
70
+ }
71
+
72
+ config.getJSObject("appUpdate")?.let {
73
+ appUpdatePlugin.configure(it)
74
+ }
75
+
76
+ config.getJSObject("appReview")?.let {
77
+ appReviewPlugin.configure(it)
78
+ }
79
+
80
+ config.getJSObject("backgroundUpdate")?.let {
81
+ backgroundUpdatePlugin.configure(it)
82
+ }
83
+
84
+ call.resolve()
85
+ } catch (e: Exception) {
86
+ call.reject("Configuration failed", e)
87
+ }
88
+ }
89
+
90
+ @PluginMethod
91
+ fun getSecurityInfo(call: PluginCall) {
92
+ call.resolve(securityManager.getSecurityInfo())
93
+ }
94
+
95
+ // Live Update Methods
96
+
97
+ @PluginMethod
98
+ fun sync(call: PluginCall) {
99
+ liveUpdatePlugin.sync(call)
100
+ }
101
+
102
+ @PluginMethod
103
+ fun download(call: PluginCall) {
104
+ if (!hasRequiredPermissions()) {
105
+ requestPermissionForAlias("storage", call, "handleStoragePermission")
106
+ return
107
+ }
108
+ liveUpdatePlugin.download(call)
109
+ }
110
+
111
+ @PluginMethod
112
+ fun set(call: PluginCall) {
113
+ liveUpdatePlugin.set(call)
114
+ }
115
+
116
+ @PluginMethod
117
+ fun reload(call: PluginCall) {
118
+ liveUpdatePlugin.reload(call)
119
+ }
120
+
121
+ @PluginMethod
122
+ fun reset(call: PluginCall) {
123
+ liveUpdatePlugin.reset(call)
124
+ }
125
+
126
+ @PluginMethod
127
+ fun current(call: PluginCall) {
128
+ liveUpdatePlugin.current(call)
129
+ }
130
+
131
+ @PluginMethod
132
+ fun list(call: PluginCall) {
133
+ liveUpdatePlugin.list(call)
134
+ }
135
+
136
+ @PluginMethod
137
+ fun delete(call: PluginCall) {
138
+ liveUpdatePlugin.delete(call)
139
+ }
140
+
141
+ @PluginMethod
142
+ fun notifyAppReady(call: PluginCall) {
143
+ liveUpdatePlugin.notifyAppReady(call)
144
+ }
145
+
146
+ @PluginMethod
147
+ fun getLatest(call: PluginCall) {
148
+ liveUpdatePlugin.getLatest(call)
149
+ }
150
+
151
+ @PluginMethod
152
+ fun setChannel(call: PluginCall) {
153
+ liveUpdatePlugin.setChannel(call)
154
+ }
155
+
156
+ @PluginMethod
157
+ fun setUpdateUrl(call: PluginCall) {
158
+ liveUpdatePlugin.setUpdateUrl(call)
159
+ }
160
+
161
+ @PluginMethod
162
+ fun validateUpdate(call: PluginCall) {
163
+ liveUpdatePlugin.validateUpdate(call)
164
+ }
165
+
166
+ // App Update Methods
167
+
168
+ @PluginMethod
169
+ fun getAppUpdateInfo(call: PluginCall) {
170
+ appUpdatePlugin.getAppUpdateInfo(call)
171
+ }
172
+
173
+ @PluginMethod
174
+ fun performImmediateUpdate(call: PluginCall) {
175
+ appUpdatePlugin.performImmediateUpdate(call)
176
+ }
177
+
178
+ @PluginMethod
179
+ fun startFlexibleUpdate(call: PluginCall) {
180
+ appUpdatePlugin.startFlexibleUpdate(call)
181
+ }
182
+
183
+ @PluginMethod
184
+ fun completeFlexibleUpdate(call: PluginCall) {
185
+ appUpdatePlugin.completeFlexibleUpdate(call)
186
+ }
187
+
188
+ @PluginMethod
189
+ fun openAppStore(call: PluginCall) {
190
+ appUpdatePlugin.openAppStore(call)
191
+ }
192
+
193
+ // App Review Methods
194
+
195
+ @PluginMethod
196
+ fun requestReview(call: PluginCall) {
197
+ appReviewPlugin.requestReview(call)
198
+ }
199
+
200
+ @PluginMethod
201
+ fun canRequestReview(call: PluginCall) {
202
+ appReviewPlugin.canRequestReview(call)
203
+ }
204
+
205
+ // Background Update Methods
206
+
207
+ @PluginMethod
208
+ fun enableBackgroundUpdates(call: PluginCall) {
209
+ backgroundUpdatePlugin.enableBackgroundUpdates(call)
210
+ }
211
+
212
+ @PluginMethod
213
+ fun disableBackgroundUpdates(call: PluginCall) {
214
+ backgroundUpdatePlugin.disableBackgroundUpdates(call)
215
+ }
216
+
217
+ @PluginMethod
218
+ fun getBackgroundUpdateStatus(call: PluginCall) {
219
+ backgroundUpdatePlugin.getBackgroundUpdateStatus(call)
220
+ }
221
+
222
+ @PluginMethod
223
+ fun scheduleBackgroundCheck(call: PluginCall) {
224
+ backgroundUpdatePlugin.scheduleBackgroundCheck(call)
225
+ }
226
+
227
+ @PluginMethod
228
+ fun triggerBackgroundCheck(call: PluginCall) {
229
+ backgroundUpdatePlugin.triggerBackgroundCheck(call)
230
+ }
231
+
232
+ @PluginMethod
233
+ fun setNotificationPreferences(call: PluginCall) {
234
+ backgroundUpdatePlugin.setNotificationPreferences(call)
235
+ }
236
+
237
+ @PluginMethod
238
+ fun getNotificationPermissions(call: PluginCall) {
239
+ backgroundUpdatePlugin.getNotificationPermissions(call)
240
+ }
241
+
242
+ @PluginMethod
243
+ fun requestNotificationPermissions(call: PluginCall) {
244
+ backgroundUpdatePlugin.requestNotificationPermissions(call)
245
+ }
246
+
247
+ // Permission Callbacks
248
+
249
+ @PluginMethod
250
+ fun handleStoragePermission(call: PluginCall) {
251
+ if (hasPermission("storage")) {
252
+ // Retry the original method
253
+ when (call.methodName) {
254
+ "download" -> liveUpdatePlugin.download(call)
255
+ else -> call.reject("Unknown method")
256
+ }
257
+ } else {
258
+ call.reject("Storage permission denied")
259
+ }
260
+ }
261
+
262
+ private fun hasRequiredPermissions(): Boolean {
263
+ return hasPermission("storage")
264
+ }
265
+ }