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.
- package/CapacitorNativeUpdate.podspec +18 -0
- package/LICENSE +21 -0
- package/Readme.md +451 -0
- package/android/build.gradle +92 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +8 -0
- package/android/gradle.properties +17 -0
- package/android/proguard-rules.pro +29 -0
- package/android/settings.gradle +2 -0
- package/android/src/main/AndroidManifest.xml +34 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/AppReviewPlugin.kt +153 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/AppUpdatePlugin.kt +275 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundNotificationManager.kt +390 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateManager.kt +46 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdatePlugin.kt +333 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateWorker.kt +251 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/CapacitorNativeUpdatePlugin.kt +265 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/LiveUpdatePlugin.kt +526 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/NotificationActionReceiver.kt +99 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/SecurityManager.kt +249 -0
- package/dist/esm/__tests__/bundle-manager.test.d.ts +1 -0
- package/dist/esm/__tests__/bundle-manager.test.js +123 -0
- package/dist/esm/__tests__/bundle-manager.test.js.map +1 -0
- package/dist/esm/__tests__/config.test.d.ts +1 -0
- package/dist/esm/__tests__/config.test.js +69 -0
- package/dist/esm/__tests__/config.test.js.map +1 -0
- package/dist/esm/__tests__/integration.test.d.ts +1 -0
- package/dist/esm/__tests__/integration.test.js +78 -0
- package/dist/esm/__tests__/integration.test.js.map +1 -0
- package/dist/esm/__tests__/security.test.d.ts +1 -0
- package/dist/esm/__tests__/security.test.js +54 -0
- package/dist/esm/__tests__/security.test.js.map +1 -0
- package/dist/esm/__tests__/version-manager.test.d.ts +1 -0
- package/dist/esm/__tests__/version-manager.test.js +45 -0
- package/dist/esm/__tests__/version-manager.test.js.map +1 -0
- package/dist/esm/app-review/app-review-manager.d.ts +24 -0
- package/dist/esm/app-review/app-review-manager.js +195 -0
- package/dist/esm/app-review/app-review-manager.js.map +1 -0
- package/dist/esm/app-review/index.d.ts +5 -0
- package/dist/esm/app-review/index.js +6 -0
- package/dist/esm/app-review/index.js.map +1 -0
- package/dist/esm/app-review/platform-review-handler.d.ts +20 -0
- package/dist/esm/app-review/platform-review-handler.js +138 -0
- package/dist/esm/app-review/platform-review-handler.js.map +1 -0
- package/dist/esm/app-review/review-conditions-checker.d.ts +22 -0
- package/dist/esm/app-review/review-conditions-checker.js +155 -0
- package/dist/esm/app-review/review-conditions-checker.js.map +1 -0
- package/dist/esm/app-review/review-rate-limiter.d.ts +23 -0
- package/dist/esm/app-review/review-rate-limiter.js +164 -0
- package/dist/esm/app-review/review-rate-limiter.js.map +1 -0
- package/dist/esm/app-review/types.d.ts +41 -0
- package/dist/esm/app-review/types.js +2 -0
- package/dist/esm/app-review/types.js.map +1 -0
- package/dist/esm/app-update/app-update-checker.d.ts +13 -0
- package/dist/esm/app-update/app-update-checker.js +104 -0
- package/dist/esm/app-update/app-update-checker.js.map +1 -0
- package/dist/esm/app-update/app-update-installer.d.ts +19 -0
- package/dist/esm/app-update/app-update-installer.js +123 -0
- package/dist/esm/app-update/app-update-installer.js.map +1 -0
- package/dist/esm/app-update/app-update-manager.d.ts +28 -0
- package/dist/esm/app-update/app-update-manager.js +199 -0
- package/dist/esm/app-update/app-update-manager.js.map +1 -0
- package/dist/esm/app-update/app-update-notifier.d.ts +14 -0
- package/dist/esm/app-update/app-update-notifier.js +100 -0
- package/dist/esm/app-update/app-update-notifier.js.map +1 -0
- package/dist/esm/app-update/index.d.ts +6 -0
- package/dist/esm/app-update/index.js +7 -0
- package/dist/esm/app-update/index.js.map +1 -0
- package/dist/esm/app-update/platform-app-update.d.ts +19 -0
- package/dist/esm/app-update/platform-app-update.js +129 -0
- package/dist/esm/app-update/platform-app-update.js.map +1 -0
- package/dist/esm/app-update/types.d.ts +58 -0
- package/dist/esm/app-update/types.js +12 -0
- package/dist/esm/app-update/types.js.map +1 -0
- package/dist/esm/background-update/background-scheduler.d.ts +17 -0
- package/dist/esm/background-update/background-scheduler.js +195 -0
- package/dist/esm/background-update/background-scheduler.js.map +1 -0
- package/dist/esm/background-update/index.d.ts +3 -0
- package/dist/esm/background-update/index.js +3 -0
- package/dist/esm/background-update/index.js.map +1 -0
- package/dist/esm/background-update/notification-manager.d.ts +29 -0
- package/dist/esm/background-update/notification-manager.js +89 -0
- package/dist/esm/background-update/notification-manager.js.map +1 -0
- package/dist/esm/core/analytics.d.ts +70 -0
- package/dist/esm/core/analytics.js +137 -0
- package/dist/esm/core/analytics.js.map +1 -0
- package/dist/esm/core/cache-manager.d.ts +72 -0
- package/dist/esm/core/cache-manager.js +275 -0
- package/dist/esm/core/cache-manager.js.map +1 -0
- package/dist/esm/core/config.d.ts +48 -0
- package/dist/esm/core/config.js +83 -0
- package/dist/esm/core/config.js.map +1 -0
- package/dist/esm/core/errors.d.ts +51 -0
- package/dist/esm/core/errors.js +80 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/logger.d.ts +21 -0
- package/dist/esm/core/logger.js +109 -0
- package/dist/esm/core/logger.js.map +1 -0
- package/dist/esm/core/performance.d.ts +53 -0
- package/dist/esm/core/performance.js +140 -0
- package/dist/esm/core/performance.js.map +1 -0
- package/dist/esm/core/plugin-manager.d.ts +66 -0
- package/dist/esm/core/plugin-manager.js +148 -0
- package/dist/esm/core/plugin-manager.js.map +1 -0
- package/dist/esm/core/security.d.ts +93 -0
- package/dist/esm/core/security.js +315 -0
- package/dist/esm/core/security.js.map +1 -0
- package/dist/esm/definitions.d.ts +639 -0
- package/dist/esm/definitions.js +103 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/live-update/bundle-manager.d.ts +94 -0
- package/dist/esm/live-update/bundle-manager.js +310 -0
- package/dist/esm/live-update/bundle-manager.js.map +1 -0
- package/dist/esm/live-update/certificate-pinning.d.ts +38 -0
- package/dist/esm/live-update/certificate-pinning.js +78 -0
- package/dist/esm/live-update/certificate-pinning.js.map +1 -0
- package/dist/esm/live-update/download-manager.d.ts +67 -0
- package/dist/esm/live-update/download-manager.js +319 -0
- package/dist/esm/live-update/download-manager.js.map +1 -0
- package/dist/esm/live-update/update-manager.d.ts +52 -0
- package/dist/esm/live-update/update-manager.js +294 -0
- package/dist/esm/live-update/update-manager.js.map +1 -0
- package/dist/esm/live-update/version-manager.d.ts +84 -0
- package/dist/esm/live-update/version-manager.js +335 -0
- package/dist/esm/live-update/version-manager.js.map +1 -0
- package/dist/esm/plugin.d.ts +6 -0
- package/dist/esm/plugin.js +283 -0
- package/dist/esm/plugin.js.map +1 -0
- package/dist/esm/security/crypto.d.ts +25 -0
- package/dist/esm/security/crypto.js +70 -0
- package/dist/esm/security/crypto.js.map +1 -0
- package/dist/esm/security/validator.d.ts +60 -0
- package/dist/esm/security/validator.js +143 -0
- package/dist/esm/security/validator.js.map +1 -0
- package/dist/esm/web.d.ts +74 -0
- package/dist/esm/web.js +595 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +2 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.esm.js +2 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/plugin.js +3 -0
- package/dist/plugin.js.map +1 -0
- package/docs/APP_REVIEW_GUIDE.md +768 -0
- package/docs/BUNDLE_SIGNING.md +264 -0
- package/docs/LIVE_UPDATES_GUIDE.md +650 -0
- package/docs/MIGRATION.md +192 -0
- package/docs/NATIVE_UPDATES_GUIDE.md +694 -0
- package/docs/QUICK_START.md +606 -0
- package/docs/README.md +111 -0
- package/docs/REMAINING_FEATURES.md +139 -0
- package/docs/api/app-review-api.md +259 -0
- package/docs/api/app-update-api.md +238 -0
- package/docs/api/events-api.md +451 -0
- package/docs/api/live-update-api.md +265 -0
- package/docs/background-updates.md +392 -0
- package/docs/examples/advanced-scenarios.md +410 -0
- package/docs/examples/basic-usage.md +185 -0
- package/docs/features/app-reviews.md +975 -0
- package/docs/features/app-updates.md +785 -0
- package/docs/features/live-updates.md +633 -0
- package/docs/getting-started/configuration.md +468 -0
- package/docs/getting-started/installation.md +209 -0
- package/docs/getting-started/quick-start.md +379 -0
- package/docs/guides/deployment-guide.md +333 -0
- package/docs/guides/migration-from-codepush.md +142 -0
- package/docs/guides/security-best-practices.md +1057 -0
- package/docs/guides/testing-guide.md +373 -0
- package/docs/production-readiness.md +478 -0
- package/docs/security/certificate-pinning.md +122 -0
- package/docs/server-requirements.md +147 -0
- package/ios/Plugin/AppReview/AppReviewPlugin.swift +158 -0
- package/ios/Plugin/AppUpdate/AppUpdatePlugin.swift +234 -0
- package/ios/Plugin/BackgroundUpdate/BackgroundNotificationManager.swift +329 -0
- package/ios/Plugin/BackgroundUpdate/BackgroundUpdatePlugin.swift +396 -0
- package/ios/Plugin/CapacitorNativeUpdatePlugin.m +45 -0
- package/ios/Plugin/CapacitorNativeUpdatePlugin.swift +190 -0
- package/ios/Plugin/Info.plist +43 -0
- package/ios/Plugin/LiveUpdate/LiveUpdatePlugin.swift +689 -0
- package/ios/Plugin/LiveUpdate/WebViewConfiguration.swift +45 -0
- package/ios/Plugin/Security/SecurityManager.swift +289 -0
- package/package.json +90 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Logger } from '../core/logger';
|
|
2
|
+
import { AppUpdateChecker } from './app-update-checker';
|
|
3
|
+
import { AppUpdateInstaller } from './app-update-installer';
|
|
4
|
+
import { PlatformAppUpdate } from './platform-app-update';
|
|
5
|
+
export class AppUpdateManager {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.listeners = new Map();
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.logger = new Logger('AppUpdateManager');
|
|
10
|
+
this.checker = new AppUpdateChecker(config);
|
|
11
|
+
this.installer = new AppUpdateInstaller(config);
|
|
12
|
+
this.platformUpdate = new PlatformAppUpdate(config);
|
|
13
|
+
}
|
|
14
|
+
async checkAppUpdate(options) {
|
|
15
|
+
try {
|
|
16
|
+
this.logger.log('Checking for app updates', options);
|
|
17
|
+
// Check with native platform
|
|
18
|
+
const nativeInfo = await this.platformUpdate.checkForUpdate(options);
|
|
19
|
+
// If no native info, check with server
|
|
20
|
+
if (!nativeInfo.updateAvailable && this.config.updateUrl) {
|
|
21
|
+
const serverInfo = await this.checker.checkServerVersion(options);
|
|
22
|
+
return this.mergeUpdateInfo(nativeInfo, serverInfo);
|
|
23
|
+
}
|
|
24
|
+
return nativeInfo;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
this.logger.error('Failed to check app update', error);
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async startImmediateUpdate() {
|
|
32
|
+
try {
|
|
33
|
+
this.logger.log('Starting immediate update');
|
|
34
|
+
// Check if immediate update is allowed
|
|
35
|
+
const updateInfo = await this.checkAppUpdate();
|
|
36
|
+
if (!updateInfo.immediateUpdateAllowed) {
|
|
37
|
+
throw new Error('Immediate update not allowed');
|
|
38
|
+
}
|
|
39
|
+
// Start the update
|
|
40
|
+
await this.installer.startImmediateUpdate();
|
|
41
|
+
// Notify listeners
|
|
42
|
+
this.emit('appUpdateStateChanged', {
|
|
43
|
+
installStatus: 1, // PENDING
|
|
44
|
+
packageName: this.config.packageName || '',
|
|
45
|
+
availableVersion: updateInfo.availableVersion || '',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
this.logger.error('Failed to start immediate update', error);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async startFlexibleUpdate() {
|
|
54
|
+
try {
|
|
55
|
+
this.logger.log('Starting flexible update');
|
|
56
|
+
// Check if flexible update is allowed
|
|
57
|
+
const updateInfo = await this.checkAppUpdate();
|
|
58
|
+
if (!updateInfo.flexibleUpdateAllowed) {
|
|
59
|
+
throw new Error('Flexible update not allowed');
|
|
60
|
+
}
|
|
61
|
+
// Start the update
|
|
62
|
+
await this.installer.startFlexibleUpdate();
|
|
63
|
+
// Set up progress monitoring
|
|
64
|
+
this.installer.onProgress((progress) => {
|
|
65
|
+
this.emit('appUpdateProgress', progress);
|
|
66
|
+
});
|
|
67
|
+
// Notify listeners
|
|
68
|
+
this.emit('appUpdateStateChanged', {
|
|
69
|
+
installStatus: 2, // DOWNLOADING
|
|
70
|
+
packageName: this.config.packageName || '',
|
|
71
|
+
availableVersion: updateInfo.availableVersion || '',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
this.logger.error('Failed to start flexible update', error);
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async completeFlexibleUpdate() {
|
|
80
|
+
try {
|
|
81
|
+
this.logger.log('Completing flexible update');
|
|
82
|
+
await this.installer.completeFlexibleUpdate();
|
|
83
|
+
// App will restart after this
|
|
84
|
+
this.emit('appUpdateStateChanged', {
|
|
85
|
+
installStatus: 3, // INSTALLING
|
|
86
|
+
packageName: this.config.packageName || '',
|
|
87
|
+
availableVersion: '',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.logger.error('Failed to complete flexible update', error);
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async getVersionInfo() {
|
|
96
|
+
try {
|
|
97
|
+
this.logger.log('Getting version info');
|
|
98
|
+
return await this.platformUpdate.getVersionInfo();
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
this.logger.error('Failed to get version info', error);
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async isMinimumVersionMet() {
|
|
106
|
+
try {
|
|
107
|
+
this.logger.log('Checking minimum version');
|
|
108
|
+
const versionInfo = await this.getVersionInfo();
|
|
109
|
+
const minimumVersion = this.config.minimumVersion || '0.0.0';
|
|
110
|
+
const isMet = this.checker.compareVersions(versionInfo.currentVersion, minimumVersion) >= 0;
|
|
111
|
+
return {
|
|
112
|
+
isMet,
|
|
113
|
+
currentVersion: versionInfo.currentVersion,
|
|
114
|
+
minimumVersion,
|
|
115
|
+
updateRequired: !isMet && this.config.enforceMinVersion === true,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
this.logger.error('Failed to check minimum version', error);
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async getAppUpdateInfo() {
|
|
124
|
+
return this.checkAppUpdate();
|
|
125
|
+
}
|
|
126
|
+
async performImmediateUpdate() {
|
|
127
|
+
return this.startImmediateUpdate();
|
|
128
|
+
}
|
|
129
|
+
async openAppStore(_options) {
|
|
130
|
+
try {
|
|
131
|
+
this.logger.log('Opening app store');
|
|
132
|
+
const storeInfo = await this.getAppStoreUrl();
|
|
133
|
+
await this.platformUpdate.openUrl(storeInfo.url);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
this.logger.error('Failed to open app store', error);
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async getAppStoreUrl() {
|
|
141
|
+
try {
|
|
142
|
+
this.logger.log('Getting app store URL');
|
|
143
|
+
return await this.platformUpdate.getAppStoreUrl();
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
this.logger.error('Failed to get app store URL', error);
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async getUpdateInstallState() {
|
|
151
|
+
try {
|
|
152
|
+
this.logger.log('Getting update install state');
|
|
153
|
+
return await this.installer.getInstallState();
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
this.logger.error('Failed to get update install state', error);
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
addListener(eventName, listenerFunc) {
|
|
161
|
+
if (!this.listeners.has(eventName)) {
|
|
162
|
+
this.listeners.set(eventName, new Set());
|
|
163
|
+
}
|
|
164
|
+
this.listeners.get(eventName).add(listenerFunc);
|
|
165
|
+
return {
|
|
166
|
+
remove: async () => {
|
|
167
|
+
const listeners = this.listeners.get(eventName);
|
|
168
|
+
if (listeners) {
|
|
169
|
+
listeners.delete(listenerFunc);
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
async removeAllListeners(eventName) {
|
|
175
|
+
if (eventName) {
|
|
176
|
+
this.listeners.delete(eventName);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
this.listeners.clear();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
emit(eventName, data) {
|
|
183
|
+
const listeners = this.listeners.get(eventName);
|
|
184
|
+
if (listeners) {
|
|
185
|
+
listeners.forEach((listener) => {
|
|
186
|
+
try {
|
|
187
|
+
listener(data);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
this.logger.error(`Error in ${eventName} listener`, error);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
mergeUpdateInfo(nativeInfo, serverInfo) {
|
|
196
|
+
return Object.assign(Object.assign(Object.assign({}, nativeInfo), serverInfo), { updateAvailable: nativeInfo.updateAvailable || !!serverInfo.availableVersion, availableVersion: serverInfo.availableVersion || nativeInfo.availableVersion });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=app-update-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-update-manager.js","sourceRoot":"","sources":["../../../src/app-update/app-update-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PluginConfig } from '../core/config';
|
|
2
|
+
import { AppUpdateInfo } from './types';
|
|
3
|
+
export declare class AppUpdateNotifier {
|
|
4
|
+
private config;
|
|
5
|
+
private logger;
|
|
6
|
+
constructor(config: PluginConfig);
|
|
7
|
+
notifyUpdateAvailable(updateInfo: AppUpdateInfo): Promise<void>;
|
|
8
|
+
notifyUpdateDownloading(progress: number): Promise<void>;
|
|
9
|
+
notifyUpdateReady(): Promise<void>;
|
|
10
|
+
notifyUpdateFailed(error: Error): Promise<void>;
|
|
11
|
+
private showNotification;
|
|
12
|
+
private showReadyNotification;
|
|
13
|
+
private emitUpdateEvent;
|
|
14
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Logger } from '../core/logger';
|
|
2
|
+
export class AppUpdateNotifier {
|
|
3
|
+
constructor(config) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
this.logger = new Logger('AppUpdateNotifier');
|
|
6
|
+
}
|
|
7
|
+
async notifyUpdateAvailable(updateInfo) {
|
|
8
|
+
this.logger.log('Notifying update available', updateInfo);
|
|
9
|
+
// Emit event for update availability
|
|
10
|
+
this.emitUpdateEvent('appUpdateAvailable', {
|
|
11
|
+
currentVersion: updateInfo.currentVersion,
|
|
12
|
+
availableVersion: updateInfo.availableVersion,
|
|
13
|
+
updatePriority: updateInfo.updatePriority,
|
|
14
|
+
updateSize: updateInfo.updateSize,
|
|
15
|
+
releaseNotes: updateInfo.releaseNotes,
|
|
16
|
+
storeUrl: updateInfo.updateURL,
|
|
17
|
+
});
|
|
18
|
+
// Show notification if configured
|
|
19
|
+
if (this.config.showUpdateNotification !== false) {
|
|
20
|
+
await this.showNotification(updateInfo);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async notifyUpdateDownloading(progress) {
|
|
24
|
+
this.logger.log('Update download progress', progress);
|
|
25
|
+
// Emit progress event
|
|
26
|
+
this.emitUpdateEvent('appUpdateProgress', {
|
|
27
|
+
percentComplete: progress,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async notifyUpdateReady() {
|
|
31
|
+
this.logger.log('Update ready for installation');
|
|
32
|
+
// Emit ready event
|
|
33
|
+
this.emitUpdateEvent('appUpdateReady', {
|
|
34
|
+
message: 'Update downloaded and ready to install',
|
|
35
|
+
});
|
|
36
|
+
// Show notification
|
|
37
|
+
if (this.config.showUpdateNotification !== false) {
|
|
38
|
+
await this.showReadyNotification();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async notifyUpdateFailed(error) {
|
|
42
|
+
this.logger.error('Update failed', error);
|
|
43
|
+
// Emit error event
|
|
44
|
+
this.emitUpdateEvent('appUpdateFailed', {
|
|
45
|
+
error: error.message,
|
|
46
|
+
code: error.code || 'UNKNOWN_ERROR',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async showNotification(updateInfo) {
|
|
50
|
+
if (!('Notification' in window)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Request permission if needed
|
|
54
|
+
if (Notification.permission === 'default') {
|
|
55
|
+
await Notification.requestPermission();
|
|
56
|
+
}
|
|
57
|
+
if (Notification.permission === 'granted') {
|
|
58
|
+
const notification = new Notification('App Update Available', {
|
|
59
|
+
body: `Version ${updateInfo.availableVersion} is available. ${updateInfo.releaseNotes || ''}`,
|
|
60
|
+
icon: '/icon.png',
|
|
61
|
+
tag: 'app-update',
|
|
62
|
+
requireInteraction: updateInfo.updatePriority === 5, // Priority 5 = IMMEDIATE
|
|
63
|
+
});
|
|
64
|
+
notification.onclick = () => {
|
|
65
|
+
// Trigger update action
|
|
66
|
+
this.emitUpdateEvent('appUpdateNotificationClicked', {});
|
|
67
|
+
notification.close();
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async showReadyNotification() {
|
|
72
|
+
if (!('Notification' in window) || Notification.permission !== 'granted') {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const notificationOptions = {
|
|
76
|
+
body: 'App update has been downloaded and is ready to install.',
|
|
77
|
+
icon: '/icon.png',
|
|
78
|
+
tag: 'app-update-ready',
|
|
79
|
+
};
|
|
80
|
+
// Actions are not supported in standard NotificationOptions
|
|
81
|
+
notificationOptions.actions = [
|
|
82
|
+
{ action: 'install', title: 'Install Now' },
|
|
83
|
+
{ action: 'later', title: 'Later' },
|
|
84
|
+
];
|
|
85
|
+
const notification = new Notification('Update Ready', notificationOptions);
|
|
86
|
+
notification.onclick = (event) => {
|
|
87
|
+
if (event.action === 'install') {
|
|
88
|
+
this.emitUpdateEvent('appUpdateInstallClicked', {});
|
|
89
|
+
}
|
|
90
|
+
notification.close();
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
emitUpdateEvent(eventName, data) {
|
|
94
|
+
// Emit custom event
|
|
95
|
+
if (typeof window !== 'undefined') {
|
|
96
|
+
window.dispatchEvent(new CustomEvent(eventName, { detail: data }));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=app-update-notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-update-notifier.js","sourceRoot":"","sources":["../../../src/app-update/app-update-notifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AppUpdateManager } from './app-update-manager';
|
|
2
|
+
export { AppUpdateChecker } from './app-update-checker';
|
|
3
|
+
export { AppUpdateInstaller } from './app-update-installer';
|
|
4
|
+
export { AppUpdateNotifier } from './app-update-notifier';
|
|
5
|
+
export { PlatformAppUpdate } from './platform-app-update';
|
|
6
|
+
export * from './types';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { AppUpdateManager } from './app-update-manager';
|
|
2
|
+
export { AppUpdateChecker } from './app-update-checker';
|
|
3
|
+
export { AppUpdateInstaller } from './app-update-installer';
|
|
4
|
+
export { AppUpdateNotifier } from './app-update-notifier';
|
|
5
|
+
export { PlatformAppUpdate } from './platform-app-update';
|
|
6
|
+
export * from './types';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/app-update/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PluginConfig } from '../core/config';
|
|
2
|
+
import { AppUpdateInfo, AppUpdateOptions, VersionInfo, AppStoreInfo } from './types';
|
|
3
|
+
export declare class PlatformAppUpdate {
|
|
4
|
+
private config;
|
|
5
|
+
private logger;
|
|
6
|
+
private platform;
|
|
7
|
+
constructor(config: PluginConfig);
|
|
8
|
+
checkForUpdate(_?: AppUpdateOptions): Promise<AppUpdateInfo>;
|
|
9
|
+
getVersionInfo(): Promise<VersionInfo>;
|
|
10
|
+
getAppStoreUrl(): Promise<AppStoreInfo>;
|
|
11
|
+
openUrl(url: string): Promise<void>;
|
|
12
|
+
isUpdateSupported(): boolean;
|
|
13
|
+
getUpdateCapabilities(): {
|
|
14
|
+
immediateUpdate: boolean;
|
|
15
|
+
flexibleUpdate: boolean;
|
|
16
|
+
backgroundDownload: boolean;
|
|
17
|
+
inAppReview: boolean;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Logger } from '../core/logger';
|
|
2
|
+
import { Capacitor } from '@capacitor/core';
|
|
3
|
+
export class PlatformAppUpdate {
|
|
4
|
+
constructor(config) {
|
|
5
|
+
this.config = config;
|
|
6
|
+
this.logger = new Logger('PlatformAppUpdate');
|
|
7
|
+
this.platform = Capacitor.getPlatform();
|
|
8
|
+
}
|
|
9
|
+
async checkForUpdate(_) {
|
|
10
|
+
// options parameter is kept for future use
|
|
11
|
+
this.logger.log('Checking for platform update: ' + this.platform);
|
|
12
|
+
const versionInfo = await this.getVersionInfo();
|
|
13
|
+
// Default response
|
|
14
|
+
const updateInfo = {
|
|
15
|
+
updateAvailable: false,
|
|
16
|
+
currentVersion: versionInfo.currentVersion,
|
|
17
|
+
availableVersion: versionInfo.currentVersion,
|
|
18
|
+
};
|
|
19
|
+
// Platform-specific checks
|
|
20
|
+
if (this.platform === 'android') {
|
|
21
|
+
// Android would check Play Store via Play Core Library
|
|
22
|
+
// This is handled by native implementation
|
|
23
|
+
return updateInfo;
|
|
24
|
+
}
|
|
25
|
+
else if (this.platform === 'ios') {
|
|
26
|
+
// iOS would check App Store via iTunes API
|
|
27
|
+
// This is handled by native implementation
|
|
28
|
+
return updateInfo;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Web platform - check configured update URL
|
|
32
|
+
if (this.config.webUpdateUrl) {
|
|
33
|
+
try {
|
|
34
|
+
const response = await fetch(this.config.webUpdateUrl);
|
|
35
|
+
const data = await response.json();
|
|
36
|
+
if (data.version && data.version !== versionInfo.currentVersion) {
|
|
37
|
+
updateInfo.updateAvailable = true;
|
|
38
|
+
updateInfo.availableVersion = data.version;
|
|
39
|
+
updateInfo.releaseNotes = data.releaseNotes;
|
|
40
|
+
updateInfo.updateURL = data.downloadUrl;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
this.logger.error('Failed to check web update', error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return updateInfo;
|
|
49
|
+
}
|
|
50
|
+
async getVersionInfo() {
|
|
51
|
+
// getAppInfo is not available in standard Capacitor, using default values
|
|
52
|
+
const appInfo = {
|
|
53
|
+
version: '1.0.0',
|
|
54
|
+
build: '1',
|
|
55
|
+
id: 'com.example.app',
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
currentVersion: appInfo.version,
|
|
59
|
+
buildNumber: appInfo.build,
|
|
60
|
+
packageName: appInfo.id,
|
|
61
|
+
platform: this.platform,
|
|
62
|
+
minimumVersion: this.config.minimumVersion,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async getAppStoreUrl() {
|
|
66
|
+
const platform = this.platform;
|
|
67
|
+
let url = '';
|
|
68
|
+
if (platform === 'ios') {
|
|
69
|
+
// iOS App Store URL
|
|
70
|
+
const appStoreId = this.config.appStoreId || this.config.iosAppId;
|
|
71
|
+
if (!appStoreId) {
|
|
72
|
+
throw new Error('App Store ID not configured');
|
|
73
|
+
}
|
|
74
|
+
url = `https://apps.apple.com/app/id${appStoreId}`;
|
|
75
|
+
}
|
|
76
|
+
else if (platform === 'android') {
|
|
77
|
+
// Google Play Store URL
|
|
78
|
+
const packageName = this.config.packageName || (await this.getVersionInfo()).packageName;
|
|
79
|
+
url = `https://play.google.com/store/apps/details?id=${packageName}`;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Web URL
|
|
83
|
+
url = this.config.webUpdateUrl || window.location.origin;
|
|
84
|
+
}
|
|
85
|
+
return { url, platform: platform };
|
|
86
|
+
}
|
|
87
|
+
async openUrl(url) {
|
|
88
|
+
if (typeof window !== 'undefined' && window.open) {
|
|
89
|
+
window.open(url, '_blank');
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
throw new Error('Cannot open URL on this platform');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
isUpdateSupported() {
|
|
96
|
+
// Check if platform supports in-app updates
|
|
97
|
+
if (this.platform === 'android') {
|
|
98
|
+
// Android supports in-app updates via Play Core
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
else if (this.platform === 'ios') {
|
|
102
|
+
// iOS only supports opening App Store
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// Web can redirect to update URL
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
getUpdateCapabilities() {
|
|
111
|
+
const capabilities = {
|
|
112
|
+
immediateUpdate: false,
|
|
113
|
+
flexibleUpdate: false,
|
|
114
|
+
backgroundDownload: false,
|
|
115
|
+
inAppReview: false,
|
|
116
|
+
};
|
|
117
|
+
if (this.platform === 'android') {
|
|
118
|
+
capabilities.immediateUpdate = true;
|
|
119
|
+
capabilities.flexibleUpdate = true;
|
|
120
|
+
capabilities.backgroundDownload = true;
|
|
121
|
+
capabilities.inAppReview = true;
|
|
122
|
+
}
|
|
123
|
+
else if (this.platform === 'ios') {
|
|
124
|
+
capabilities.inAppReview = true;
|
|
125
|
+
}
|
|
126
|
+
return capabilities;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=platform-app-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-app-update.js","sourceRoot":"","sources":["../../../src/app-update/platform-app-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface AppUpdateInfo {
|
|
2
|
+
updateAvailable: boolean;
|
|
3
|
+
currentVersion: string;
|
|
4
|
+
availableVersion?: string;
|
|
5
|
+
updatePriority?: number;
|
|
6
|
+
releaseNotes?: string;
|
|
7
|
+
updateSize?: number;
|
|
8
|
+
immediateUpdateAllowed?: boolean;
|
|
9
|
+
flexibleUpdateAllowed?: boolean;
|
|
10
|
+
clientVersionStalenessDays?: number;
|
|
11
|
+
updateURL?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AppUpdateProgress {
|
|
14
|
+
bytesDownloaded: number;
|
|
15
|
+
totalBytesToDownload: number;
|
|
16
|
+
percentComplete: number;
|
|
17
|
+
downloadSpeed: number;
|
|
18
|
+
estimatedTime: number;
|
|
19
|
+
}
|
|
20
|
+
export interface AppUpdateState {
|
|
21
|
+
installStatus: AppUpdateInstallStatus;
|
|
22
|
+
installErrorCode?: number;
|
|
23
|
+
packageName: string;
|
|
24
|
+
availableVersion: string;
|
|
25
|
+
}
|
|
26
|
+
export declare enum AppUpdateInstallStatus {
|
|
27
|
+
UNKNOWN = 0,
|
|
28
|
+
PENDING = 1,
|
|
29
|
+
DOWNLOADING = 2,
|
|
30
|
+
INSTALLING = 3,
|
|
31
|
+
INSTALLED = 4,
|
|
32
|
+
FAILED = 5,
|
|
33
|
+
CANCELED = 6,
|
|
34
|
+
DOWNLOADED = 11
|
|
35
|
+
}
|
|
36
|
+
export interface AppUpdateOptions {
|
|
37
|
+
allowedUpdateTypes?: ('immediate' | 'flexible')[];
|
|
38
|
+
stalenessDays?: number;
|
|
39
|
+
priority?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface VersionInfo {
|
|
42
|
+
currentVersion: string;
|
|
43
|
+
buildNumber: string;
|
|
44
|
+
packageName: string;
|
|
45
|
+
platform: 'ios' | 'android' | 'web';
|
|
46
|
+
availableVersion?: string;
|
|
47
|
+
minimumVersion?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface MinimumVersionCheck {
|
|
50
|
+
isMet: boolean;
|
|
51
|
+
currentVersion: string;
|
|
52
|
+
minimumVersion: string;
|
|
53
|
+
updateRequired: boolean;
|
|
54
|
+
}
|
|
55
|
+
export interface AppStoreInfo {
|
|
56
|
+
url: string;
|
|
57
|
+
platform: 'ios' | 'android' | 'web';
|
|
58
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export var AppUpdateInstallStatus;
|
|
2
|
+
(function (AppUpdateInstallStatus) {
|
|
3
|
+
AppUpdateInstallStatus[AppUpdateInstallStatus["UNKNOWN"] = 0] = "UNKNOWN";
|
|
4
|
+
AppUpdateInstallStatus[AppUpdateInstallStatus["PENDING"] = 1] = "PENDING";
|
|
5
|
+
AppUpdateInstallStatus[AppUpdateInstallStatus["DOWNLOADING"] = 2] = "DOWNLOADING";
|
|
6
|
+
AppUpdateInstallStatus[AppUpdateInstallStatus["INSTALLING"] = 3] = "INSTALLING";
|
|
7
|
+
AppUpdateInstallStatus[AppUpdateInstallStatus["INSTALLED"] = 4] = "INSTALLED";
|
|
8
|
+
AppUpdateInstallStatus[AppUpdateInstallStatus["FAILED"] = 5] = "FAILED";
|
|
9
|
+
AppUpdateInstallStatus[AppUpdateInstallStatus["CANCELED"] = 6] = "CANCELED";
|
|
10
|
+
AppUpdateInstallStatus[AppUpdateInstallStatus["DOWNLOADED"] = 11] = "DOWNLOADED";
|
|
11
|
+
})(AppUpdateInstallStatus || (AppUpdateInstallStatus = {}));
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/app-update/types.ts"],"names":[],"mappings":"AA4BA,MAAM,CAAN,IAAY,sBASX;AATD,WAAY,sBAAsB;IAChC,yEAAW,CAAA;IACX,yEAAW,CAAA;IACX,iFAAe,CAAA;IACf,+EAAc,CAAA;IACd,6EAAa,CAAA;IACb,uEAAU,CAAA;IACV,2EAAY,CAAA;IACZ,gFAAe,CAAA;AACjB,CAAC,EATW,sBAAsB,KAAtB,sBAAsB,QASjC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BackgroundUpdateConfig, BackgroundUpdateStatus, BackgroundCheckResult } from '../definitions';
|
|
2
|
+
export declare class BackgroundScheduler {
|
|
3
|
+
private config;
|
|
4
|
+
private status;
|
|
5
|
+
configure(config: BackgroundUpdateConfig): void;
|
|
6
|
+
getStatus(): BackgroundUpdateStatus;
|
|
7
|
+
performCheck(): Promise<BackgroundCheckResult>;
|
|
8
|
+
private checkForUpdates;
|
|
9
|
+
private checkAppUpdate;
|
|
10
|
+
private checkLiveUpdate;
|
|
11
|
+
private sendNotification;
|
|
12
|
+
protected calculateNextCheckTime(): number;
|
|
13
|
+
protected shouldRespectBatteryOptimization(): boolean;
|
|
14
|
+
protected isNetworkConditionMet(): boolean;
|
|
15
|
+
protected isBatteryLevelSufficient(): boolean;
|
|
16
|
+
private compareVersions;
|
|
17
|
+
}
|