@srcpush/react-native-code-push 1.0.3-feat-new-architecture.1 → 1.0.3-feat-new-arch.1
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/AlertAdapter.js +21 -2
- package/CONTRIBUTING.md +20 -9
- package/CodePush.js +17 -2
- package/LICENSE.md +2 -2
- package/README.md +15 -15
- package/SECURITY.md +4 -20
- package/android/app/build.gradle +19 -14
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +52 -10
- package/android/app/src/main/java/com/microsoft/codepush/react/{CodePushDialog.java → CodePushDialogImpl.java} +28 -28
- package/android/app/src/main/java/com/microsoft/codepush/react/{CodePushNativeModule.java → CodePushNativeModuleImpl.java} +93 -210
- package/android/app/src/newarch/java/com/microsoft/codepush/react/CodePushDialog.java +49 -0
- package/android/app/src/newarch/java/com/microsoft/codepush/react/CodePushNativeModule.java +143 -0
- package/android/app/src/oldarch/java/com/microsoft/codepush/react/CodePushDialog.java +49 -0
- package/android/app/src/oldarch/java/com/microsoft/codepush/react/CodePushNativeModule.java +141 -0
- package/docs/api-android.md +10 -10
- package/docs/api-ios.md +5 -5
- package/docs/api-js.md +17 -17
- package/docs/multi-deployment-testing-android.md +2 -2
- package/docs/multi-deployment-testing-ios.md +1 -1
- package/docs/setup-android.md +7 -7
- package/docs/setup-ios.md +9 -9
- package/docs/setup-windows.md +6 -6
- package/package.json +9 -9
- package/src/specs/NativeCodePush.ts +56 -0
- package/src/specs/NativeCodePushDialog.ts +19 -0
- package/tsconfig.json +4 -2
- package/tslint.json +21 -13
- package/.azurepipelines/build-rn-code-push-1es.yml +0 -104
- package/.azurepipelines/test-rn-code-push.yml +0 -94
- package/android/app/src/newarch/java/com/microsoft/codepush/react/CodePushNativeModuleSpec.java +0 -9
- package/android/app/src/oldarch/java/com/microsoft/codepush/react/CodePushNativeModuleSpec.java +0 -34
- package/src/NativeCodePush.ts +0 -39
- package/windows/CodePush/CodePush.def +0 -3
- package/windows/CodePush/CodePush.vcxproj +0 -198
- package/windows/CodePush/CodePush.vcxproj.filters +0 -91
- package/windows/CodePush/CodePushConfig.cpp +0 -104
- package/windows/CodePush/CodePushConfig.h +0 -66
- package/windows/CodePush/CodePushConfig.idl +0 -12
- package/windows/CodePush/CodePushDownloadHandler.cpp +0 -73
- package/windows/CodePush/CodePushDownloadHandler.h +0 -32
- package/windows/CodePush/CodePushNativeModule.cpp +0 -937
- package/windows/CodePush/CodePushNativeModule.h +0 -247
- package/windows/CodePush/CodePushPackage.cpp +0 -456
- package/windows/CodePush/CodePushPackage.h +0 -49
- package/windows/CodePush/CodePushTelemetryManager.cpp +0 -213
- package/windows/CodePush/CodePushTelemetryManager.h +0 -29
- package/windows/CodePush/CodePushUpdateUtils.cpp +0 -86
- package/windows/CodePush/CodePushUpdateUtils.h +0 -38
- package/windows/CodePush/CodePushUtils.cpp +0 -29
- package/windows/CodePush/CodePushUtils.h +0 -18
- package/windows/CodePush/FileUtils.cpp +0 -131
- package/windows/CodePush/FileUtils.h +0 -28
- package/windows/CodePush/PropertySheet.props +0 -16
- package/windows/CodePush/ReactPackageProvider.cpp +0 -15
- package/windows/CodePush/ReactPackageProvider.h +0 -22
- package/windows/CodePush/ReactPackageProvider.idl +0 -9
- package/windows/CodePush/miniz/LICENSE +0 -22
- package/windows/CodePush/miniz/miniz.c +0 -7657
- package/windows/CodePush/miniz/miniz.h +0 -1338
- package/windows/CodePush/miniz/readme.md +0 -37
- package/windows/CodePush/packages.config +0 -4
- package/windows/CodePush/pch.cpp +0 -1
- package/windows/CodePush/pch.h +0 -4
- package/windows-legacy/CodePush/CodePush.csproj +0 -128
- package/windows-legacy/CodePush/CodePushUtils.cs +0 -47
- package/windows-legacy/CodePush/FileUtils.cs +0 -40
- package/windows-legacy/CodePush/Properties/AssemblyInfo.cs +0 -29
- package/windows-legacy/CodePush/Properties/CodePush.rd.xml +0 -33
- package/windows-legacy/CodePush/UpdateManager.cs +0 -305
- package/windows-legacy/CodePush/UpdateUtils.cs +0 -46
- package/windows-legacy/CodePush.Net46/Adapters/Http/HttpProgress.cs +0 -28
- package/windows-legacy/CodePush.Net46/Adapters/Storage/ApplicationDataContainer.cs +0 -106
- package/windows-legacy/CodePush.Net46/CodePush.Net46.csproj +0 -103
- package/windows-legacy/CodePush.Net46/CodePushUtils.cs +0 -158
- package/windows-legacy/CodePush.Net46/FileUtils.cs +0 -55
- package/windows-legacy/CodePush.Net46/Properties/AssemblyInfo.cs +0 -36
- package/windows-legacy/CodePush.Net46/UpdateManager.cs +0 -330
- package/windows-legacy/CodePush.Net46/UpdateUtils.cs +0 -70
- package/windows-legacy/CodePush.Net46/packages.config +0 -5
- package/windows-legacy/CodePush.Net46.Test/ApplicationDataContainerTest.cs +0 -105
- package/windows-legacy/CodePush.Net46.Test/CodePush.Net46.Test.csproj +0 -137
- package/windows-legacy/CodePush.Net46.Test/Properties/AssemblyInfo.cs +0 -36
- package/windows-legacy/CodePush.Net46.Test/TelemetryManagerTest.cs +0 -117
- package/windows-legacy/CodePush.Net46.Test/app.config +0 -11
- package/windows-legacy/CodePush.Net46.Test/packages.config +0 -4
- package/windows-legacy/CodePush.Shared/CodePush.Shared.projitems +0 -22
- package/windows-legacy/CodePush.Shared/CodePush.Shared.shproj +0 -13
- package/windows-legacy/CodePush.Shared/CodePushConstants.cs +0 -35
- package/windows-legacy/CodePush.Shared/CodePushNativeModule.cs +0 -329
- package/windows-legacy/CodePush.Shared/CodePushReactPackage.cs +0 -235
- package/windows-legacy/CodePush.Shared/CodePushUtils.cs +0 -70
- package/windows-legacy/CodePush.Shared/InstallMode.cs +0 -9
- package/windows-legacy/CodePush.Shared/MinimumBackgroundListener.cs +0 -44
- package/windows-legacy/CodePush.Shared/SettingsManager.cs +0 -148
- package/windows-legacy/CodePush.Shared/TelemetryManager.cs +0 -250
- package/windows-legacy/CodePush.Shared/UpdateState.cs +0 -9
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
package com.microsoft.codepush.react;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Callback;
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
5
|
+
import com.facebook.react.module.annotations.ReactModule;
|
|
6
|
+
|
|
7
|
+
@ReactModule(name = CodePushDialog.NAME)
|
|
8
|
+
public class CodePushDialog extends NativeCodePushDialogSpec {
|
|
9
|
+
public static final String NAME = "CodePushDialog";
|
|
10
|
+
|
|
11
|
+
private final CodePushDialogImpl impl;
|
|
12
|
+
|
|
13
|
+
public CodePushDialog(ReactApplicationContext reactContext) {
|
|
14
|
+
super(reactContext);
|
|
15
|
+
impl = new CodePushDialogImpl(reactContext);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@Override
|
|
19
|
+
public String getName() {
|
|
20
|
+
return NAME;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public void showDialog(
|
|
25
|
+
String title,
|
|
26
|
+
String message,
|
|
27
|
+
String button1Text,
|
|
28
|
+
String button2Text,
|
|
29
|
+
Callback successCallback,
|
|
30
|
+
Callback errorCallback
|
|
31
|
+
) {
|
|
32
|
+
try {
|
|
33
|
+
impl.showDialog(title, message, button1Text, button2Text, successCallback, errorCallback);
|
|
34
|
+
} catch (Throwable e) {
|
|
35
|
+
if (errorCallback != null) errorCallback.invoke(e.getMessage());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@Override
|
|
40
|
+
public void addListener(String eventName) {
|
|
41
|
+
// no-op
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@Override
|
|
45
|
+
public void removeListeners(double count) {
|
|
46
|
+
// no-op
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
package com.microsoft.codepush.react;
|
|
2
|
+
|
|
3
|
+
import androidx.annotation.NonNull;
|
|
4
|
+
import androidx.annotation.OptIn;
|
|
5
|
+
|
|
6
|
+
import com.facebook.react.bridge.Promise;
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
8
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
9
|
+
import com.facebook.react.common.annotations.UnstableReactNativeAPI;
|
|
10
|
+
import com.facebook.react.module.annotations.ReactModule;
|
|
11
|
+
|
|
12
|
+
import java.util.Map;
|
|
13
|
+
|
|
14
|
+
@OptIn(markerClass = UnstableReactNativeAPI.class)
|
|
15
|
+
@ReactModule(name = CodePushNativeModule.NAME)
|
|
16
|
+
public class CodePushNativeModule extends NativeCodePushSpec {
|
|
17
|
+
public static final String NAME = "CodePush";
|
|
18
|
+
|
|
19
|
+
private final CodePushNativeModuleImpl impl;
|
|
20
|
+
|
|
21
|
+
public CodePushNativeModule(
|
|
22
|
+
ReactApplicationContext reactContext,
|
|
23
|
+
CodePush codePush,
|
|
24
|
+
CodePushUpdateManager codePushUpdateManager,
|
|
25
|
+
CodePushTelemetryManager codePushTelemetryManager,
|
|
26
|
+
SettingsManager settingsManager
|
|
27
|
+
) {
|
|
28
|
+
super(reactContext);
|
|
29
|
+
impl = new CodePushNativeModuleImpl(reactContext, codePush, codePushUpdateManager, codePushTelemetryManager, settingsManager);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@NonNull
|
|
33
|
+
@Override
|
|
34
|
+
public String getName() {
|
|
35
|
+
return NAME;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@Override
|
|
39
|
+
protected Map<String, Object> getTypedExportedConstants() {
|
|
40
|
+
return impl.getConstants();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@Override
|
|
44
|
+
public void allow(Promise promise) {
|
|
45
|
+
impl.allow(promise);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@Override
|
|
49
|
+
public void clearPendingRestart(Promise promise) {
|
|
50
|
+
impl.clearPendingRestart(promise);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@Override
|
|
54
|
+
public void disallow(Promise promise) {
|
|
55
|
+
impl.disallow(promise);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@Override
|
|
59
|
+
public void restartApp(boolean onlyIfUpdateIsPending, Promise promise) {
|
|
60
|
+
impl.restartApp(onlyIfUpdateIsPending, promise);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@Override
|
|
64
|
+
public void downloadUpdate(ReadableMap updatePackage, boolean notifyProgress, Promise promise) {
|
|
65
|
+
impl.downloadUpdate(updatePackage, notifyProgress, promise);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@Override
|
|
69
|
+
public void getConfiguration(Promise promise) {
|
|
70
|
+
impl.getConfiguration(promise);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@Override
|
|
74
|
+
public void getUpdateMetadata(double updateState, Promise promise) {
|
|
75
|
+
impl.getUpdateMetadata(updateState, promise);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@Override
|
|
79
|
+
public void getNewStatusReport(Promise promise) {
|
|
80
|
+
impl.getNewStatusReport(promise);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@Override
|
|
84
|
+
public void installUpdate(ReadableMap updatePackage, double installMode, double minimumBackgroundDuration, Promise promise) {
|
|
85
|
+
impl.installUpdate(updatePackage, installMode, minimumBackgroundDuration, promise);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@Override
|
|
89
|
+
public void isFailedUpdate(String packageHash, Promise promise) {
|
|
90
|
+
impl.isFailedUpdate(packageHash, promise);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@Override
|
|
94
|
+
public void getLatestRollbackInfo(Promise promise) {
|
|
95
|
+
impl.getLatestRollbackInfo(promise);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@Override
|
|
99
|
+
public void setLatestRollbackInfo(String packageHash, Promise promise) {
|
|
100
|
+
impl.setLatestRollbackInfo(packageHash, promise);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@Override
|
|
104
|
+
public void isFirstRun(String packageHash, Promise promise) {
|
|
105
|
+
impl.isFirstRun(packageHash, promise);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@Override
|
|
109
|
+
public void notifyApplicationReady(Promise promise) {
|
|
110
|
+
impl.notifyApplicationReady(promise);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@Override
|
|
114
|
+
public void recordStatusReported(ReadableMap statusReport) {
|
|
115
|
+
impl.recordStatusReported(statusReport);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
@Override
|
|
119
|
+
public void saveStatusReportForRetry(ReadableMap statusReport) {
|
|
120
|
+
impl.saveStatusReportForRetry(statusReport);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@Override
|
|
124
|
+
public void downloadAndReplaceCurrentBundle(String remoteBundleUrl) {
|
|
125
|
+
impl.downloadAndReplaceCurrentBundle(remoteBundleUrl);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@Override
|
|
129
|
+
public void clearUpdates() {
|
|
130
|
+
impl.clearUpdates();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@Override
|
|
134
|
+
public void addListener(String eventName) {
|
|
135
|
+
impl.addListener(eventName);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@Override
|
|
139
|
+
public void removeListeners(double count) {
|
|
140
|
+
impl.removeListeners(count);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
package com.microsoft.codepush.react;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.BaseJavaModule;
|
|
4
|
+
import com.facebook.react.bridge.Callback;
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
6
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
7
|
+
|
|
8
|
+
public class CodePushDialog extends BaseJavaModule {
|
|
9
|
+
public static final String NAME = "CodePushDialog";
|
|
10
|
+
|
|
11
|
+
private final CodePushDialogImpl impl;
|
|
12
|
+
|
|
13
|
+
public CodePushDialog(ReactApplicationContext reactContext) {
|
|
14
|
+
super(reactContext);
|
|
15
|
+
impl = new CodePushDialogImpl(reactContext);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@ReactMethod
|
|
19
|
+
public void showDialog(
|
|
20
|
+
final String title,
|
|
21
|
+
final String message,
|
|
22
|
+
final String button1Text,
|
|
23
|
+
final String button2Text,
|
|
24
|
+
final Callback successCallback,
|
|
25
|
+
Callback errorCallback
|
|
26
|
+
) {
|
|
27
|
+
try {
|
|
28
|
+
impl.showDialog(title, message, button1Text, button2Text, successCallback, errorCallback);
|
|
29
|
+
} catch (Throwable e) {
|
|
30
|
+
if (errorCallback != null) errorCallback.invoke(e.getMessage());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@ReactMethod
|
|
35
|
+
public void addListener(String eventName) {
|
|
36
|
+
// no-op
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@ReactMethod
|
|
40
|
+
public void removeListeners(double count) {
|
|
41
|
+
// no-op
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@Override
|
|
45
|
+
public String getName() {
|
|
46
|
+
return NAME;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
package com.microsoft.codepush.react;
|
|
2
|
+
|
|
3
|
+
import androidx.annotation.OptIn;
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.bridge.BaseJavaModule;
|
|
6
|
+
import com.facebook.react.bridge.Promise;
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
8
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
9
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
10
|
+
import com.facebook.react.common.annotations.UnstableReactNativeAPI;
|
|
11
|
+
|
|
12
|
+
import java.util.Map;
|
|
13
|
+
|
|
14
|
+
@OptIn(markerClass = UnstableReactNativeAPI.class)
|
|
15
|
+
public class CodePushNativeModule extends BaseJavaModule {
|
|
16
|
+
public static final String NAME = "CodePush";
|
|
17
|
+
|
|
18
|
+
private final CodePushNativeModuleImpl impl;
|
|
19
|
+
|
|
20
|
+
public CodePushNativeModule(
|
|
21
|
+
ReactApplicationContext reactContext,
|
|
22
|
+
CodePush codePush,
|
|
23
|
+
CodePushUpdateManager codePushUpdateManager,
|
|
24
|
+
CodePushTelemetryManager codePushTelemetryManager,
|
|
25
|
+
SettingsManager settingsManager
|
|
26
|
+
) {
|
|
27
|
+
super(reactContext);
|
|
28
|
+
impl = new CodePushNativeModuleImpl(reactContext, codePush, codePushUpdateManager, codePushTelemetryManager, settingsManager);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@Override
|
|
32
|
+
public Map<String, Object> getConstants() {
|
|
33
|
+
return impl.getConstants();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Override
|
|
37
|
+
public String getName() {
|
|
38
|
+
return NAME;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@ReactMethod
|
|
42
|
+
public void allow(Promise promise) {
|
|
43
|
+
impl.allow(promise);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@ReactMethod
|
|
47
|
+
public void clearPendingRestart(Promise promise) {
|
|
48
|
+
impl.clearPendingRestart(promise);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@ReactMethod
|
|
52
|
+
public void disallow(Promise promise) {
|
|
53
|
+
impl.disallow(promise);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@ReactMethod
|
|
57
|
+
public void restartApp(boolean onlyIfUpdateIsPending, Promise promise) {
|
|
58
|
+
impl.restartApp(onlyIfUpdateIsPending, promise);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@ReactMethod
|
|
62
|
+
public void downloadUpdate(ReadableMap updatePackage, boolean notifyProgress, Promise promise) {
|
|
63
|
+
impl.downloadUpdate(updatePackage, notifyProgress, promise);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@ReactMethod
|
|
67
|
+
public void getConfiguration(Promise promise) {
|
|
68
|
+
impl.getConfiguration(promise);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@ReactMethod
|
|
72
|
+
public void getUpdateMetadata(double updateState, Promise promise) {
|
|
73
|
+
impl.getUpdateMetadata(updateState, promise);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@ReactMethod
|
|
77
|
+
public void getNewStatusReport(Promise promise) {
|
|
78
|
+
impl.getNewStatusReport(promise);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@ReactMethod
|
|
82
|
+
public void installUpdate(ReadableMap updatePackage, double installMode, double minimumBackgroundDuration, Promise promise) {
|
|
83
|
+
impl.installUpdate(updatePackage, installMode, minimumBackgroundDuration, promise);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@ReactMethod
|
|
87
|
+
public void isFailedUpdate(String packageHash, Promise promise) {
|
|
88
|
+
impl.isFailedUpdate(packageHash, promise);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@ReactMethod
|
|
92
|
+
public void getLatestRollbackInfo(Promise promise) {
|
|
93
|
+
impl.getLatestRollbackInfo(promise);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@ReactMethod
|
|
97
|
+
public void setLatestRollbackInfo(String packageHash, Promise promise) {
|
|
98
|
+
impl.setLatestRollbackInfo(packageHash, promise);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@ReactMethod
|
|
102
|
+
public void isFirstRun(String packageHash, Promise promise) {
|
|
103
|
+
impl.isFirstRun(packageHash, promise);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@ReactMethod
|
|
107
|
+
public void notifyApplicationReady(Promise promise) {
|
|
108
|
+
impl.notifyApplicationReady(promise);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@ReactMethod
|
|
112
|
+
public void recordStatusReported(ReadableMap statusReport) {
|
|
113
|
+
impl.recordStatusReported(statusReport);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
@ReactMethod
|
|
117
|
+
public void saveStatusReportForRetry(ReadableMap statusReport) {
|
|
118
|
+
impl.saveStatusReportForRetry(statusReport);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@ReactMethod
|
|
122
|
+
public void downloadAndReplaceCurrentBundle(String remoteBundleUrl) {
|
|
123
|
+
impl.downloadAndReplaceCurrentBundle(remoteBundleUrl);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@ReactMethod
|
|
127
|
+
public void clearUpdates() {
|
|
128
|
+
impl.clearUpdates();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@ReactMethod
|
|
132
|
+
public void addListener(String eventName) {
|
|
133
|
+
impl.addListener(eventName);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@ReactMethod
|
|
137
|
+
public void removeListeners(double count) {
|
|
138
|
+
impl.removeListeners(count);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
package/docs/api-android.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
### Resource Configuration
|
|
2
2
|
|
|
3
|
-
Since `autolinking` uses `react-native.config.js` to link plugins, constructors are specified in that file. But you can override custom variables to manage the
|
|
3
|
+
Since `autolinking` uses `react-native.config.js` to link plugins, constructors are specified in that file. But you can override custom variables to manage the Source Push plugin by placing these values in string resources.
|
|
4
4
|
|
|
5
5
|
- **Public Key** - used for bundle verification in the Code Signing Feature. Please refer to [Code Signing](setup-android.md#code-signing-setup) section for more details about the Code Signing Feature.
|
|
6
|
-
To set the public key, you should add the content of the public key to `strings.xml` with name `CodePushPublicKey`.
|
|
6
|
+
To set the public key, you should add the content of the public key to `strings.xml` with name `CodePushPublicKey`. Source Push automatically gets this property and enables the Code Signing feature. For example:
|
|
7
7
|
|
|
8
8
|
```xml
|
|
9
9
|
<string moduleConfig="true" name="CodePushPublicKey">your-public-key</string>
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
- **Server Url** - used for specifying
|
|
13
|
-
The Default value: "<https://api.srcpush.com>" is overridden by adding your path to `strings.xml` with name `CodePushServerUrl`.
|
|
12
|
+
- **Server Url** - used for specifying Source Push Server Url.
|
|
13
|
+
The Default value: "<https://api.srcpush.com>" is overridden by adding your path to `strings.xml` with name `CodePushServerUrl`. Source Push automatically gets this property and will use this path to send requests. For example:
|
|
14
14
|
|
|
15
15
|
```xml
|
|
16
16
|
<string moduleConfig="true" name="CodePushServerUrl">https://api.srcpush.com</string>
|
|
@@ -22,21 +22,21 @@ The Java API is made available by importing the `com.microsoft.codepush.react.Co
|
|
|
22
22
|
|
|
23
23
|
#### CodePush
|
|
24
24
|
|
|
25
|
-
Constructs the
|
|
25
|
+
Constructs the Source Push client runtime and represents the `ReactPackage` instance that you add to you app's list of packages.
|
|
26
26
|
|
|
27
27
|
##### Constructors
|
|
28
28
|
|
|
29
|
-
- **CodePush(String deploymentKey, Activity mainActivity)** - Creates a new instance of the
|
|
29
|
+
- **CodePush(String deploymentKey, Activity mainActivity)** - Creates a new instance of the Source Push runtime, that will be used to query the service for updates via the provided deployment key. The `mainActivity` parameter should always be set to `this` when configuring your React packages list inside the `MainActivity` class. This constructor puts the Source Push runtime into "release mode", so if you want to enable debugging behavior, use the following constructor instead.
|
|
30
30
|
|
|
31
|
-
- **CodePush(String deploymentKey, Activity mainActivity, bool isDebugMode)** - Equivalent to the previous constructor but allows you to specify whether you want the
|
|
31
|
+
- **CodePush(String deploymentKey, Activity mainActivity, bool isDebugMode)** - Equivalent to the previous constructor but allows you to specify whether you want the Source Push runtime to be in debug mode or not. When using this constructor, the `isDebugMode` parameter should always be set to `BuildConfig.DEBUG` in order to stay synchronized with your build type. When putting Source Push into debug mode, the following behaviors are enabled:
|
|
32
32
|
|
|
33
|
-
1. Old
|
|
33
|
+
1. Old Source Push updates aren't deleted from storage whenever a new binary is deployed to the emulator/device. This behavior enables you to deploy new binaries, without bumping the version during development, and without continuously getting the same update every time your app calls `sync`.
|
|
34
34
|
|
|
35
|
-
2. The local cache that the React Native runtime maintains in debug mode is deleted whenever a
|
|
35
|
+
2. The local cache that the React Native runtime maintains in debug mode is deleted whenever a Source Push update is installed. This ensures that when the app is restarted after an update is applied, you will see the expected changes. As soon as [this PR](https://github.com/facebook/react-native/pull/4738) is merged, we won't need to do this anymore.
|
|
36
36
|
|
|
37
37
|
- **CodePush(String deploymentKey, Context context, boolean isDebugMode, Integer publicKeyResourceDescriptor)** - Equivalent to the previous constructor, but allows you to specify the public key resource descriptor needed to read public key content. Please refer to [Code Signing](setup-android.md#code-signing-setup) section for more details about the Code Signing Feature.
|
|
38
38
|
|
|
39
|
-
- **CodePush(String deploymentKey, Context context, boolean isDebugMode, String serverUrl)** Constructor allows you to specify
|
|
39
|
+
- **CodePush(String deploymentKey, Context context, boolean isDebugMode, String serverUrl)** Constructor allows you to specify Source Push Server Url. The Default value: `"https://api.srcpush.com"` is overridden by value specified in `serverUrl`.
|
|
40
40
|
|
|
41
41
|
##### Public Methods
|
|
42
42
|
|
package/docs/api-ios.md
CHANGED
|
@@ -8,15 +8,15 @@ Contains static methods for retreiving the `NSURL` that represents the most rece
|
|
|
8
8
|
|
|
9
9
|
The `CodePush` class' methods can be thought of as composite resolvers which always load the appropriate bundle, in order to accommodate the following scenarios:
|
|
10
10
|
|
|
11
|
-
1. When an end-user installs your app from the store (like `1.0.0`), they will get the JS bundle that is contained within the binary. This is the behavior you would get without using
|
|
11
|
+
1. When an end-user installs your app from the store (like `1.0.0`), they will get the JS bundle that is contained within the binary. This is the behavior you would get without using Source Push, but we make sure it doesn't break :)
|
|
12
12
|
|
|
13
|
-
2. As soon as you begin releasing
|
|
13
|
+
2. As soon as you begin releasing Source Push updates, your end-users will get the JS bundle that represents the latest release for the configured deployment. This is the behavior that allows you to iterate beyond what you shipped to the store.
|
|
14
14
|
|
|
15
|
-
3. As soon as you release an update to the app store (like `1.1.0`), and your end-users update it, they will once again get the JS bundle that is contained within the binary. This behavior ensures that
|
|
15
|
+
3. As soon as you release an update to the app store (like `1.1.0`), and your end-users update it, they will once again get the JS bundle that is contained within the binary. This behavior ensures that Source Push updates that targetted a previous binary version aren't used (since we don't know if they would work), and your end-users always have a working version of your app.
|
|
16
16
|
|
|
17
|
-
4. Repeat #2 and #3 as the
|
|
17
|
+
4. Repeat #2 and #3 as the Source Push releases and app store releases continue on into infinity (and beyond?)
|
|
18
18
|
|
|
19
|
-
Because of this behavior, you can safely deploy updates to both the app store(s) and
|
|
19
|
+
Because of this behavior, you can safely deploy updates to both the app store(s) and Source Push as necesary, and rest assured that your end-users will always get the most recent version.
|
|
20
20
|
|
|
21
21
|
##### Methods
|
|
22
22
|
|
package/docs/api-js.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## API Reference
|
|
2
2
|
|
|
3
|
-
The
|
|
3
|
+
The Source Push plugin is made up of two components:
|
|
4
4
|
|
|
5
5
|
1. A JavaScript module, which can be imported/required, and allows the app to interact with the service during runtime (for example check for updates, inspect the metadata about the currently running app update).
|
|
6
6
|
|
|
@@ -14,23 +14,23 @@ When you require `react-native-code-push`, the module object provides the follow
|
|
|
14
14
|
|
|
15
15
|
* [allowRestart](#codepushallowrestart): Re-allows programmatic restarts to occur as a result of an update being installed, and optionally, immediately restarts the app if a pending update had attempted to restart the app while restarts were disallowed. This is an advanced API and is only necessary if your app explicitly disallowed restarts via the `disallowRestart` method.
|
|
16
16
|
|
|
17
|
-
* [checkForUpdate](#codepushcheckforupdate): Asks the
|
|
17
|
+
* [checkForUpdate](#codepushcheckforupdate): Asks the Source Push service whether the configured app deployment has an update available.
|
|
18
18
|
|
|
19
|
-
* [disallowRestart](#codepushdisallowrestart): Temporarily disallows any programmatic restarts to occur as a result of a
|
|
19
|
+
* [disallowRestart](#codepushdisallowrestart): Temporarily disallows any programmatic restarts to occur as a result of a Source Push update being installed. This is an advanced API, and is useful when a component within your app (for example an onboarding process) needs to ensure that no end-user interruptions can occur during its lifetime.
|
|
20
20
|
|
|
21
|
-
* [getCurrentPackage](#codepushgetcurrentpackage): Retrieves the metadata about the currently installed update (like description, installation time, size). *NOTE: As of `v1.10.3-beta` of the
|
|
21
|
+
* [getCurrentPackage](#codepushgetcurrentpackage): Retrieves the metadata about the currently installed update (like description, installation time, size). *NOTE: As of `v1.10.3-beta` of the Source Push module, this method is deprecated in favor of [`getUpdateMetadata`](#codepushgetupdatemetadata)*.
|
|
22
22
|
|
|
23
23
|
* [getUpdateMetadata](#codepushgetupdatemetadata): Retrieves the metadata for an installed update (like description, mandatory).
|
|
24
24
|
|
|
25
|
-
* [notifyAppReady](#codepushnotifyappready): Notifies the
|
|
25
|
+
* [notifyAppReady](#codepushnotifyappready): Notifies the Source Push runtime that an installed update is considered successful. If you are manually checking for and installing updates (i.e. not using the [sync](#codepushsync) method to handle it all for you), then this method **MUST** be called; otherwise Source Push will treat the update as failed and rollback to the previous version when the app next restarts.
|
|
26
26
|
|
|
27
27
|
* [restartApp](#codepushrestartapp): Immediately restarts the app. If there is an update pending, it will be immediately displayed to the end user. Otherwise, calling this method simply has the same behavior as the end user killing and restarting the process.
|
|
28
28
|
|
|
29
|
-
* [sync](#codepushsync): Allows checking for an update, downloading it and installing it, all with a single call. Unless you need custom UI and/or behavior, we recommend most developers to use this method when integrating
|
|
29
|
+
* [sync](#codepushsync): Allows checking for an update, downloading it and installing it, all with a single call. Unless you need custom UI and/or behavior, we recommend most developers to use this method when integrating Source Push into their apps
|
|
30
30
|
|
|
31
|
-
* [clearUpdates](#clearupdates): Clear all downloaded
|
|
31
|
+
* [clearUpdates](#clearupdates): Clear all downloaded Source Push updates. This is useful when switching to a different deployment which may have an older release than the current package.
|
|
32
32
|
|
|
33
|
-
_Note: we don’t recommend to use this method in scenarios other than that (
|
|
33
|
+
_Note: we don’t recommend to use this method in scenarios other than that (Source Push will call this method automatically when needed in other cases) as it could lead to unpredictable behavior._
|
|
34
34
|
|
|
35
35
|
#### codePush
|
|
36
36
|
|
|
@@ -162,7 +162,7 @@ Called when the sync process moves from one stage to another in the overall upda
|
|
|
162
162
|
|
|
163
163
|
##### codePushDownloadDidProgress (event hook)
|
|
164
164
|
|
|
165
|
-
Called periodically when an available update is being downloaded from the
|
|
165
|
+
Called periodically when an available update is being downloaded from the Source Push server. The method is called with a `DownloadProgress` object, which contains the following two properties:
|
|
166
166
|
|
|
167
167
|
* __totalBytes__ *(Number)* - The total number of bytes expected to be received for this update (i.e. the size of the set of files which changed from the previous release).
|
|
168
168
|
|
|
@@ -176,15 +176,15 @@ codePush.allowRestart(): void;
|
|
|
176
176
|
|
|
177
177
|
Re-allows programmatic restarts to occur, that would have otherwise been rejected due to a previous call to `disallowRestart`. If `disallowRestart` was never called in the first place, then calling this method will simply result in a no-op.
|
|
178
178
|
|
|
179
|
-
If a
|
|
179
|
+
If a Source Push update is currently pending, which attempted to restart the app (for example it used `InstallMode.IMMEDIATE`), but was blocked due to `disallowRestart` having been called, then calling `allowRestart` will result in an immediate restart. This allows the update to be applied as soon as possible, without interrupting the end user during critical workflows (for example an onboarding process).
|
|
180
180
|
|
|
181
181
|
For example, calling `allowRestart` would trigger an immediate restart if either of the three scenarios mentioned in the [`disallowRestart` docs](#codepushdisallowrestart) occured after `disallowRestart` was called. However, calling `allowRestart` wouldn't trigger a restart if the following were true:
|
|
182
182
|
|
|
183
|
-
1. No
|
|
183
|
+
1. No Source Push updates were installed since the last time `disallowRestart` was called, and therefore, there isn't any need to restart anyways.
|
|
184
184
|
|
|
185
|
-
2. There is currently a pending
|
|
185
|
+
2. There is currently a pending Source Push update, but it was installed via `InstallMode.ON_NEXT_RESTART`, and therefore, doesn't require a programmatic restart.
|
|
186
186
|
|
|
187
|
-
3. There is currently a pending
|
|
187
|
+
3. There is currently a pending Source Push update, but it was installed via `InstallMode.ON_NEXT_RESUME` and the app hasn't been put into the background yet, and therefore, there isn't a need to programmatically restart yet.
|
|
188
188
|
|
|
189
189
|
4. No calls to `restartApp` were made since the last time `disallowRestart` was called.
|
|
190
190
|
|
|
@@ -198,7 +198,7 @@ See [disallowRestart](#codepushdisallowrestart) for an example of how this metho
|
|
|
198
198
|
codePush.checkForUpdate(deploymentKey: String = null, handleBinaryVersionMismatchCallback: (update: RemotePackage) => void): Promise<RemotePackage>;
|
|
199
199
|
```
|
|
200
200
|
|
|
201
|
-
Queries the
|
|
201
|
+
Queries the Source Push service to see whether the configured app deployment has an update available. By default, it will use the deployment key that is configured in your `Info.plist` file (iOS), or `MainActivity.java` file (Android), but you can override that by specifying a value via the optional `deploymentKey` parameter. This can be useful when you want to dynamically "redirect" a user to a specific deployment, such as allowing "early access" via an easter egg or a user setting switch.
|
|
202
202
|
|
|
203
203
|
Second optional parameter `handleBinaryVersionMismatchCallback` is an optional callback function that can be used to notify user if there are any binary update.
|
|
204
204
|
E.g. consider a use-case where currently installed binary version is 1.0.1 with label(codepush label) v1. Later native code was changed in the dev cycle and binary version was updated to 1.0.2. When code-push update check is triggered we ignore updates having binary version mismatch (because the update is not targeting to the binary version of currently installed app). In this case installed app (1.0.1) will ignore the update targeting version 1.0.2. You can use `handleBinaryVersionMismatchCallback` to provide a hook to handle such situations.
|
|
@@ -240,15 +240,15 @@ codePush.disallowRestart(): void;
|
|
|
240
240
|
|
|
241
241
|
Temporarily disallows programmatic restarts to occur as a result of either of following scenarios:
|
|
242
242
|
|
|
243
|
-
1. A
|
|
244
|
-
2. A
|
|
243
|
+
1. A Source Push update is installed using `InstallMode.IMMEDIATE`
|
|
244
|
+
2. A Source Push update is installed using `InstallMode.ON_NEXT_RESUME` and the app is resumed from the background (optionally being throttled by the `minimumBackgroundDuration` property)
|
|
245
245
|
3. The `restartApp` method was called
|
|
246
246
|
|
|
247
247
|
*NOTE: #1 and #2 effectively work by calling `restartApp` for you, so you can think of `disallowRestart` as blocking any call to `restartApp`, regardless if your app calls it directly or indirectly.*
|
|
248
248
|
|
|
249
249
|
After calling this method, any calls to `sync` would still be allowed to check for an update, download it and install it, but an attempt to restart the app would be queued until `allowRestart` is called. This way, the restart request is captured and can be "flushed" whenever you want to allow it to occur.
|
|
250
250
|
|
|
251
|
-
This is an advanced API, and is primarily useful when individual components within your app (like an onboarding process) need to ensure that no end-user interruptions can occur during their lifetime, while continuing to allow the app to keep syncing with the
|
|
251
|
+
This is an advanced API, and is primarily useful when individual components within your app (like an onboarding process) need to ensure that no end-user interruptions can occur during their lifetime, while continuing to allow the app to keep syncing with the Source Push server at its own pace and using whatever install modes are appropriate. This has the benefit of allowing the app to discover and download available updates as soon as possible, while also preventing any disruptions during key end-user experiences.
|
|
252
252
|
|
|
253
253
|
As an alternative, you could also choose to simply use `InstallMode.ON_NEXT_RESTART` whenever calling `sync` (which will never attempt to programmatically restart the app), and then explicity calling `restartApp` at points in your app that you know it is "safe" to do so. `disallowRestart` provides an alternative approach to this when the code that synchronizes with the CodePush server is separate from the code/components that want to enforce a no-restart policy.
|
|
254
254
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
>
|
|
5
5
|
> Complete demo configured with "multi-deployment testing" feature is [here](https://github.com/microsoft/react-native-code-push/files/1314118/rncp1004.zip).
|
|
6
6
|
|
|
7
|
-
The [Android Gradle plugin](https://google.github.io/android-gradle-dsl/current/index.html) allows you to define custom config settings for each "build type" (like debug, release). This mechanism allows you to easily configure your debug builds to use your
|
|
7
|
+
The [Android Gradle plugin](https://google.github.io/android-gradle-dsl/current/index.html) allows you to define custom config settings for each "build type" (like debug, release). This mechanism allows you to easily configure your debug builds to use your Source Push staging deployment key and your release builds to use your Source Push production deployment key.
|
|
8
8
|
|
|
9
9
|
*NOTE: As a reminder, you can retrieve these keys by running `srcpush deployment ls <appName> -k` from your terminal.*
|
|
10
10
|
|
|
@@ -22,7 +22,7 @@ To set this up, perform the following steps:
|
|
|
22
22
|
buildTypes {
|
|
23
23
|
debug {
|
|
24
24
|
...
|
|
25
|
-
// Note:
|
|
25
|
+
// Note: Source Push updates should not be tested in Debug mode as they are overriden by the RN packager. However, because Source Push checks for updates in all modes, we must supply a key.
|
|
26
26
|
resValue "string", "CodePushDeploymentKey", '""'
|
|
27
27
|
...
|
|
28
28
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
> * **without using cocoa pods**: [link](https://github.com/microsoft/react-native-code-push/files/1259957/rncp976.copy.zip)
|
|
8
8
|
> * **using cocoa pods**: [link](https://github.com/microsoft/react-native-code-push/files/1172217/rncp893.copy.zip)
|
|
9
9
|
|
|
10
|
-
Xcode allows you to define custom build settings for each "configuration" (like debug, release), which can then be referenced as the value of keys within the `Info.plist` file (like the `CodePushDeploymentKey` setting). This mechanism allows you to easily configure your builds to produce binaries, which are configured to synchronize with different
|
|
10
|
+
Xcode allows you to define custom build settings for each "configuration" (like debug, release), which can then be referenced as the value of keys within the `Info.plist` file (like the `CodePushDeploymentKey` setting). This mechanism allows you to easily configure your builds to produce binaries, which are configured to synchronize with different Source Push deployments.
|
|
11
11
|
|
|
12
12
|
To set this up, perform the following steps:
|
|
13
13
|
|
package/docs/setup-android.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* [Plugin Installation and Configuration for React Native 0.76 version and above](#plugin-installation-and-configuration-for-react-native-060-version-and-above-android)
|
|
4
4
|
* [Code Signing setup](#code-signing-setup)
|
|
5
5
|
|
|
6
|
-
In order to integrate
|
|
6
|
+
In order to integrate Source Push into your Android project, please perform the following steps:
|
|
7
7
|
|
|
8
8
|
### Plugin Installation and Configuration for React Native 0.76 version and above (Android)
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ In order to integrate CodePush into your Android project, please perform the fol
|
|
|
15
15
|
...
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
2. Update the `MainApplication` file to use
|
|
18
|
+
2. Update the `MainApplication` file to use Source Push via the following changes:
|
|
19
19
|
|
|
20
20
|
For React Native 0.76 and above: update the `MainApplication.kt`
|
|
21
21
|
|
|
@@ -35,7 +35,7 @@ In order to integrate CodePush into your Android project, please perform the fol
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
// 2. Override the getJSBundleFile method in order to let
|
|
38
|
-
// the
|
|
38
|
+
// the Source Push runtime determine where to get the JS
|
|
39
39
|
// bundle location from on each app start
|
|
40
40
|
override fun getJSBundleFile(): String {
|
|
41
41
|
return CodePush.getJSBundleFile()
|
|
@@ -46,7 +46,7 @@ In order to integrate CodePush into your Android project, please perform the fol
|
|
|
46
46
|
|
|
47
47
|
3. Add the Deployment key to `strings.xml`:
|
|
48
48
|
|
|
49
|
-
To let the
|
|
49
|
+
To let the Source Push runtime know which deployment it should query for updates, open your app's `strings.xml` file and
|
|
50
50
|
add a new string named `CodePushDeploymentKey`, whose value is the key of the deployment you want to configure this app against
|
|
51
51
|
(like the key for the `Staging` deployment for the `FooBar` app). You can retrieve this value by running `srcpush deployment ls <appName> -k`
|
|
52
52
|
in the Source Push CLI (the `-k` or `--displayKeys` flag is necessary since keys aren't displayed by default) or take in [Source Push UI](https://console.srcpush.com/applications)
|
|
@@ -55,7 +55,7 @@ The "friendly name" is intended only for authenticated management usage from the
|
|
|
55
55
|
|
|
56
56
|

|
|
57
57
|
|
|
58
|
-
In order to effectively make use of the `Staging` and `Production` deployments that were created along with your
|
|
58
|
+
In order to effectively make use of the `Staging` and `Production` deployments that were created along with your Source Push app, refer to the [multi-deployment testing](../README.md#multi-deployment-testing) docs below before actually moving your app's usage of Source Push into production.
|
|
59
59
|
|
|
60
60
|
Your `strings.xml` should look like this:
|
|
61
61
|
|
|
@@ -68,11 +68,11 @@ The "friendly name" is intended only for authenticated management usage from the
|
|
|
68
68
|
|
|
69
69
|
*Note: If you need to dynamically use a different deployment, you can also override your deployment key in JS code using [Code-Push options](./api-js.md#CodePushOptions)*
|
|
70
70
|
|
|
71
|
-
In order to effectively make use of the `Staging` and `Production` deployments that were created along with your
|
|
71
|
+
In order to effectively make use of the `Staging` and `Production` deployments that were created along with your Source Push app, refer to the [multi-deployment testing](../README.md#multi-deployment-testing) docs below before actually moving your app's usage of Source Push into production.
|
|
72
72
|
|
|
73
73
|
### Code Signing setup
|
|
74
74
|
|
|
75
|
-
You can self sign bundles during release and verify its signature before installation of update. For more info about Code Signing please refer to [relevant
|
|
75
|
+
You can self sign bundles during release and verify its signature before installation of update. For more info about Code Signing please refer to [relevant Source Push documentation section](https://docs.srcpush.com).
|
|
76
76
|
In order to use Public Key for Code Signing you need to do following steps:
|
|
77
77
|
|
|
78
78
|
Add `CodePushPublicKey` string item to `/path_to_your_app/android/app/src/main/res/values/strings.xml`. It may look like this:
|