Cordova Camera Plugin Takes Forever to Fire
Cordova Camera Picker Takes a Long Time to Load. Fast and Easy Fix.
While trying to fire the camera plugin on cordova i realized the action was taking forever to fire about 30-40 seconds. I saw a bug on console and immediately started doing research. I found a useful stackoverflow, but it was not as clear so i decided to leave a clear written example of how it should be fixed.
1. Locate Plugins/CDVCamera.m
2. Locate showCameraPicker
3. You need to include the top code into the dispatch_async
4. Here is how the function should look.
- (void)showCameraPicker:(NSString*)callbackId withOptions:(CDVPictureOptions *) pictureOptions
{
// CDVCameraPicker* cameraPicker = [CDVCameraPicker createFromPictureOptions:pictureOptions];
// self.pickerController = cameraPicker;
// cameraPicker.delegate = self;
// cameraPicker.callbackId = callbackId;
// // we need to capture this state for memory warnings that dealloc this object
// cameraPicker.webView = self.webView;
// Perform UI operations on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
CDVCameraPicker* cameraPicker = [CDVCameraPicker createFromPictureOptions:pictureOptions];
self.pickerController = cameraPicker;
cameraPicker.delegate = self;
cameraPicker.callbackId = callbackId;
// we need to capture this state for memory warnings that dealloc this object
cameraPicker.webView = self.webView;
// If a popover is already open, close it; we only want one at a time.
if (([[self pickerController] pickerPopoverController] != nil) && [[[self pickerController] pickerPopoverController] isPopoverVisible]) {
[[[self pickerController] pickerPopoverController] dismissPopoverAnimated:YES];
[[[self pickerController] pickerPopoverController] setDelegate:nil];
[[self pickerController] setPickerPopoverController:nil];
}
if ([self popoverSupported] && (pictureOptions.sourceType != UIImagePickerControllerSourceTypeCamera)) {
if (cameraPicker.pickerPopoverController == nil) {
cameraPicker.pickerPopoverController = [[NSClassFromString(@"UIPopoverController") alloc] initWithContentViewController:cameraPicker];
}
[self displayPopover:pictureOptions.popoverOptions];
self.hasPendingOperation = NO;
} else {
cameraPicker.modalPresentationStyle = UIModalPresentationCurrentContext;
[self.viewController presentViewController:cameraPicker animated:YES completion:^{
self.hasPendingOperation = NO;
}];
}
});
}
Source: https://stackoverflow.com/questions/58038810/xcode-10-main-thread-checker-cordova-camera-plugin