diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTImageLoaderTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTImageLoaderTests.m index e67edb0b40481a..c6b94d5c4e0c8c 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTImageLoaderTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTImageLoaderTests.m @@ -49,7 +49,8 @@ - (void)testImageLoading NS_VALID_UNTIL_END_OF_SCOPE RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:nil moduleProvider:^{ return @[loader]; } launchOptions:nil]; - [bridge.imageLoader loadImageWithTag:@"http://facebook.github.io/react/img/logo_og.png" size:CGSizeMake(100, 100) scale:1.0 resizeMode:RCTResizeModeContain progressBlock:^(int64_t progress, int64_t total) { + NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://facebook.github.io/react/img/logo_og.png"]]; + [bridge.imageLoader loadImageWithURLRequest:urlRequest size:CGSizeMake(100, 100) scale:1.0 resizeMode:RCTResizeModeContain progressBlock:^(int64_t progress, int64_t total) { XCTAssertEqual(progress, 1); XCTAssertEqual(total, 1); } completionBlock:^(NSError *loadError, id loadedImage) { @@ -78,8 +79,9 @@ - (void)testImageLoaderUsesImageURLLoaderWithHighestPriority }]; NS_VALID_UNTIL_END_OF_SCOPE RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:nil moduleProvider:^{ return @[loader1, loader2]; } launchOptions:nil]; - - [bridge.imageLoader loadImageWithTag:@"http://facebook.github.io/react/img/logo_og.png" size:CGSizeMake(100, 100) scale:1.0 resizeMode:RCTResizeModeContain progressBlock:^(int64_t progress, int64_t total) { + + NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://facebook.github.io/react/img/logo_og.png"]]; + [bridge.imageLoader loadImageWithURLRequest:urlRequest size:CGSizeMake(100, 100) scale:1.0 resizeMode:RCTResizeModeContain progressBlock:^(int64_t progress, int64_t total) { XCTAssertEqual(progress, 1); XCTAssertEqual(total, 1); } completionBlock:^(NSError *loadError, id loadedImage) { diff --git a/Libraries/CameraRoll/RCTCameraRollManager.m b/Libraries/CameraRoll/RCTCameraRollManager.m index d060224ccc7afa..c25daf3a705336 100644 --- a/Libraries/CameraRoll/RCTCameraRollManager.m +++ b/Libraries/CameraRoll/RCTCameraRollManager.m @@ -86,7 +86,8 @@ @implementation RCTCameraRollManager resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { - [_bridge.imageLoader loadImageWithTag:imageTag callback:^(NSError *loadError, UIImage *loadedImage) { + [_bridge.imageLoader loadImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageTag]] + callback:^(NSError *loadError, UIImage *loadedImage) { if (loadError) { reject(RCTErrorUnableToLoad, nil, loadError); return; diff --git a/Libraries/Image/Image.ios.js b/Libraries/Image/Image.ios.js index b2f4718f7f120d..7c6b6a20b14e91 100644 --- a/Libraries/Image/Image.ios.js +++ b/Libraries/Image/Image.ios.js @@ -63,10 +63,22 @@ var Image = React.createClass({ * `uri` is a string representing the resource identifier for the image, which * could be an http address, a local file path, or the name of a static image * resource (which should be wrapped in the `require('./path/to/image.png')` function). + * + * `method` is the HTTP Method to use. Defaults to GET if not specified. + * + * `headers` is an object representing the HTTP headers to send along with the request + * for a remote image. + * + * `body` is the HTTP body to send with the request. This must be a valid + * UTF-8 string, and will be sent exactly as specified, with no + * additional encoding (e.g. URL-escaping or base64) applied. */ source: PropTypes.oneOfType([ PropTypes.shape({ uri: PropTypes.string, + method: PropTypes.string, + headers: PropTypes.objectOf(PropTypes.string), + body: PropTypes.string, }), // Opaque type returned by require('./image.jpg') PropTypes.number, @@ -216,7 +228,11 @@ var Image = React.createClass({ if (isNetwork && (tintColor || this.props.blurRadius)) { RawImage = RCTImageView; } - + + if (source && source.uri === '') { + console.warn('source.uri should not be an empty string'); + } + if (this.props.src) { console.warn('The component requires a `source` property rather than `src`.'); } diff --git a/Libraries/Image/RCTImageEditingManager.m b/Libraries/Image/RCTImageEditingManager.m index 9ff231d64f7f1a..76532d12c632c5 100644 --- a/Libraries/Image/RCTImageEditingManager.m +++ b/Libraries/Image/RCTImageEditingManager.m @@ -45,7 +45,7 @@ @implementation RCTImageEditingManager [RCTConvert CGSize:cropData[@"size"]] }; - [_bridge.imageLoader loadImageWithTag:imageTag callback:^(NSError *error, UIImage *image) { + [_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:imageTag] callback:^(NSError *error, UIImage *image) { if (error) { errorCallback(error); return; diff --git a/Libraries/Image/RCTImageLoader.h b/Libraries/Image/RCTImageLoader.h index d11c424103d3ea..a8bbf2e62629ed 100644 --- a/Libraries/Image/RCTImageLoader.h +++ b/Libraries/Image/RCTImageLoader.h @@ -56,14 +56,14 @@ typedef void (^RCTImageLoaderCancellationBlock)(void); * Loads the specified image at the highest available resolution. * Can be called from any thread, will call back on an unspecified thread. */ -- (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)loadImageWithURLRequest:(NSURLRequest *)imageURLRequest callback:(RCTImageLoaderCompletionBlock)callback; /** * As above, but includes target size, scale and resizeMode, which are used to * select the optimal dimensions for the loaded image. */ -- (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)loadImageWithURLRequest:(NSURLRequest *)imageURLRequest size:(CGSize)size scale:(CGFloat)scale resizeMode:(RCTResizeMode)resizeMode @@ -73,7 +73,7 @@ typedef void (^RCTImageLoaderCancellationBlock)(void); /** * Loads an image without clipping the result to fit - used by RCTImageView. */ -- (RCTImageLoaderCancellationBlock)loadImageWithoutClipping:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)loadImageWithURLRequestWithoutClipping:(NSURLRequest *)imageURLRequest size:(CGSize)size scale:(CGFloat)scale resizeMode:(RCTResizeMode)resizeMode @@ -104,11 +104,35 @@ typedef void (^RCTImageLoaderCancellationBlock)(void); * Get image size, in pixels. This method will do the least work possible to get * the information, and won't decode the image if it doesn't have to. */ -- (RCTImageLoaderCancellationBlock)getImageSize:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)getImageSizeForURLRequest:(NSURLRequest *)imageURLRequest block:(void(^)(NSError *error, CGSize size))completionBlock; @end +@interface RCTImageLoader (Deprecated) + +- (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag + callback:(RCTImageLoaderCompletionBlock)callback __deprecated; + +- (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag + size:(CGSize)size + scale:(CGFloat)scale + resizeMode:(RCTResizeMode)resizeMode + progressBlock:(RCTImageLoaderProgressBlock)progressBlock + completionBlock:(RCTImageLoaderCompletionBlock)completionBlock __deprecated; + +- (RCTImageLoaderCancellationBlock)loadImageWithoutClipping:(NSString *)imageTag + size:(CGSize)size + scale:(CGFloat)scale + resizeMode:(RCTResizeMode)resizeMode + progressBlock:(RCTImageLoaderProgressBlock)progressBlock + completionBlock:(RCTImageLoaderCompletionBlock)completionBlock __deprecated; + +- (RCTImageLoaderCancellationBlock)getImageSize:(NSString *)imageTag + block:(void(^)(NSError *error, CGSize size))completionBlock __deprecated; + +@end + @interface RCTBridge (RCTImageLoader) /** diff --git a/Libraries/Image/RCTImageLoader.m b/Libraries/Image/RCTImageLoader.m index c6f4e2ec871f9c..5f5ee9d3245385 100644 --- a/Libraries/Image/RCTImageLoader.m +++ b/Libraries/Image/RCTImageLoader.m @@ -220,10 +220,10 @@ - (void)dealloc return image; } -- (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)loadImageWithURLRequest:(NSURLRequest *)imageURLRequest callback:(RCTImageLoaderCompletionBlock)callback { - return [self loadImageWithTag:imageTag + return [self loadImageWithURLRequest:imageURLRequest size:CGSizeZero scale:1 resizeMode:RCTResizeModeStretch @@ -280,7 +280,7 @@ - (void)dequeueTasks * path taken. This is useful if you want to skip decoding, e.g. when preloading * the image, or retrieving metadata. */ -- (RCTImageLoaderCancellationBlock)loadImageOrDataWithTag:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)loadImageOrDataWithURLRequest:(NSURLRequest *)imageURLRequest size:(CGSize)size scale:(CGFloat)scale resizeMode:(RCTResizeMode)resizeMode @@ -306,11 +306,6 @@ - (RCTImageLoaderCancellationBlock)loadImageOrDataWithTag:(NSString *)imageTag } }; - if (imageTag.length == 0) { - completionHandler(RCTErrorWithMessage(@"source.uri should not be an empty string"), nil); - return ^{}; - } - // All access to URL cache must be serialized if (!_URLCacheQueue) { [self setUp]; @@ -329,7 +324,7 @@ - (RCTImageLoaderCancellationBlock)loadImageOrDataWithTag:(NSString *)imageTag } // Find suitable image URL loader - NSURLRequest *request = [RCTConvert NSURLRequest:imageTag]; + NSURLRequest *request = imageURLRequest; // Use a local variable so we can reassign it in this block id loadHandler = [strongSelf imageURLLoaderForURL:request.URL]; if (loadHandler) { cancelLoad = [loadHandler loadImageForURL:request.URL @@ -345,13 +340,13 @@ - (RCTImageLoaderCancellationBlock)loadImageOrDataWithTag:(NSString *)imageTag if (RCT_DEBUG && ![_bridge respondsToSelector:@selector(networking)]) { RCTLogError(@"No suitable image URL loader found for %@. You may need to " " import the RCTNetwork library in order to load images.", - imageTag); + request.URL.absoluteString); return; } // Check if networking module can load image if (RCT_DEBUG && ![_bridge.networking canHandleRequest:request]) { - RCTLogError(@"No suitable image URL loader found for %@", imageTag); + RCTLogError(@"No suitable image URL loader found for %@", request.URL.absoluteString); return; } @@ -405,7 +400,7 @@ - (RCTImageLoaderCancellationBlock)loadImageOrDataWithTag:(NSString *)imageTag } NSURL *redirectURL = [NSURL URLWithString: location]; - request = [NSURLRequest requestWithURL: redirectURL]; + request = [NSURLRequest requestWithURL:redirectURL]; cachedResponse = [_URLCache cachedResponseForRequest:request]; continue; } @@ -470,14 +465,14 @@ - (RCTImageLoaderCancellationBlock)loadImageOrDataWithTag:(NSString *)imageTag }; } -- (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)loadImageWithURLRequest:(NSURLRequest *)imageURLRequest size:(CGSize)size scale:(CGFloat)scale resizeMode:(RCTResizeMode)resizeMode progressBlock:(RCTImageLoaderProgressBlock)progressHandler completionBlock:(RCTImageLoaderCompletionBlock)completionBlock { - return [self loadImageWithoutClipping:imageTag + return [self loadImageWithURLRequestWithoutClipping:imageURLRequest size:size scale:scale resizeMode:resizeMode @@ -487,7 +482,7 @@ - (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag }]; } -- (RCTImageLoaderCancellationBlock)loadImageWithoutClipping:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)loadImageWithURLRequestWithoutClipping:(NSURLRequest *)imageURLRequest size:(CGSize)size scale:(CGFloat)scale resizeMode:(RCTResizeMode)resizeMode @@ -499,7 +494,7 @@ - (RCTImageLoaderCancellationBlock)loadImageWithoutClipping:(NSString *)imageTag __weak RCTImageLoader *weakSelf = self; // Check decoded image cache - NSString *cacheKey = RCTCacheKeyForImage(imageTag, size, scale, resizeMode); + NSString *cacheKey = RCTCacheKeyForImage(imageURLRequest.URL.absoluteString, size, scale, resizeMode); { UIImage *image = [_decodedImageCache objectForKey:cacheKey]; if (image) { @@ -536,7 +531,7 @@ - (RCTImageLoaderCancellationBlock)loadImageWithoutClipping:(NSString *)imageTag } }; - cancelLoad = [self loadImageOrDataWithTag:imageTag + cancelLoad = [self loadImageOrDataWithURLRequest:imageURLRequest size:size scale:scale resizeMode:resizeMode @@ -675,10 +670,10 @@ - (RCTImageLoaderCancellationBlock)decodeImageDataWithoutClipping:(NSData *)data } } -- (RCTImageLoaderCancellationBlock)getImageSize:(NSString *)imageTag +- (RCTImageLoaderCancellationBlock)getImageSizeForURLRequest:(NSURLRequest *)imageURLRequest block:(void(^)(NSError *error, CGSize size))completionBlock { - return [self loadImageOrDataWithTag:imageTag + return [self loadImageOrDataWithURLRequest:imageURLRequest size:CGSizeZero scale:1 resizeMode:RCTResizeModeStretch @@ -713,7 +708,7 @@ - (RCTImageLoaderCancellationBlock)getImageSize:(NSString *)imageTag return; } - [_bridge.imageLoader loadImageWithTag:uri callback:^(NSError *error, UIImage *image) { + [_bridge.imageLoader loadImageWithURLRequest:[RCTConvert NSURLRequest:uri] callback:^(NSError *error, UIImage *image) { if (error) { reject(RCTErrorPrefetchFailure, nil, error); return; @@ -743,7 +738,7 @@ - (BOOL)canHandleRequest:(NSURLRequest *)request - (id)sendRequest:(NSURLRequest *)request withDelegate:(id)delegate { __block RCTImageLoaderCancellationBlock requestToken; - requestToken = [self loadImageWithTag:request.URL.absoluteString callback:^(NSError *error, UIImage *image) { + requestToken = [self loadImageWithURLRequest:request callback:^(NSError *error, UIImage *image) { if (error) { [delegate URLRequest:requestToken didCompleteWithError:error]; return; @@ -781,6 +776,58 @@ - (void)cancelRequest:(id)requestToken @end +@implementation RCTImageLoader (Deprecated) + +- (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag + callback:(RCTImageLoaderCompletionBlock)callback +{ + RCTLogWarn(@"[RCTImageLoader loadImageWithTag:callback:] is deprecated. Instead use [RCTImageLoader loadImageWithURLRequest:callback:]"); + return [self loadImageWithURLRequest:[RCTConvert NSURLRequest:imageTag] + callback:callback]; +} + +- (RCTImageLoaderCancellationBlock)loadImageWithTag:(NSString *)imageTag + size:(CGSize)size + scale:(CGFloat)scale + resizeMode:(RCTResizeMode)resizeMode + progressBlock:(RCTImageLoaderProgressBlock)progressBlock + completionBlock:(RCTImageLoaderCompletionBlock)completionBlock +{ + RCTLogWarn(@"[RCTImageLoader loadImageWithTag:size:scale:resizeMode:progressBlock:completionBlock:] is deprecated. Instead use [RCTImageLoader loadImageWithURLRequest:size:scale:resizeMode:progressBlock:completionBlock:]"); + return [self loadImageWithURLRequest:[RCTConvert NSURLRequest:imageTag] + size:size + scale:scale + resizeMode:resizeMode + progressBlock:progressBlock + completionBlock:completionBlock]; +} + +- (RCTImageLoaderCancellationBlock)loadImageWithoutClipping:(NSString *)imageTag + size:(CGSize)size + scale:(CGFloat)scale + resizeMode:(RCTResizeMode)resizeMode + progressBlock:(RCTImageLoaderProgressBlock)progressBlock + completionBlock:(RCTImageLoaderCompletionBlock)completionBlock +{ + RCTLogWarn(@"[RCTImageLoader loadImageWithoutClipping:size:scale:resizeMode:progressBlock:completionBlock:] is deprecated. Instead use [RCTImageLoader loadImageWithURLRequestWithoutClipping:size:scale:resizeMode:progressBlock:completionBlock:]"); + return [self loadImageWithURLRequestWithoutClipping:[RCTConvert NSURLRequest:imageTag] + size:size + scale:scale + resizeMode:resizeMode + progressBlock:progressBlock + completionBlock:completionBlock]; +} + +- (RCTImageLoaderCancellationBlock)getImageSize:(NSString *)imageTag + block:(void(^)(NSError *error, CGSize size))completionBlock +{ + RCTLogWarn(@"[RCTImageLoader getImageSize:block:] is deprecated. Instead use [RCTImageLoader getImageSizeForURLRequest:block:]"); + return [self getImageSizeForURLRequest:[RCTConvert NSURLRequest:imageTag] + block:completionBlock]; +} + +@end + @implementation RCTBridge (RCTImageLoader) - (RCTImageLoader *)imageLoader diff --git a/Libraries/Image/RCTImageView.m b/Libraries/Image/RCTImageView.m index 1376fb79649487..a28c8d2b521950 100644 --- a/Libraries/Image/RCTImageView.m +++ b/Libraries/Image/RCTImageView.m @@ -224,12 +224,12 @@ - (void)reloadImage RCTImageSource *source = _source; CGFloat blurRadius = _blurRadius; __weak RCTImageView *weakSelf = self; - _reloadImageCancellationBlock = [_bridge.imageLoader loadImageWithoutClipping:_source.imageURL.absoluteString - size:imageSize - scale:imageScale - resizeMode:(RCTResizeMode)self.contentMode - progressBlock:progressHandler - completionBlock:^(NSError *error, UIImage *loadedImage) { + _reloadImageCancellationBlock = [_bridge.imageLoader loadImageWithURLRequestWithoutClipping:_source.imageURLRequest + size:imageSize + scale:imageScale + resizeMode:(RCTResizeMode)self.contentMode + progressBlock:progressHandler + completionBlock:^(NSError *error, UIImage *loadedImage) { RCTImageView *strongSelf = weakSelf; void (^setImageBlock)(UIImage *) = ^(UIImage *image) { if (![source isEqual:strongSelf.source]) { @@ -297,7 +297,7 @@ - (void)reactSetFrame:(CGRect)frame if (RCTShouldReloadImageForSizeChange(imageSize, idealSize)) { if (RCTShouldReloadImageForSizeChange(_targetSize, idealSize)) { - RCTLogInfo(@"[PERF IMAGEVIEW] Reloading image %@ as size %@", _source.imageURL, NSStringFromCGSize(idealSize)); + RCTLogInfo(@"[PERF IMAGEVIEW] Reloading image %@ as size %@", _source.imageURLRequest.URL.absoluteString, NSStringFromCGSize(idealSize)); // If the existing image or an image being loaded are not the right // size, reload the asset in case there is a better size available. diff --git a/Libraries/Image/RCTImageViewManager.m b/Libraries/Image/RCTImageViewManager.m index 2bf7a0fe3369ee..5da98b5cdd536c 100644 --- a/Libraries/Image/RCTImageViewManager.m +++ b/Libraries/Image/RCTImageViewManager.m @@ -48,7 +48,7 @@ - (UIView *)view successBlock:(RCTResponseSenderBlock)successBlock errorBlock:(RCTResponseErrorBlock)errorBlock) { - [self.bridge.imageLoader getImageSize:imageURL.absoluteString + [self.bridge.imageLoader getImageSizeForURLRequest:[NSURLRequest requestWithURL:imageURL] block:^(NSError *error, CGSize size) { if (error) { errorBlock(error); diff --git a/React/Base/RCTConvert.m b/React/Base/RCTConvert.m index ebdbee02a5847d..394a1a0945a297 100644 --- a/React/Base/RCTConvert.m +++ b/React/Base/RCTConvert.m @@ -133,6 +133,22 @@ + (NSURLRequest *)NSURLRequest:(id)json if ([method isEqualToString:@"GET"] && headers == nil && body == nil) { return [NSURLRequest requestWithURL:URL]; } + + if (headers) { + BOOL allHeadersAreStrings = YES; + for (NSString *key in headers) { + if (![[headers objectForKey:key] isKindOfClass:[NSString class]]) { + RCTLogError(@"Values of HTTP headers passed must be" + " of type string. Value of header '%@' is not a string.", key); + allHeadersAreStrings = NO; + } + } + if (!allHeadersAreStrings) { + // Set headers to nil here to avoid crashing later. + headers = nil; + } + } + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; request.HTTPBody = body; request.HTTPMethod = method; @@ -878,7 +894,7 @@ + (UIImage *)UIImage:(id)json return image; } - NSURL *URL = imageSource.imageURL; + NSURL *URL = imageSource.imageURLRequest.URL; NSString *scheme = URL.scheme.lowercaseString; if ([scheme isEqualToString:@"file"]) { NSString *assetName = RCTBundlePathForURL(URL); diff --git a/React/Base/RCTImageSource.h b/React/Base/RCTImageSource.h index efcefaa2b89fba..fb83689677d3c8 100644 --- a/React/Base/RCTImageSource.h +++ b/React/Base/RCTImageSource.h @@ -16,7 +16,7 @@ */ @interface RCTImageSource : NSObject -@property (nonatomic, strong, readonly) NSURL *imageURL; +@property (nonatomic, strong, readonly) NSURLRequest *imageURLRequest; @property (nonatomic, assign, readonly) CGSize size; @property (nonatomic, assign, readonly) CGFloat scale; @@ -25,9 +25,9 @@ * Pass a size of CGSizeZero if you do not know or wish to specify the image * size. Pass a scale of zero if you do not know or wish to specify the scale. */ -- (instancetype)initWithURL:(NSURL *)url - size:(CGSize)size - scale:(CGFloat)scale; +- (instancetype)initWithURLRequest:(NSURLRequest *)urlRequest + size:(CGSize)size + scale:(CGFloat)scale; /** * Create a copy of the image source with the specified size and scale. diff --git a/React/Base/RCTImageSource.m b/React/Base/RCTImageSource.m index 07518edf928a4d..f83d18d78fd4ad 100644 --- a/React/Base/RCTImageSource.m +++ b/React/Base/RCTImageSource.m @@ -18,10 +18,10 @@ @interface RCTImageSource () @implementation RCTImageSource -- (instancetype)initWithURL:(NSURL *)url size:(CGSize)size scale:(CGFloat)scale +- (instancetype)initWithURLRequest:(NSURLRequest *)imageURLRequest size:(CGSize)size scale:(CGFloat)scale { if ((self = [super init])) { - _imageURL = url; + _imageURLRequest = imageURLRequest; _size = size; _scale = scale; } @@ -30,9 +30,9 @@ - (instancetype)initWithURL:(NSURL *)url size:(CGSize)size scale:(CGFloat)scale - (instancetype)imageSourceWithSize:(CGSize)size scale:(CGFloat)scale { - RCTImageSource *imageSource = [[RCTImageSource alloc] initWithURL:_imageURL - size:size - scale:scale]; + RCTImageSource *imageSource = [[RCTImageSource alloc] initWithURLRequest:_imageURLRequest + size:size + scale:scale]; imageSource.packagerAsset = _packagerAsset; return imageSource; } @@ -42,7 +42,7 @@ - (BOOL)isEqual:(RCTImageSource *)object if (![object isKindOfClass:[RCTImageSource class]]) { return NO; } - return [_imageURL isEqual:object.imageURL] && _scale == object.scale && + return [_imageURLRequest isEqual:object.imageURLRequest] && _scale == object.scale && (CGSizeEqualToSize(_size, object.size) || CGSizeEqualToSize(object.size, CGSizeZero)); } @@ -56,25 +56,25 @@ + (RCTImageSource *)RCTImageSource:(id)json return nil; } - NSURL *imageURL; + NSURLRequest *imageURLRequest; CGSize size = CGSizeZero; CGFloat scale = 1.0; BOOL packagerAsset = NO; if ([json isKindOfClass:[NSDictionary class]]) { - if (!(imageURL = [self NSURL:RCTNilIfNull(json[@"uri"])])) { + if (!(imageURLRequest = [self NSURLRequest:json])) { return nil; } size = [self CGSize:json]; scale = [self CGFloat:json[@"scale"]] ?: [self BOOL:json[@"deprecated"]] ? 0.0 : 1.0; packagerAsset = [self BOOL:json[@"__packager_asset"]]; } else if ([json isKindOfClass:[NSString class]]) { - imageURL = [self NSURL:json]; + imageURLRequest = [self NSURLRequest:json]; } else { RCTLogConvertError(json, @"an image. Did you forget to call resolveAssetSource() on the JS side?"); return nil; } - RCTImageSource *imageSource = [[RCTImageSource alloc] initWithURL:imageURL + RCTImageSource *imageSource = [[RCTImageSource alloc] initWithURLRequest:imageURLRequest size:size scale:scale]; imageSource.packagerAsset = packagerAsset;