From c5bcfe7d72c4b3b1a50b94c63984170498b5474e Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Thu, 14 Apr 2022 16:32:46 +0200 Subject: [PATCH 1/3] Fix getMultiImage throwing an error on iOS 13 and below. --- .../ios/RunnerTests/ImagePickerPluginTests.m | 1 + .../ios/Classes/FLTImagePickerPlugin.m | 17 ++++++++++++----- .../ios/Classes/FLTImagePickerPlugin_Test.h | 3 +++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m b/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m index 8df5299e54d9..3c4b999d67e1 100644 --- a/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m +++ b/packages/image_picker/image_picker_ios/example/ios/RunnerTests/ImagePickerPluginTests.m @@ -178,6 +178,7 @@ - (void)testPickMultiImageShouldUseUIImagePickerControllerOnPreiOS14 { OCMVerify(times(1), [mockUIImagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]); + XCTAssertEqual([plugin getMaxImagesAllowed], 0); } #pragma mark - Test camera devices, no op on simulators diff --git a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m index cc841d6db447..d514f6c48db3 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m @@ -73,6 +73,10 @@ + (void)registerWithRegistrar:(NSObject *)registrar { [registrar addMethodCallDelegate:instance channel:channel]; } +- (int) getMaxImagesAllowed { + return self.maxImagesAllowed; +} + - (UIImagePickerController *)createImagePickerController { if ([self.imagePickerControllerOverrides count] > 0) { UIImagePickerController *controller = [self.imagePickerControllerOverrides firstObject]; @@ -136,13 +140,16 @@ - (void)pickImageWithPHPicker:(int)maxImagesAllowed API_AVAILABLE(ios(14)) { [self checkPhotoAuthorizationForAccessLevel]; } -- (void)launchUIImagePickerWithSource:(int)imageSource { +- (void)launchUIImagePickerWithSource:(int)imageSource multiImage:(BOOL)multiImage { UIImagePickerController *imagePickerController = [self createImagePickerController]; imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext; imagePickerController.delegate = self; imagePickerController.mediaTypes = @[ (NSString *)kUTTypeImage ]; - self.maxImagesAllowed = 1; + // Picking multiple images is unsupported on iOS 13 and below, + // but this still has to be set as it determines the correct + // return type (list or single item). + self.maxImagesAllowed = multiImage ? 0 : 1; switch (imageSource) { case SOURCE_CAMERA: @@ -179,16 +186,16 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result [self pickImageWithPHPicker:1]; } else { // UIImagePicker is used - [self launchUIImagePickerWithSource:imageSource]; + [self launchUIImagePickerWithSource:imageSource multiImage:false]; } } else { - [self launchUIImagePickerWithSource:imageSource]; + [self launchUIImagePickerWithSource:imageSource multiImage:false]; } } else if ([@"pickMultiImage" isEqualToString:call.method]) { if (@available(iOS 14, *)) { [self pickImageWithPHPicker:0]; } else { - [self launchUIImagePickerWithSource:SOURCE_GALLERY]; + [self launchUIImagePickerWithSource:SOURCE_GALLERY multiImage:true]; } } else if ([@"pickVideo" isEqualToString:call.method]) { UIImagePickerController *imagePickerController = [self createImagePickerController]; diff --git a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin_Test.h b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin_Test.h index 039f76de427d..77986ecc1b16 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin_Test.h +++ b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin_Test.h @@ -27,6 +27,9 @@ */ - (void)handleSavedPathList:(NSArray *)pathList; +/** The property to keep track of how many images are allowed to be picked */ +- (int) getMaxImagesAllowed; + /** * Tells the delegate that the user cancelled the pick operation. * From 4cc988825d3cb7163fc0e2506aed0b693a149d17 Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Thu, 14 Apr 2022 16:36:50 +0200 Subject: [PATCH 2/3] Update changelog and pubspec version --- packages/image_picker/image_picker_ios/CHANGELOG.md | 4 ++++ packages/image_picker/image_picker_ios/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_ios/CHANGELOG.md b/packages/image_picker/image_picker_ios/CHANGELOG.md index 3472ade28d5b..cc9da2e5bc62 100644 --- a/packages/image_picker/image_picker_ios/CHANGELOG.md +++ b/packages/image_picker/image_picker_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.4+12 + +* Fixes `pickMultiImage` throwing an exception on iOS 13 and below. + ## 0.8.4+11 * Splits from `image_picker` as a federated implementation. diff --git a/packages/image_picker/image_picker_ios/pubspec.yaml b/packages/image_picker/image_picker_ios/pubspec.yaml index 2587c9a0d15b..41e80e89da98 100755 --- a/packages/image_picker/image_picker_ios/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_ios description: iOS implementation of the video_picker plugin. repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.4+11 +version: 0.8.4+12 environment: sdk: ">=2.14.0 <3.0.0" From 2bc7476033e2a7c56774ae69febf3f4fe784991f Mon Sep 17 00:00:00 2001 From: "Bodhi Mulders (BeMacized)" Date: Thu, 14 Apr 2022 16:37:40 +0200 Subject: [PATCH 3/3] Format --- .../image_picker_ios/ios/Classes/FLTImagePickerPlugin.m | 8 ++++---- .../ios/Classes/FLTImagePickerPlugin_Test.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m index d514f6c48db3..3e0a649918ed 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m +++ b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin.m @@ -73,8 +73,8 @@ + (void)registerWithRegistrar:(NSObject *)registrar { [registrar addMethodCallDelegate:instance channel:channel]; } -- (int) getMaxImagesAllowed { - return self.maxImagesAllowed; +- (int)getMaxImagesAllowed { + return self.maxImagesAllowed; } - (UIImagePickerController *)createImagePickerController { @@ -189,13 +189,13 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result [self launchUIImagePickerWithSource:imageSource multiImage:false]; } } else { - [self launchUIImagePickerWithSource:imageSource multiImage:false]; + [self launchUIImagePickerWithSource:imageSource multiImage:false]; } } else if ([@"pickMultiImage" isEqualToString:call.method]) { if (@available(iOS 14, *)) { [self pickImageWithPHPicker:0]; } else { - [self launchUIImagePickerWithSource:SOURCE_GALLERY multiImage:true]; + [self launchUIImagePickerWithSource:SOURCE_GALLERY multiImage:true]; } } else if ([@"pickVideo" isEqualToString:call.method]) { UIImagePickerController *imagePickerController = [self createImagePickerController]; diff --git a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin_Test.h b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin_Test.h index 77986ecc1b16..940df27b7810 100644 --- a/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin_Test.h +++ b/packages/image_picker/image_picker_ios/ios/Classes/FLTImagePickerPlugin_Test.h @@ -28,7 +28,7 @@ - (void)handleSavedPathList:(NSArray *)pathList; /** The property to keep track of how many images are allowed to be picked */ -- (int) getMaxImagesAllowed; +- (int)getMaxImagesAllowed; /** * Tells the delegate that the user cancelled the pick operation.