@appzung/react-native-code-push 5.7.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 +24 -0
- package/CONTRIBUTING.md +136 -0
- package/CodePush.js +666 -0
- package/CodePush.podspec +27 -0
- package/LICENSE.md +13 -0
- package/README.md +386 -0
- package/RestartManager.js +59 -0
- package/android/app/build.gradle +31 -0
- package/android/app/proguard-rules.pro +25 -0
- package/android/app/src/main/AndroidManifest.xml +10 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +395 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +37 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +34 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +102 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInstallMode.java +16 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidPublicKeyException.java +12 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidUpdateException.java +7 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushMalformedDataException.java +12 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +641 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNotInitializedException.java +12 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java +175 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUnknownException.java +12 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +369 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateState.java +15 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +267 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUtils.java +236 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgress.java +30 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgressCallback.java +5 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java +190 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/ReactInstanceHolder.java +17 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/SettingsManager.java +173 -0
- package/android/build.gradle +20 -0
- package/android/codepush.gradle +113 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/android/gradle.properties +20 -0
- package/android/gradlew +164 -0
- package/android/gradlew.bat +90 -0
- package/android/settings.gradle +1 -0
- package/docs/api-android.md +65 -0
- package/docs/api-ios.md +31 -0
- package/docs/api-js.md +592 -0
- package/docs/multi-deployment-testing-android.md +107 -0
- package/docs/multi-deployment-testing-ios.md +53 -0
- package/docs/setup-android.md +406 -0
- package/docs/setup-ios.md +229 -0
- package/docs/setup-windows.md +65 -0
- package/gulpfile.js +302 -0
- package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +34 -0
- package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +252 -0
- package/ios/CodePush/Base64/README.md +47 -0
- package/ios/CodePush/CodePush.h +235 -0
- package/ios/CodePush/CodePush.m +1041 -0
- package/ios/CodePush/CodePushConfig.m +116 -0
- package/ios/CodePush/CodePushDownloadHandler.m +130 -0
- package/ios/CodePush/CodePushErrorUtils.m +20 -0
- package/ios/CodePush/CodePushPackage.m +598 -0
- package/ios/CodePush/CodePushTelemetryManager.m +175 -0
- package/ios/CodePush/CodePushUpdateUtils.m +376 -0
- package/ios/CodePush/CodePushUtils.m +9 -0
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +69 -0
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +16 -0
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +51 -0
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +15 -0
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +55 -0
- package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +24 -0
- package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +41 -0
- package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +28 -0
- package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +205 -0
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +103 -0
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +322 -0
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +37 -0
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +145 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +35 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +551 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +23 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +43 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +230 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +31 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +113 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +38 -0
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +500 -0
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +18 -0
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +214 -0
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +23 -0
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +29 -0
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +19 -0
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +68 -0
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +18 -0
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +72 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +67 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +111 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +119 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +307 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +94 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +619 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +164 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +514 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +24 -0
- package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +11 -0
- package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +52 -0
- package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +5 -0
- package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +28 -0
- package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +70 -0
- package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +22 -0
- package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +34 -0
- package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +73 -0
- package/ios/CodePush/JWT/LICENSE +19 -0
- package/ios/CodePush/JWT/README.md +489 -0
- package/ios/CodePush/RCTConvert+CodePushInstallMode.m +20 -0
- package/ios/CodePush/RCTConvert+CodePushUpdateState.m +20 -0
- package/ios/CodePush/SSZipArchive/Common.h +81 -0
- package/ios/CodePush/SSZipArchive/README.md +1 -0
- package/ios/CodePush/SSZipArchive/SSZipArchive.h +76 -0
- package/ios/CodePush/SSZipArchive/SSZipArchive.m +691 -0
- package/ios/CodePush/SSZipArchive/aes/aes.h +198 -0
- package/ios/CodePush/SSZipArchive/aes/aes_via_ace.h +541 -0
- package/ios/CodePush/SSZipArchive/aes/aescrypt.c +294 -0
- package/ios/CodePush/SSZipArchive/aes/aeskey.c +548 -0
- package/ios/CodePush/SSZipArchive/aes/aesopt.h +739 -0
- package/ios/CodePush/SSZipArchive/aes/aestab.c +391 -0
- package/ios/CodePush/SSZipArchive/aes/aestab.h +173 -0
- package/ios/CodePush/SSZipArchive/aes/brg_endian.h +126 -0
- package/ios/CodePush/SSZipArchive/aes/brg_types.h +219 -0
- package/ios/CodePush/SSZipArchive/aes/entropy.c +54 -0
- package/ios/CodePush/SSZipArchive/aes/entropy.h +16 -0
- package/ios/CodePush/SSZipArchive/aes/fileenc.c +144 -0
- package/ios/CodePush/SSZipArchive/aes/fileenc.h +121 -0
- package/ios/CodePush/SSZipArchive/aes/hmac.c +145 -0
- package/ios/CodePush/SSZipArchive/aes/hmac.h +103 -0
- package/ios/CodePush/SSZipArchive/aes/prng.c +155 -0
- package/ios/CodePush/SSZipArchive/aes/prng.h +82 -0
- package/ios/CodePush/SSZipArchive/aes/pwd2key.c +103 -0
- package/ios/CodePush/SSZipArchive/aes/pwd2key.h +57 -0
- package/ios/CodePush/SSZipArchive/aes/sha1.c +258 -0
- package/ios/CodePush/SSZipArchive/aes/sha1.h +73 -0
- package/ios/CodePush/SSZipArchive/minizip/crypt.h +130 -0
- package/ios/CodePush/SSZipArchive/minizip/ioapi.c +369 -0
- package/ios/CodePush/SSZipArchive/minizip/ioapi.h +175 -0
- package/ios/CodePush/SSZipArchive/minizip/mztools.c +284 -0
- package/ios/CodePush/SSZipArchive/minizip/mztools.h +31 -0
- package/ios/CodePush/SSZipArchive/minizip/unzip.c +1839 -0
- package/ios/CodePush/SSZipArchive/minizip/unzip.h +248 -0
- package/ios/CodePush/SSZipArchive/minizip/zip.c +1910 -0
- package/ios/CodePush/SSZipArchive/minizip/zip.h +202 -0
- package/ios/CodePush.xcodeproj/project.pbxproj +937 -0
- package/ios/CodePush.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/ios/CodePush.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/logging.js +6 -0
- package/package-mixins.js +69 -0
- package/package.json +47 -0
- package/request-fetch-adapter.js +52 -0
- package/scripts/generateBundledResourcesHash.js +125 -0
- package/scripts/getFilesInFolder.js +19 -0
- package/scripts/postlink/android/postlink.js +87 -0
- package/scripts/postlink/ios/postlink.js +116 -0
- package/scripts/postlink/run.js +11 -0
- package/scripts/postunlink/android/postunlink.js +74 -0
- package/scripts/postunlink/ios/postunlink.js +87 -0
- package/scripts/postunlink/run.js +11 -0
- package/scripts/recordFilesBeforeBundleCommand.js +41 -0
- package/scripts/tools/linkToolsAndroid.js +57 -0
- package/scripts/tools/linkToolsIos.js +130 -0
- package/typings/react-native-code-push.d.ts +446 -0
- package/windows/CodePush/CodePush.csproj +128 -0
- package/windows/CodePush/CodePushUtils.cs +47 -0
- package/windows/CodePush/FileUtils.cs +40 -0
- package/windows/CodePush/Properties/AssemblyInfo.cs +29 -0
- package/windows/CodePush/Properties/CodePush.rd.xml +33 -0
- package/windows/CodePush/UpdateManager.cs +305 -0
- package/windows/CodePush/UpdateUtils.cs +46 -0
- package/windows/CodePush.Net46/Adapters/Http/HttpProgress.cs +28 -0
- package/windows/CodePush.Net46/Adapters/Storage/ApplicationDataContainer.cs +106 -0
- package/windows/CodePush.Net46/CodePush.Net46.csproj +103 -0
- package/windows/CodePush.Net46/CodePushUtils.cs +158 -0
- package/windows/CodePush.Net46/FileUtils.cs +55 -0
- package/windows/CodePush.Net46/Properties/AssemblyInfo.cs +36 -0
- package/windows/CodePush.Net46/UpdateManager.cs +330 -0
- package/windows/CodePush.Net46/UpdateUtils.cs +70 -0
- package/windows/CodePush.Net46/packages.config +5 -0
- package/windows/CodePush.Shared/CodePush.Shared.projitems +22 -0
- package/windows/CodePush.Shared/CodePush.Shared.shproj +13 -0
- package/windows/CodePush.Shared/CodePushConstants.cs +35 -0
- package/windows/CodePush.Shared/CodePushNativeModule.cs +329 -0
- package/windows/CodePush.Shared/CodePushReactPackage.cs +235 -0
- package/windows/CodePush.Shared/CodePushUtils.cs +70 -0
- package/windows/CodePush.Shared/InstallMode.cs +9 -0
- package/windows/CodePush.Shared/MinimumBackgroundListener.cs +44 -0
- package/windows/CodePush.Shared/SettingsManager.cs +148 -0
- package/windows/CodePush.Shared/TelemetryManager.cs +250 -0
- package/windows/CodePush.Shared/UpdateState.cs +9 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#import "CodePush.h"
|
|
2
|
+
#import <UIKit/UIKit.h>
|
|
3
|
+
|
|
4
|
+
@implementation CodePushConfig {
|
|
5
|
+
NSMutableDictionary *_configDictionary;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
static CodePushConfig *_currentConfig;
|
|
9
|
+
|
|
10
|
+
static NSString * const AppVersionConfigKey = @"appVersion";
|
|
11
|
+
static NSString * const BuildVersionConfigKey = @"buildVersion";
|
|
12
|
+
static NSString * const ClientUniqueIDConfigKey = @"clientUniqueId";
|
|
13
|
+
static NSString * const DeploymentKeyConfigKey = @"deploymentKey";
|
|
14
|
+
static NSString * const ServerURLConfigKey = @"serverUrl";
|
|
15
|
+
static NSString * const PublicKeyKey = @"publicKey";
|
|
16
|
+
|
|
17
|
+
+ (instancetype)current
|
|
18
|
+
{
|
|
19
|
+
return _currentConfig;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
+ (void)initialize
|
|
23
|
+
{
|
|
24
|
+
if (self == [CodePushConfig class]) {
|
|
25
|
+
_currentConfig = [[CodePushConfig alloc] init];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
- (instancetype)init
|
|
30
|
+
{
|
|
31
|
+
self = [super init];
|
|
32
|
+
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
|
|
33
|
+
|
|
34
|
+
NSString *appVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
|
|
35
|
+
NSString *buildVersion = [infoDictionary objectForKey:(NSString *)kCFBundleVersionKey];
|
|
36
|
+
NSString *deploymentKey = [infoDictionary objectForKey:@"CodePushDeploymentKey"];
|
|
37
|
+
NSString *serverURL = [infoDictionary objectForKey:@"CodePushServerURL"];
|
|
38
|
+
NSString *publicKey = [infoDictionary objectForKey:@"CodePushPublicKey"];
|
|
39
|
+
|
|
40
|
+
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
|
41
|
+
NSString *clientUniqueId = [userDefaults stringForKey:ClientUniqueIDConfigKey];
|
|
42
|
+
if (clientUniqueId == nil) {
|
|
43
|
+
clientUniqueId = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
|
|
44
|
+
[userDefaults setObject:clientUniqueId forKey:ClientUniqueIDConfigKey];
|
|
45
|
+
[userDefaults synchronize];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (!serverURL) {
|
|
49
|
+
serverURL = @"https://codepush.appzung.com/";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
_configDictionary = [NSMutableDictionary dictionary];
|
|
53
|
+
|
|
54
|
+
if (appVersion) [_configDictionary setObject:appVersion forKey:AppVersionConfigKey];
|
|
55
|
+
if (buildVersion) [_configDictionary setObject:buildVersion forKey:BuildVersionConfigKey];
|
|
56
|
+
if (serverURL) [_configDictionary setObject:serverURL forKey:ServerURLConfigKey];
|
|
57
|
+
if (clientUniqueId) [_configDictionary setObject:clientUniqueId forKey:ClientUniqueIDConfigKey];
|
|
58
|
+
if (deploymentKey) [_configDictionary setObject:deploymentKey forKey:DeploymentKeyConfigKey];
|
|
59
|
+
if (publicKey) [_configDictionary setObject:publicKey forKey:PublicKeyKey];
|
|
60
|
+
|
|
61
|
+
return self;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
- (NSString *)appVersion
|
|
65
|
+
{
|
|
66
|
+
return [_configDictionary objectForKey:AppVersionConfigKey];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
- (NSString *)buildVersion
|
|
70
|
+
{
|
|
71
|
+
return [_configDictionary objectForKey:BuildVersionConfigKey];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
- (NSDictionary *)configuration
|
|
75
|
+
{
|
|
76
|
+
return _configDictionary;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
- (NSString *)deploymentKey
|
|
80
|
+
{
|
|
81
|
+
return [_configDictionary objectForKey:DeploymentKeyConfigKey];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
- (NSString *)serverURL
|
|
85
|
+
{
|
|
86
|
+
return [_configDictionary objectForKey:ServerURLConfigKey];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
- (NSString *)clientUniqueId
|
|
90
|
+
{
|
|
91
|
+
return [_configDictionary objectForKey:ClientUniqueIDConfigKey];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
- (NSString *)publicKey
|
|
95
|
+
{
|
|
96
|
+
return [_configDictionary objectForKey:PublicKeyKey];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
- (void)setAppVersion:(NSString *)appVersion
|
|
100
|
+
{
|
|
101
|
+
[_configDictionary setValue:appVersion forKey:AppVersionConfigKey];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
- (void)setDeploymentKey:(NSString *)deploymentKey
|
|
105
|
+
{
|
|
106
|
+
[_configDictionary setValue:deploymentKey forKey:DeploymentKeyConfigKey];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
- (void)setServerURL:(NSString *)serverURL
|
|
110
|
+
{
|
|
111
|
+
[_configDictionary setValue:serverURL forKey:ServerURLConfigKey];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
//no setter for PublicKey, because it's need to be hard coded within Info.plist for safety
|
|
115
|
+
|
|
116
|
+
@end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#import "CodePush.h"
|
|
2
|
+
|
|
3
|
+
@implementation CodePushDownloadHandler {
|
|
4
|
+
// Header chars used to determine if the file is a zip.
|
|
5
|
+
char _header[4];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
- (id)init:(NSString *)downloadFilePath
|
|
9
|
+
operationQueue:(dispatch_queue_t)operationQueue
|
|
10
|
+
progressCallback:(void (^)(long long, long long))progressCallback
|
|
11
|
+
doneCallback:(void (^)(BOOL))doneCallback
|
|
12
|
+
failCallback:(void (^)(NSError *err))failCallback {
|
|
13
|
+
self.outputFileStream = [NSOutputStream outputStreamToFileAtPath:downloadFilePath
|
|
14
|
+
append:NO];
|
|
15
|
+
self.receivedContentLength = 0;
|
|
16
|
+
self.operationQueue = operationQueue;
|
|
17
|
+
self.progressCallback = progressCallback;
|
|
18
|
+
self.doneCallback = doneCallback;
|
|
19
|
+
self.failCallback = failCallback;
|
|
20
|
+
return self;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
- (void)download:(NSString *)url {
|
|
24
|
+
self.downloadUrl = url;
|
|
25
|
+
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
|
|
26
|
+
cachePolicy:NSURLRequestUseProtocolCachePolicy
|
|
27
|
+
timeoutInterval:60.0];
|
|
28
|
+
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
|
|
29
|
+
delegate:self
|
|
30
|
+
startImmediately:NO];
|
|
31
|
+
if ([NSOperationQueue instancesRespondToSelector:@selector(setUnderlyingQueue:)]) {
|
|
32
|
+
NSOperationQueue *delegateQueue = [NSOperationQueue new];
|
|
33
|
+
delegateQueue.underlyingQueue = self.operationQueue;
|
|
34
|
+
[connection setDelegateQueue:delegateQueue];
|
|
35
|
+
} else {
|
|
36
|
+
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop]
|
|
37
|
+
forMode:NSDefaultRunLoopMode];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
[connection start];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#pragma mark NSURLConnection Delegate Methods
|
|
44
|
+
|
|
45
|
+
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
|
|
46
|
+
willCacheResponse:(NSCachedURLResponse*)cachedResponse {
|
|
47
|
+
// Return nil to indicate not necessary to store a cached response for this connection
|
|
48
|
+
return nil;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
|
|
52
|
+
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
|
|
53
|
+
NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
|
|
54
|
+
if (statusCode >= 400) {
|
|
55
|
+
[self.outputFileStream close];
|
|
56
|
+
[connection cancel];
|
|
57
|
+
NSError *err = [CodePushErrorUtils errorWithMessage:[NSString stringWithFormat: @"Received %ld response from %@", (long)statusCode, self.downloadUrl]];
|
|
58
|
+
self.failCallback(err);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
self.expectedContentLength = response.expectedContentLength;
|
|
64
|
+
[self.outputFileStream open];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
|
|
68
|
+
if (self.receivedContentLength < 4) {
|
|
69
|
+
for (int i = 0; i < [data length]; i++) {
|
|
70
|
+
int headerOffset = (int)self.receivedContentLength + i;
|
|
71
|
+
if (headerOffset >= 4) {
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const char *bytes = [data bytes];
|
|
76
|
+
_header[headerOffset] = bytes[i];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
self.receivedContentLength = self.receivedContentLength + [data length];
|
|
81
|
+
|
|
82
|
+
NSInteger bytesLeft = [data length];
|
|
83
|
+
|
|
84
|
+
do {
|
|
85
|
+
NSInteger bytesWritten = [self.outputFileStream write:[data bytes]
|
|
86
|
+
maxLength:bytesLeft];
|
|
87
|
+
if (bytesWritten == -1) {
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
bytesLeft -= bytesWritten;
|
|
92
|
+
} while (bytesLeft > 0);
|
|
93
|
+
|
|
94
|
+
self.progressCallback(self.expectedContentLength, self.receivedContentLength);
|
|
95
|
+
|
|
96
|
+
// bytesLeft should not be negative.
|
|
97
|
+
assert(bytesLeft >= 0);
|
|
98
|
+
|
|
99
|
+
if (bytesLeft) {
|
|
100
|
+
[self.outputFileStream close];
|
|
101
|
+
[connection cancel];
|
|
102
|
+
self.failCallback([self.outputFileStream streamError]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
|
|
107
|
+
{
|
|
108
|
+
[self.outputFileStream close];
|
|
109
|
+
self.failCallback(error);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
|
|
113
|
+
[self.outputFileStream close];
|
|
114
|
+
if (self.receivedContentLength < 1) {
|
|
115
|
+
NSError *err = [CodePushErrorUtils errorWithMessage:[NSString stringWithFormat:@"Received empty response from %@", self.downloadUrl]];
|
|
116
|
+
self.failCallback(err);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// expectedContentLength might be -1 when NSURLConnection don't know the length(e.g. response encode with gzip)
|
|
121
|
+
if (self.expectedContentLength > 0) {
|
|
122
|
+
// We should have received all of the bytes if this is called.
|
|
123
|
+
assert(self.receivedContentLength == self.expectedContentLength);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
BOOL isZip = _header[0] == 'P' && _header[1] == 'K' && _header[2] == 3 && _header[3] == 4;
|
|
127
|
+
self.doneCallback(isZip);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#import "CodePush.h"
|
|
2
|
+
|
|
3
|
+
@implementation CodePushErrorUtils
|
|
4
|
+
|
|
5
|
+
static NSString *const CodePushErrorDomain = @"CodePushError";
|
|
6
|
+
static const int CodePushErrorCode = -1;
|
|
7
|
+
|
|
8
|
+
+ (NSError *)errorWithMessage:(NSString *)errorMessage
|
|
9
|
+
{
|
|
10
|
+
return [NSError errorWithDomain:CodePushErrorDomain
|
|
11
|
+
code:CodePushErrorCode
|
|
12
|
+
userInfo:@{ NSLocalizedDescriptionKey: NSLocalizedString(errorMessage, nil) }];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
+ (BOOL)isCodePushError:(NSError *)err
|
|
16
|
+
{
|
|
17
|
+
return err != nil && [CodePushErrorDomain isEqualToString:err.domain];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@end
|