Bug
If a user swipes down a gallery in iOS, the second time I open programmatically the photo gallery, an error is thrown and the error callback is called. This doesn’t happen when the user clicks cancel: the cancel callback is called and the second time the user opens the gallery no error is thrown.
Other kind users of the ti.slack community have investigated this issues and reached the same conclusions. One of them in particular suggested a (working) fix.
Jason David Miller wrote:
{quote}I can confirm that it's happening with TiSDK 10.1.0.v20210824071502 . The very first time Ti.Media.openPhotoGallery() is called, all works well. If the user clicks 'cancel', the gallery hides and the cancel method is called. However, if the user simply swipes down to cancel (normal iOS 14+ behavior), the gallery does not call the cancel method and an error is thrown when attempting to call Ti.Media.openPhotoGallery() again. — Also, it takes two clicks to open the gallery again (after hidden via swipe). I'm assuming that since the gallery's success, cancel, or error methods aren't being called, maybe iOS assumes the gallery is still shown and/or hasn't been deallocated).
Summary: it seems like the 'swipe down to cancel' needs to actually call the cancel method (in TiSDK), although I'm unsure if that's currently the case...
{quote}
*Example Code*
Ti.Media.openPhotoGallery({
success: (e) => {
Ti.API.info('Photo gallery success: ', e);
},
cancel: () => {
Ti.API.warn('Photo gallery cancel');
},
error: (error) => {
Ti.API.error('Photo gallery error: ', error);
},
autohide: true,
allowEditing: false,
saveToPhotoGallery: false,
mediaTypes: [Ti.Media.MEDIA_TYPE_PHOTO],
videoQuality: Ti.Media.QUALITY_HIGH
});
so it looks like presentationControllerDidDismiss is not being called when the photo gallery is dismissed via swipe (being pulled down)...
*/iphone/Classes/MediaModule.m*
#if IS_SDK_IOS_13
- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
{
#if defined(USE_TI_MEDIASHOWCAMERA) || defined(USE_TI_MEDIAOPENPHOTOGALLERY) || defined(USE_TI_MEDIASTARTVIDEOEDITING)
#if IS_SDK_IOS_14 && defined(USE_TI_MEDIAOPENPHOTOGALLERY)
[self closeModalPicker:picker ?: _phPicker];
#else
[self closeModalPicker:picker];
#endif
[self sendPickerCancel];
#endif
}
#endif
Proposed solution
Marc Bender proposed this solution
{quote}I found the problem!
add these lines in the phpickerdeledate:
{quote}
#pragma mark PHPickerViewControllerDelegate
- (void)presentationControllerDidDismiss:(PHPickerViewController *)picker
{
[self sendPickerCancel];
}
- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results
The proposed solution was also put in a discussion on GitHub:
https://github.com/appcelerator/titanium_mobile/discussions/13046
so it won't get lost in the other tickets: https://github.com/appcelerator/titanium_mobile/pull/13057 works fine in my simulator test
This was backported onto the 10_1_X branch