This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.

130 lines
4.8 KiB
Mathematica
Raw Normal View History

2021-04-02 02:24:13 +03:00
// Copyright 2019 650 Industries. All rights reserved.
#import <EXUpdates/EXUpdatesConfig.h>
#import <EXUpdates/EXUpdatesDatabase.h>
#import <EXUpdates/EXUpdatesFileDownloader.h>
#import <EXUpdates/EXUpdatesModule.h>
#import <EXUpdates/EXUpdatesRemoteAppLoader.h>
#import <EXUpdates/EXUpdatesService.h>
#import <EXUpdates/EXUpdatesUpdate.h>
@interface EXUpdatesModule ()
@property (nonatomic, weak) id<EXUpdatesInterface> updatesService;
@end
@implementation EXUpdatesModule
UM_EXPORT_MODULE(ExpoUpdates);
- (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry
{
_updatesService = [moduleRegistry getModuleImplementingProtocol:@protocol(EXUpdatesInterface)];
}
- (NSDictionary *)constantsToExport
{
if (!_updatesService.isStarted) {
return @{
@"isEnabled": @(NO)
};
}
EXUpdatesUpdate *launchedUpdate = _updatesService.launchedUpdate;
if (!launchedUpdate) {
return @{
@"isEnabled": @(NO)
};
} else {
return @{
@"isEnabled": @(YES),
@"isUsingEmbeddedAssets": @(_updatesService.isUsingEmbeddedAssets),
@"updateId": launchedUpdate.updateId.UUIDString ?: @"",
@"manifest": launchedUpdate.rawManifest ?: @{},
@"releaseChannel": _updatesService.config.releaseChannel,
@"localAssets": _updatesService.assetFilesMap ?: @{},
@"isEmergencyLaunch": @(_updatesService.isEmergencyLaunch)
};
}
}
UM_EXPORT_METHOD_AS(reload,
reloadAsync:(UMPromiseResolveBlock)resolve
reject:(UMPromiseRejectBlock)reject)
{
if (!_updatesService.canRelaunch) {
reject(@"ERR_UPDATES_DISABLED", @"The updates module controller has not been properly initialized. If you're in development mode, you cannot use this method. Otherwise, make sure you have called [[EXUpdatesAppController sharedInstance] start].", nil);
return;
}
[_updatesService requestRelaunchWithCompletion:^(BOOL success) {
if (success) {
resolve(nil);
} else {
reject(@"ERR_UPDATES_RELOAD", @"Could not reload application. Ensure you have set the `bridge` property of EXUpdatesAppController.", nil);
}
}];
}
UM_EXPORT_METHOD_AS(checkForUpdateAsync,
checkForUpdateAsync:(UMPromiseResolveBlock)resolve
reject:(UMPromiseRejectBlock)reject)
{
if (!_updatesService.isStarted) {
reject(@"ERR_UPDATES_DISABLED", @"The updates module controller has not been properly initialized. If you're in development mode, you cannot check for updates. Otherwise, make sure you have called [[EXUpdatesAppController sharedInstance] start].", nil);
return;
}
EXUpdatesFileDownloader *fileDownloader = [[EXUpdatesFileDownloader alloc] initWithUpdatesConfig:_updatesService.config];
[fileDownloader downloadManifestFromURL:_updatesService.config.updateUrl
withDatabase:_updatesService.database
cacheDirectory:_updatesService.directory
successBlock:^(EXUpdatesUpdate *update) {
EXUpdatesUpdate *launchedUpdate = self->_updatesService.launchedUpdate;
id<EXUpdatesSelectionPolicy> selectionPolicy = self->_updatesService.selectionPolicy;
if ([selectionPolicy shouldLoadNewUpdate:update withLaunchedUpdate:launchedUpdate]) {
resolve(@{
@"isAvailable": @(YES),
@"manifest": update.rawManifest
});
} else {
resolve(@{
@"isAvailable": @(NO)
});
}
} errorBlock:^(NSError *error, NSURLResponse *response) {
reject(@"ERR_UPDATES_CHECK", error.localizedDescription, error);
}];
}
UM_EXPORT_METHOD_AS(fetchUpdateAsync,
fetchUpdateAsync:(UMPromiseResolveBlock)resolve
reject:(UMPromiseRejectBlock)reject)
{
if (!_updatesService.isStarted) {
reject(@"ERR_UPDATES_DISABLED", @"The updates module controller has not been properly initialized. If you're in development mode, you cannot fetch updates. Otherwise, make sure you have called [[EXUpdatesAppController sharedInstance] start].", nil);
return;
}
EXUpdatesRemoteAppLoader *remoteAppLoader = [[EXUpdatesRemoteAppLoader alloc] initWithConfig:_updatesService.config database:_updatesService.database directory:_updatesService.directory completionQueue:self.methodQueue];
[remoteAppLoader loadUpdateFromUrl:_updatesService.config.updateUrl onManifest:^BOOL(EXUpdatesUpdate * _Nonnull update) {
return [self->_updatesService.selectionPolicy shouldLoadNewUpdate:update withLaunchedUpdate:self->_updatesService.launchedUpdate];
} success:^(EXUpdatesUpdate * _Nullable update) {
if (update) {
resolve(@{
@"isNew": @(YES),
@"manifest": update.rawManifest
});
} else {
resolve(@{
@"isNew": @(NO)
});
}
} error:^(NSError * _Nonnull error) {
reject(@"ERR_UPDATES_FETCH", @"Failed to download new update", error);
}];
}
@end