@appzung/react-native-code-push 8.3.2 → 10.0.0-rc1
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/CodePush.js +22 -19
- package/CodePush.podspec +3 -3
- package/LICENSE.md +1 -1
- package/README.md +159 -296
- package/android/app/.gradle/config.properties +2 -0
- package/android/app/build.gradle +2 -0
- package/android/app/local.properties +8 -0
- package/android/app/src/main/AndroidManifest.xml +1 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +27 -21
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +5 -5
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInstallMode.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidPublicKeyException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidUpdateException.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushMalformedDataException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +5 -5
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNotInitializedException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java +14 -14
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUnknownException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateState.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +16 -9
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUtils.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgress.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgressCallback.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/ReactInstanceHolder.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/SettingsManager.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/TLSSocketFactory.java +1 -1
- package/android/build.gradle +3 -0
- package/android/codepush.gradle +3 -3
- package/docs/advanced-usage.md +56 -0
- package/docs/api-android.md +12 -75
- package/docs/api-ios.md +5 -17
- package/docs/api-js.md +18 -55
- package/docs/setup-android.md +15 -397
- package/docs/setup-ios.md +24 -198
- package/docs/setup-windows.md +7 -74
- package/ios/CodePush/CodePush.h +4 -4
- package/ios/CodePush/CodePush.m +10 -9
- package/ios/CodePush/CodePushConfig.m +14 -11
- package/ios/CodePush/CodePushPackage.m +60 -60
- package/ios/CodePush/CodePushTelemetryManager.m +13 -13
- package/ios/CodePush.xcodeproj/project.pbxproj +24 -470
- package/ios/PrivacyInfo.xcprivacy +31 -0
- package/package.json +27 -24
- package/react-native.config.js +1 -1
- package/scripts/generateBundledResourcesHash.js +1 -1
- package/scripts/getFilesInFolder.js +1 -1
- package/scripts/recordFilesBeforeBundleCommand.js +1 -1
- package/typings/react-native-code-push.d.ts +22 -22
- package/windows/CodePush/CodePushConfig.cpp +3 -3
- package/windows/CodePush/CodePushConfig.h +3 -3
- package/windows/CodePush/CodePushNativeModule.cpp +27 -27
- package/windows/CodePush/CodePushNativeModule.h +4 -4
- package/windows/CodePush/CodePushTelemetryManager.cpp +12 -12
- package/windows/CodePush/CodePushTelemetryManager.h +1 -1
- package/.azurepipelines/build-rn-code-push-1es.yml +0 -104
- package/.azurepipelines/test-rn-code-push.yml +0 -94
- package/.config/CredScanSuppressions.json +0 -14
- package/SECURITY.md +0 -41
- package/docs/multi-deployment-testing-android.md +0 -148
- package/docs/multi-deployment-testing-ios.md +0 -59
- package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +0 -34
- package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +0 -252
- package/ios/CodePush/Base64/README.md +0 -47
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +0 -69
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +0 -16
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +0 -51
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +0 -15
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +0 -55
- package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +0 -24
- package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +0 -41
- package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +0 -28
- package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +0 -205
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +0 -103
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +0 -322
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +0 -37
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +0 -145
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +0 -35
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +0 -551
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +0 -23
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +0 -43
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +0 -230
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +0 -31
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +0 -113
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +0 -38
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +0 -500
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +0 -18
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +0 -214
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +0 -23
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +0 -29
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +0 -19
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +0 -68
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +0 -18
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +0 -72
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +0 -67
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +0 -111
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +0 -119
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +0 -307
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +0 -94
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +0 -619
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +0 -164
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +0 -514
- package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +0 -24
- package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +0 -11
- package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +0 -52
- package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +0 -5
- package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +0 -28
- package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +0 -70
- package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +0 -22
- package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +0 -34
- package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +0 -73
- package/ios/CodePush/JWT/LICENSE +0 -19
- package/ios/CodePush/JWT/README.md +0 -489
- package/ios/CodePush/SSZipArchive/Common.h +0 -81
- package/ios/CodePush/SSZipArchive/README.md +0 -1
- package/ios/CodePush/SSZipArchive/SSZipArchive.h +0 -76
- package/ios/CodePush/SSZipArchive/SSZipArchive.m +0 -691
- package/ios/CodePush/SSZipArchive/aes/aes.h +0 -198
- package/ios/CodePush/SSZipArchive/aes/aes_via_ace.h +0 -541
- package/ios/CodePush/SSZipArchive/aes/aescrypt.c +0 -294
- package/ios/CodePush/SSZipArchive/aes/aeskey.c +0 -548
- package/ios/CodePush/SSZipArchive/aes/aesopt.h +0 -739
- package/ios/CodePush/SSZipArchive/aes/aestab.c +0 -391
- package/ios/CodePush/SSZipArchive/aes/aestab.h +0 -173
- package/ios/CodePush/SSZipArchive/aes/brg_endian.h +0 -126
- package/ios/CodePush/SSZipArchive/aes/brg_types.h +0 -219
- package/ios/CodePush/SSZipArchive/aes/entropy.c +0 -54
- package/ios/CodePush/SSZipArchive/aes/entropy.h +0 -16
- package/ios/CodePush/SSZipArchive/aes/fileenc.c +0 -144
- package/ios/CodePush/SSZipArchive/aes/fileenc.h +0 -121
- package/ios/CodePush/SSZipArchive/aes/hmac.c +0 -145
- package/ios/CodePush/SSZipArchive/aes/hmac.h +0 -103
- package/ios/CodePush/SSZipArchive/aes/prng.c +0 -155
- package/ios/CodePush/SSZipArchive/aes/prng.h +0 -82
- package/ios/CodePush/SSZipArchive/aes/pwd2key.c +0 -103
- package/ios/CodePush/SSZipArchive/aes/pwd2key.h +0 -57
- package/ios/CodePush/SSZipArchive/aes/sha1.c +0 -258
- package/ios/CodePush/SSZipArchive/aes/sha1.h +0 -73
- package/ios/CodePush/SSZipArchive/minizip/crypt.h +0 -130
- package/ios/CodePush/SSZipArchive/minizip/ioapi.c +0 -369
- package/ios/CodePush/SSZipArchive/minizip/ioapi.h +0 -175
- package/ios/CodePush/SSZipArchive/minizip/mztools.c +0 -284
- package/ios/CodePush/SSZipArchive/minizip/mztools.h +0 -31
- package/ios/CodePush/SSZipArchive/minizip/unzip.c +0 -1839
- package/ios/CodePush/SSZipArchive/minizip/unzip.h +0 -248
- package/ios/CodePush/SSZipArchive/minizip/zip.c +0 -1910
- package/ios/CodePush/SSZipArchive/minizip/zip.h +0 -202
- package/scripts/postlink/android/postlink.js +0 -87
- package/scripts/postlink/ios/postlink.js +0 -116
- package/scripts/postlink/run.js +0 -11
- package/scripts/postunlink/android/postunlink.js +0 -74
- package/scripts/postunlink/ios/postunlink.js +0 -87
- package/scripts/postunlink/run.js +0 -11
- package/scripts/tools/linkToolsAndroid.js +0 -57
- package/scripts/tools/linkToolsIos.js +0 -130
- 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
|
@@ -31,7 +31,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
31
31
|
NSString *downloadedBundle = [NSString stringWithContentsOfURL:urlRequest
|
|
32
32
|
encoding:NSUTF8StringEncoding
|
|
33
33
|
error:&error];
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
if (error) {
|
|
36
36
|
CPLog(@"Error downloading from URL %@", remoteBundleUrl);
|
|
37
37
|
} else {
|
|
@@ -55,7 +55,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
55
55
|
NSString *newUpdateFolderPath = [self getPackageFolderPath:newUpdateHash];
|
|
56
56
|
NSString *newUpdateMetadataPath = [newUpdateFolderPath stringByAppendingPathComponent:UpdateMetadataFileName];
|
|
57
57
|
NSError *error;
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
if ([[NSFileManager defaultManager] fileExistsAtPath:newUpdateFolderPath]) {
|
|
60
60
|
// This removes any stale data in newUpdateFolderPath that could have been left
|
|
61
61
|
// uncleared due to a crash or error during the download or install process.
|
|
@@ -66,20 +66,20 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
66
66
|
withIntermediateDirectories:YES
|
|
67
67
|
attributes:nil
|
|
68
68
|
error:&error];
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
// Ensure that none of the CodePush updates we store on disk are
|
|
71
71
|
// ever included in the end users iTunes and/or iCloud backups
|
|
72
72
|
NSURL *codePushURL = [NSURL fileURLWithPath:[self getCodePushPath]];
|
|
73
73
|
[codePushURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil];
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
if (error) {
|
|
77
77
|
return failCallback(error);
|
|
78
78
|
}
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
NSString *downloadFilePath = [self getDownloadFilePath];
|
|
81
81
|
NSString *bundleFilePath = [newUpdateFolderPath stringByAppendingPathComponent:UpdateBundleFileName];
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
CodePushDownloadHandler *downloadHandler = [[CodePushDownloadHandler alloc]
|
|
84
84
|
init:downloadFilePath
|
|
85
85
|
operationQueue:operationQueue
|
|
@@ -99,7 +99,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
|
|
102
|
+
|
|
103
103
|
NSError *nonFailingError = nil;
|
|
104
104
|
[SSZipArchive unzipFileAtPath:downloadFilePath
|
|
105
105
|
toDestination:unzippedFolderPath];
|
|
@@ -109,10 +109,10 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
109
109
|
CPLog(@"Error deleting downloaded file: %@", nonFailingError);
|
|
110
110
|
nonFailingError = nil;
|
|
111
111
|
}
|
|
112
|
-
|
|
112
|
+
|
|
113
113
|
NSString *diffManifestFilePath = [unzippedFolderPath stringByAppendingPathComponent:DiffManifestFileName];
|
|
114
114
|
BOOL isDiffUpdate = [[NSFileManager defaultManager] fileExistsAtPath:diffManifestFilePath];
|
|
115
|
-
|
|
115
|
+
|
|
116
116
|
if (isDiffUpdate) {
|
|
117
117
|
// Copy the current package to the new package.
|
|
118
118
|
NSString *currentPackageFolderPath = [self getCurrentPackageFolderPath:&error];
|
|
@@ -120,7 +120,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
120
120
|
failCallback(error);
|
|
121
121
|
return;
|
|
122
122
|
}
|
|
123
|
-
|
|
123
|
+
|
|
124
124
|
if (currentPackageFolderPath == nil) {
|
|
125
125
|
// Currently running the binary version, copy files from the bundled resources
|
|
126
126
|
NSString *newUpdateCodePushPath = [newUpdateFolderPath stringByAppendingPathComponent:[CodePushUpdateUtils manifestFolderPrefix]];
|
|
@@ -132,7 +132,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
132
132
|
failCallback(error);
|
|
133
133
|
return;
|
|
134
134
|
}
|
|
135
|
-
|
|
135
|
+
|
|
136
136
|
[[NSFileManager defaultManager] copyItemAtPath:[CodePush bundleAssetsPath]
|
|
137
137
|
toPath:[newUpdateCodePushPath stringByAppendingPathComponent:[CodePushUpdateUtils assetsFolderName]]
|
|
138
138
|
error:&error];
|
|
@@ -140,7 +140,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
140
140
|
failCallback(error);
|
|
141
141
|
return;
|
|
142
142
|
}
|
|
143
|
-
|
|
143
|
+
|
|
144
144
|
[[NSFileManager defaultManager] copyItemAtPath:[[CodePush binaryBundleURL] path]
|
|
145
145
|
toPath:[newUpdateCodePushPath stringByAppendingPathComponent:[[CodePush binaryBundleURL] lastPathComponent]]
|
|
146
146
|
error:&error];
|
|
@@ -157,7 +157,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
157
157
|
return;
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
-
|
|
160
|
+
|
|
161
161
|
// Delete files mentioned in the manifest.
|
|
162
162
|
NSString *manifestContent = [NSString stringWithContentsOfFile:diffManifestFilePath
|
|
163
163
|
encoding:NSUTF8StringEncoding
|
|
@@ -166,7 +166,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
166
166
|
failCallback(error);
|
|
167
167
|
return;
|
|
168
168
|
}
|
|
169
|
-
|
|
169
|
+
|
|
170
170
|
NSData *data = [manifestContent dataUsingEncoding:NSUTF8StringEncoding];
|
|
171
171
|
NSDictionary *manifestJSON = [NSJSONSerialization JSONObjectWithData:data
|
|
172
172
|
options:kNilOptions
|
|
@@ -183,7 +183,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
|
-
|
|
186
|
+
|
|
187
187
|
[[NSFileManager defaultManager] removeItemAtPath:diffManifestFilePath
|
|
188
188
|
error:&error];
|
|
189
189
|
if (error) {
|
|
@@ -191,7 +191,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
191
191
|
return;
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
-
|
|
194
|
+
|
|
195
195
|
[CodePushUpdateUtils copyEntriesInFolder:unzippedFolderPath
|
|
196
196
|
destFolder:newUpdateFolderPath
|
|
197
197
|
error:&error];
|
|
@@ -199,34 +199,34 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
199
199
|
failCallback(error);
|
|
200
200
|
return;
|
|
201
201
|
}
|
|
202
|
-
|
|
202
|
+
|
|
203
203
|
[[NSFileManager defaultManager] removeItemAtPath:unzippedFolderPath
|
|
204
204
|
error:&nonFailingError];
|
|
205
205
|
if (nonFailingError) {
|
|
206
206
|
CPLog(@"Error deleting downloaded file: %@", nonFailingError);
|
|
207
207
|
nonFailingError = nil;
|
|
208
208
|
}
|
|
209
|
-
|
|
209
|
+
|
|
210
210
|
NSString *relativeBundlePath = [CodePushUpdateUtils findMainBundleInFolder:newUpdateFolderPath
|
|
211
211
|
expectedFileName:expectedBundleFileName
|
|
212
212
|
error:&error];
|
|
213
|
-
|
|
213
|
+
|
|
214
214
|
if (error) {
|
|
215
215
|
failCallback(error);
|
|
216
216
|
return;
|
|
217
217
|
}
|
|
218
|
-
|
|
218
|
+
|
|
219
219
|
if (relativeBundlePath) {
|
|
220
220
|
[mutableUpdatePackage setValue:relativeBundlePath forKey:RelativeBundlePathKey];
|
|
221
221
|
} else {
|
|
222
|
-
NSString *errorMessage = [NSString stringWithFormat:@"Update is invalid - A JS bundle file named \"%@\" could not be found within the downloaded contents. Please ensure that your app is syncing with the correct
|
|
223
|
-
|
|
222
|
+
NSString *errorMessage = [NSString stringWithFormat:@"Update is invalid - A JS bundle file named \"%@\" could not be found within the downloaded contents. Please ensure that your app is syncing with the correct release channel and that you are releasing your CodePush updates using the exact same JS bundle file name that was shipped with your app's binary.", expectedBundleFileName];
|
|
223
|
+
|
|
224
224
|
error = [CodePushErrorUtils errorWithMessage:errorMessage];
|
|
225
|
-
|
|
225
|
+
|
|
226
226
|
failCallback(error);
|
|
227
227
|
return;
|
|
228
228
|
}
|
|
229
|
-
|
|
229
|
+
|
|
230
230
|
if ([[NSFileManager defaultManager] fileExistsAtPath:newUpdateMetadataPath]) {
|
|
231
231
|
[[NSFileManager defaultManager] removeItemAtPath:newUpdateMetadataPath
|
|
232
232
|
error:&error];
|
|
@@ -237,12 +237,12 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
237
237
|
}
|
|
238
238
|
|
|
239
239
|
CPLog((isDiffUpdate) ? @"Applying diff update." : @"Applying full update.");
|
|
240
|
-
|
|
240
|
+
|
|
241
241
|
BOOL isSignatureVerificationEnabled = (publicKey != nil);
|
|
242
|
-
|
|
242
|
+
|
|
243
243
|
NSString *signatureFilePath = [CodePushUpdateUtils getSignatureFilePath:newUpdateFolderPath];
|
|
244
244
|
BOOL isSignatureAppearedInBundle = [[NSFileManager defaultManager] fileExistsAtPath:signatureFilePath];
|
|
245
|
-
|
|
245
|
+
|
|
246
246
|
if (isSignatureVerificationEnabled) {
|
|
247
247
|
if (isSignatureAppearedInBundle) {
|
|
248
248
|
if (![CodePushUpdateUtils verifyFolderHash:newUpdateFolderPath
|
|
@@ -252,7 +252,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
252
252
|
if (!error) {
|
|
253
253
|
error = [CodePushErrorUtils errorWithMessage:@"The update contents failed the data integrity check."];
|
|
254
254
|
}
|
|
255
|
-
|
|
255
|
+
|
|
256
256
|
failCallback(error);
|
|
257
257
|
return;
|
|
258
258
|
} else {
|
|
@@ -281,7 +281,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
281
281
|
failCallback(error);
|
|
282
282
|
return;
|
|
283
283
|
}
|
|
284
|
-
|
|
284
|
+
|
|
285
285
|
} else {
|
|
286
286
|
BOOL needToVerifyHash;
|
|
287
287
|
if (isSignatureAppearedInBundle) {
|
|
@@ -300,7 +300,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
300
300
|
if (!error) {
|
|
301
301
|
error = [CodePushErrorUtils errorWithMessage:@"The update contents failed the data integrity check."];
|
|
302
302
|
}
|
|
303
|
-
|
|
303
|
+
|
|
304
304
|
failCallback(error);
|
|
305
305
|
return;
|
|
306
306
|
} else {
|
|
@@ -321,13 +321,13 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
321
321
|
return;
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
|
-
|
|
324
|
+
|
|
325
325
|
NSData *updateSerializedData = [NSJSONSerialization dataWithJSONObject:mutableUpdatePackage
|
|
326
326
|
options:0
|
|
327
327
|
error:&error];
|
|
328
328
|
NSString *packageJsonString = [[NSString alloc] initWithData:updateSerializedData
|
|
329
329
|
encoding:NSUTF8StringEncoding];
|
|
330
|
-
|
|
330
|
+
|
|
331
331
|
[packageJsonString writeToFile:newUpdateMetadataPath
|
|
332
332
|
atomically:YES
|
|
333
333
|
encoding:NSUTF8StringEncoding
|
|
@@ -338,9 +338,9 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
338
338
|
doneCallback();
|
|
339
339
|
}
|
|
340
340
|
}
|
|
341
|
-
|
|
341
|
+
|
|
342
342
|
failCallback:failCallback];
|
|
343
|
-
|
|
343
|
+
|
|
344
344
|
[downloadHandler download:updatePackage[@"downloadUrl"]];
|
|
345
345
|
}
|
|
346
346
|
|
|
@@ -350,7 +350,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
350
350
|
if ([CodePush isUsingTestConfiguration]) {
|
|
351
351
|
codePushPath = [codePushPath stringByAppendingPathComponent:@"TestPackages"];
|
|
352
352
|
}
|
|
353
|
-
|
|
353
|
+
|
|
354
354
|
return codePushPath;
|
|
355
355
|
}
|
|
356
356
|
|
|
@@ -367,17 +367,17 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
367
367
|
+ (NSString *)getCurrentPackageBundlePath:(NSError **)error
|
|
368
368
|
{
|
|
369
369
|
NSString *packageFolder = [self getCurrentPackageFolderPath:error];
|
|
370
|
-
|
|
370
|
+
|
|
371
371
|
if (!packageFolder) {
|
|
372
372
|
return nil;
|
|
373
373
|
}
|
|
374
|
-
|
|
374
|
+
|
|
375
375
|
NSDictionary *currentPackage = [self getCurrentPackage:error];
|
|
376
|
-
|
|
376
|
+
|
|
377
377
|
if (!currentPackage) {
|
|
378
378
|
return nil;
|
|
379
379
|
}
|
|
380
|
-
|
|
380
|
+
|
|
381
381
|
NSString *relativeBundlePath = [currentPackage objectForKey:RelativeBundlePathKey];
|
|
382
382
|
if (relativeBundlePath) {
|
|
383
383
|
return [packageFolder stringByAppendingPathComponent:relativeBundlePath];
|
|
@@ -392,24 +392,24 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
392
392
|
if (!info) {
|
|
393
393
|
return nil;
|
|
394
394
|
}
|
|
395
|
-
|
|
395
|
+
|
|
396
396
|
return info[@"currentPackage"];
|
|
397
397
|
}
|
|
398
398
|
|
|
399
399
|
+ (NSString *)getCurrentPackageFolderPath:(NSError **)error
|
|
400
400
|
{
|
|
401
401
|
NSDictionary *info = [self getCurrentPackageInfo:error];
|
|
402
|
-
|
|
402
|
+
|
|
403
403
|
if (!info) {
|
|
404
404
|
return nil;
|
|
405
405
|
}
|
|
406
|
-
|
|
406
|
+
|
|
407
407
|
NSString *packageHash = info[@"currentPackage"];
|
|
408
|
-
|
|
408
|
+
|
|
409
409
|
if (!packageHash) {
|
|
410
410
|
return nil;
|
|
411
411
|
}
|
|
412
|
-
|
|
412
|
+
|
|
413
413
|
return [self getPackageFolderPath:packageHash];
|
|
414
414
|
}
|
|
415
415
|
|
|
@@ -419,14 +419,14 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
419
419
|
if (![[NSFileManager defaultManager] fileExistsAtPath:statusFilePath]) {
|
|
420
420
|
return [NSMutableDictionary dictionary];
|
|
421
421
|
}
|
|
422
|
-
|
|
422
|
+
|
|
423
423
|
NSString *content = [NSString stringWithContentsOfFile:statusFilePath
|
|
424
424
|
encoding:NSUTF8StringEncoding
|
|
425
425
|
error:error];
|
|
426
426
|
if (!content) {
|
|
427
427
|
return nil;
|
|
428
428
|
}
|
|
429
|
-
|
|
429
|
+
|
|
430
430
|
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
|
|
431
431
|
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data
|
|
432
432
|
options:kNilOptions
|
|
@@ -434,7 +434,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
434
434
|
if (!json) {
|
|
435
435
|
return nil;
|
|
436
436
|
}
|
|
437
|
-
|
|
437
|
+
|
|
438
438
|
return [json mutableCopy];
|
|
439
439
|
}
|
|
440
440
|
|
|
@@ -448,18 +448,18 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
448
448
|
{
|
|
449
449
|
NSString *updateDirectoryPath = [self getPackageFolderPath:packageHash];
|
|
450
450
|
NSString *updateMetadataFilePath = [updateDirectoryPath stringByAppendingPathComponent:UpdateMetadataFileName];
|
|
451
|
-
|
|
451
|
+
|
|
452
452
|
if (![[NSFileManager defaultManager] fileExistsAtPath:updateMetadataFilePath]) {
|
|
453
453
|
return nil;
|
|
454
454
|
}
|
|
455
|
-
|
|
455
|
+
|
|
456
456
|
NSString *updateMetadataString = [NSString stringWithContentsOfFile:updateMetadataFilePath
|
|
457
457
|
encoding:NSUTF8StringEncoding
|
|
458
458
|
error:error];
|
|
459
459
|
if (!updateMetadataString) {
|
|
460
460
|
return nil;
|
|
461
461
|
}
|
|
462
|
-
|
|
462
|
+
|
|
463
463
|
NSData *updateMetadata = [updateMetadataString dataUsingEncoding:NSUTF8StringEncoding];
|
|
464
464
|
return [NSJSONSerialization JSONObjectWithData:updateMetadata
|
|
465
465
|
options:kNilOptions
|
|
@@ -477,7 +477,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
477
477
|
if (!packageHash) {
|
|
478
478
|
return nil;
|
|
479
479
|
}
|
|
480
|
-
|
|
480
|
+
|
|
481
481
|
return [CodePushPackage getPackage:packageHash error:error];
|
|
482
482
|
}
|
|
483
483
|
|
|
@@ -487,7 +487,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
487
487
|
if (!info) {
|
|
488
488
|
return nil;
|
|
489
489
|
}
|
|
490
|
-
|
|
490
|
+
|
|
491
491
|
return info[@"previousPackage"];
|
|
492
492
|
}
|
|
493
493
|
|
|
@@ -507,11 +507,11 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
507
507
|
{
|
|
508
508
|
NSString *packageHash = updatePackage[@"packageHash"];
|
|
509
509
|
NSMutableDictionary *info = [self getCurrentPackageInfo:error];
|
|
510
|
-
|
|
510
|
+
|
|
511
511
|
if (!info) {
|
|
512
512
|
return NO;
|
|
513
513
|
}
|
|
514
|
-
|
|
514
|
+
|
|
515
515
|
if (packageHash && [packageHash isEqualToString:info[@"currentPackage"]]) {
|
|
516
516
|
// The current package is already the one being installed, so we should no-op.
|
|
517
517
|
return YES;
|
|
@@ -542,7 +542,7 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
542
542
|
}
|
|
543
543
|
[info setValue:info[@"currentPackage"] forKey:@"previousPackage"];
|
|
544
544
|
}
|
|
545
|
-
|
|
545
|
+
|
|
546
546
|
[info setValue:packageHash forKey:@"currentPackage"];
|
|
547
547
|
return [self updateCurrentPackageInfo:info
|
|
548
548
|
error:error];
|
|
@@ -556,23 +556,23 @@ static NSString *const UnzippedFolderName = @"unzipped";
|
|
|
556
556
|
CPLog(@"Error getting current package info: %@", error);
|
|
557
557
|
return;
|
|
558
558
|
}
|
|
559
|
-
|
|
560
|
-
NSString *currentPackageFolderPath = [self getCurrentPackageFolderPath:&error];
|
|
559
|
+
|
|
560
|
+
NSString *currentPackageFolderPath = [self getCurrentPackageFolderPath:&error];
|
|
561
561
|
if (!currentPackageFolderPath) {
|
|
562
562
|
CPLog(@"Error getting current package folder path: %@", error);
|
|
563
563
|
return;
|
|
564
564
|
}
|
|
565
|
-
|
|
565
|
+
|
|
566
566
|
NSError *deleteError;
|
|
567
567
|
BOOL result = [[NSFileManager defaultManager] removeItemAtPath:currentPackageFolderPath
|
|
568
568
|
error:&deleteError];
|
|
569
569
|
if (!result) {
|
|
570
570
|
CPLog(@"Error deleting current package contents at %@ error %@", currentPackageFolderPath, deleteError);
|
|
571
571
|
}
|
|
572
|
-
|
|
572
|
+
|
|
573
573
|
[info setValue:info[@"previousPackage"] forKey:@"currentPackage"];
|
|
574
574
|
[info removeObjectForKey:@"previousPackage"];
|
|
575
|
-
|
|
575
|
+
|
|
576
576
|
[self updateCurrentPackageInfo:info error:&error];
|
|
577
577
|
}
|
|
578
578
|
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
static NSString *const AppVersionKey = @"appVersion";
|
|
4
4
|
static NSString *const DeploymentFailed = @"DeploymentFailed";
|
|
5
|
-
static NSString *const
|
|
5
|
+
static NSString *const ReleaseChannelPublicIDKey = @"releaseChannelPublicId";
|
|
6
6
|
static NSString *const DeploymentSucceeded = @"DeploymentSucceeded";
|
|
7
7
|
static NSString *const LabelKey = @"label";
|
|
8
8
|
static NSString *const LastDeploymentReportKey = @"CODE_PUSH_LAST_DEPLOYMENT_REPORT";
|
|
9
9
|
static NSString *const PackageKey = @"package";
|
|
10
|
-
static NSString *const
|
|
10
|
+
static NSString *const PreviousReleaseChannelPublicIDKey = @"previousReleaseChannelPublicId";
|
|
11
11
|
static NSString *const PreviousLabelOrAppVersionKey = @"previousLabelOrAppVersion";
|
|
12
12
|
static NSString *const RetryDeploymentReportKey = @"CODE_PUSH_RETRY_DEPLOYMENT_REPORT";
|
|
13
13
|
static NSString *const StatusKey = @"status";
|
|
@@ -22,12 +22,12 @@ static NSString *const StatusKey = @"status";
|
|
|
22
22
|
return @{ AppVersionKey: appVersion };
|
|
23
23
|
} else if (![previousStatusReportIdentifier isEqualToString:appVersion]) {
|
|
24
24
|
if ([self isStatusReportIdentifierCodePushLabel:previousStatusReportIdentifier]) {
|
|
25
|
-
NSString *
|
|
25
|
+
NSString *previousReleaseChannelPublicId = [self getReleaseChannelPublicIdFromStatusReportIdentifier:previousStatusReportIdentifier];
|
|
26
26
|
NSString *previousLabel = [self getVersionLabelFromStatusReportIdentifier:previousStatusReportIdentifier];
|
|
27
27
|
[self clearRetryStatusReport];
|
|
28
28
|
return @{
|
|
29
29
|
AppVersionKey: appVersion,
|
|
30
|
-
|
|
30
|
+
PreviousReleaseChannelPublicIDKey: previousReleaseChannelPublicId,
|
|
31
31
|
PreviousLabelOrAppVersionKey: previousLabel
|
|
32
32
|
};
|
|
33
33
|
} else {
|
|
@@ -77,12 +77,12 @@ static NSString *const StatusKey = @"status";
|
|
|
77
77
|
} else if (![previousStatusReportIdentifier isEqualToString:currentPackageIdentifier]) {
|
|
78
78
|
[self clearRetryStatusReport];
|
|
79
79
|
if ([self isStatusReportIdentifierCodePushLabel:previousStatusReportIdentifier]) {
|
|
80
|
-
NSString *
|
|
80
|
+
NSString *previousReleaseChannelPublicId = [self getReleaseChannelPublicIdFromStatusReportIdentifier:previousStatusReportIdentifier];
|
|
81
81
|
NSString *previousLabel = [self getVersionLabelFromStatusReportIdentifier:previousStatusReportIdentifier];
|
|
82
82
|
return @{
|
|
83
83
|
PackageKey: currentPackage,
|
|
84
84
|
StatusKey: DeploymentSucceeded,
|
|
85
|
-
|
|
85
|
+
PreviousReleaseChannelPublicIDKey: previousReleaseChannelPublicId,
|
|
86
86
|
PreviousLabelOrAppVersionKey: previousLabel
|
|
87
87
|
};
|
|
88
88
|
} else {
|
|
@@ -105,7 +105,7 @@ static NSString *const StatusKey = @"status";
|
|
|
105
105
|
if ([DeploymentFailed isEqualToString:statusReport[StatusKey]]) {
|
|
106
106
|
return;
|
|
107
107
|
}
|
|
108
|
-
|
|
108
|
+
|
|
109
109
|
if (statusReport[AppVersionKey]) {
|
|
110
110
|
[self saveStatusReportedForIdentifier:statusReport[AppVersionKey]];
|
|
111
111
|
} else if (statusReport[PackageKey]) {
|
|
@@ -130,19 +130,19 @@ static NSString *const StatusKey = @"status";
|
|
|
130
130
|
[preferences synchronize];
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
+ (NSString *)
|
|
133
|
+
+ (NSString *)getReleaseChannelPublicIdFromStatusReportIdentifier:(NSString *)statusReportIdentifier
|
|
134
134
|
{
|
|
135
135
|
return [[statusReportIdentifier componentsSeparatedByString:@":"] firstObject];
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
+ (NSString *)getPackageStatusReportIdentifier:(NSDictionary *)package
|
|
139
139
|
{
|
|
140
|
-
// Because
|
|
141
|
-
// combination of the
|
|
142
|
-
NSString *
|
|
140
|
+
// Because release channels can be dynamically switched, we use a
|
|
141
|
+
// combination of the release channel and label as the packageIdentifier.
|
|
142
|
+
NSString *releaseChannelPublicId = [package objectForKey:ReleaseChannelPublicIDKey];
|
|
143
143
|
NSString *label = [package objectForKey:LabelKey];
|
|
144
|
-
if (
|
|
145
|
-
return [[
|
|
144
|
+
if (releaseChannelPublicId && label) {
|
|
145
|
+
return [[releaseChannelPublicId stringByAppendingString:@":"] stringByAppendingString:label];
|
|
146
146
|
} else {
|
|
147
147
|
return nil;
|
|
148
148
|
}
|