From d08727d99fa07caabcb1fb37cf91de9a47e13b82 Mon Sep 17 00:00:00 2001 From: Aleksei Androsov Date: Tue, 1 Dec 2015 02:10:20 -0800 Subject: [PATCH] RCTImagePickerManager crash on image from CameraRoll Summary: Image from CameraRoll haven't UIImagePickerControllerReferenceURL. So we need to save it to PhotoAlbums first. To save image I've used the same method from RCTCameraRollManager. Closes https://github.com/facebook/react-native/pull/4412 Reviewed By: svcscm Differential Revision: D2707249 Pulled By: nicklockwood fb-gh-sync-id: eee683bd4179700bed46ebf45e569197f3ad2077 --- Libraries/CameraRoll/RCTImagePickerManager.m | 26 +++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/Libraries/CameraRoll/RCTImagePickerManager.m b/Libraries/CameraRoll/RCTImagePickerManager.m index d82d0e9bf..0f97099ad 100644 --- a/Libraries/CameraRoll/RCTImagePickerManager.m +++ b/Libraries/CameraRoll/RCTImagePickerManager.m @@ -9,6 +9,7 @@ */ #import "RCTImagePickerManager.h" +#import "RCTImageStoreManager.h" #import "RCTConvert.h" #import "RCTRootView.h" @@ -32,6 +33,8 @@ RCT_EXPORT_MODULE(ImagePickerIOS); +@synthesize bridge = _bridge; + - (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); @@ -101,9 +104,26 @@ RCT_EXPORT_METHOD(openSelectDialog:(NSDictionary *)config - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { - [self _dismissPicker:picker args:@[ - [info[UIImagePickerControllerReferenceURL] absoluteString] - ]]; + // Image from PhotoLibrary + NSString *imageUri = [info[UIImagePickerControllerReferenceURL] absoluteString]; + if (imageUri) { + [self _dismissPicker:picker args:@[imageUri]]; + + } else { + // Image from CameraRoll hasn't uri. + // We need to save it to the store first. + UIImage *originalImage = info[UIImagePickerControllerOriginalImage]; + + // WARNING: Using imageStoreManager causes memory leak + // because image isn't removed from store once we're done using it + [_bridge.imageStoreManager storeImage:originalImage withBlock:^(NSString *tempImageTag) { + if (!tempImageTag) { + [self _dismissPicker:picker args:nil]; + return; + } + [self _dismissPicker:picker args:@[tempImageTag]]; + }]; + } } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker