Search code examples
iosobjective-ccodenameonenativeios11

Native Code Capture Image throws exception on IOS 11?


I have a problem with objective-c code that handles openning camera to take a picture the code is injected as native code inside codename one

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
            imagePicker = [[UIImagePickerController alloc] init];
            imagePicker.delegate = self;


            imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
            NSArray *mediaTypes = [[NSArray alloc]initWithObjects:(NSString *)kUTTypeImage, nil];
            imagePicker.mediaTypes = mediaTypes;
            imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
            [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:imagePicker animated:YES completion:nil];
        }else{
            [self showAlert:@"No Camera Privilege On This Device"];
        }

the problem is when the above code is executed on iOS-11 ,I get null pointer exception from codenameone without asking for camera permission unlike iOS-12 the code works perfectly

the permission are added in the codenamesettings

codename1.arg.ios.NSPhotoLibraryAddUsageDescription=The App uses the Photo Library to save Images downloaded from News
codename1.arg.ios.NSCameraUsageDescription=The App uses the Camera for Video Chat support
codename1.arg.ios.NSPhotoLibraryUsageDescription=The App uses the Photo Library to save Images downloaded from News

is there anything that can be done to handle the issue on iOS11

--exception stack-trace from simulator using Xcode9.2

2018-10-04 18:47:50.830359+0300 TestApplication[7630:35311] *** Assertion failure in -[UIApplication _cachedSystemAnimationFenceCreatingIfNecessary:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3698.33.6/UIApplication.m:1709
2018-10-04 18:47:50.853277+0300 TestApplication[7630:35311] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'accessing _cachedSystemAnimationFence requires the main thread'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010da7312b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010d107f41 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010da782f2 +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x0000000109d38d69 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
    4   UIKit                               0x0000000107ac692d -[UIApplication _cachedSystemAnimationFenceCreatingIfNecessary:] + 359
    5   UIKit                               0x0000000107b51ac9 +[UIWindow _synchronizeDrawingWithPreCommitHandler:] + 57
    6   UIKit                               0x00000001082cfb7b -[UIInputViewAnimationStyle launchAnimation:afterStarted:completion:forHost:fromCurrentPosition:] + 99
    7   UIKit                               0x000000010872be9a -[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:] + 1697
    8   UIKit                               0x0000000108734c8f __43-[UIInputWindowController setInputViewSet:]_block_invoke.1493 + 97
    9   UIKit                               0x0000000108724208 -[UIInputWindowController performOperations:withTemplateNotificationInfo:] + 46
    10  UIKit                               0x000000010873481b -[UIInputWindowController setInputViewSet:] + 1336
    11  UIKit                               0x000000010872b450 -[UIInputWindowController performOperations:withAnimationStyle:] + 50
    12  UIKit                               0x00000001082c8164 -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1669
    13  UIKit                               0x00000001082bff4b -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:] + 2163
    14  UIKit                               0x00000001082c9480 -[UIPeripheralHost(UIKitInternal) _preserveInputViewsWithId:animated:reset:] + 498
    15  UIKit                               0x0000000107c89130 -[UIViewController _presentViewController:modalSourceViewController:presentationController:animationController:interactionController:completion:] + 1233
    16  UIKit                               0x0000000107c8ae94 -[UIViewController _presentViewController:withAnimationController:completion:] + 4621
    17  UIKit                               0x0000000107c8d9a9 __63-[UIViewController _presentViewController:animated:completion:]_block_invoke + 99
    18  UIKit                               0x0000000107c8e079 -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 532
    19  UIKit                               0x0000000107c8d908 -[UIViewController _presentViewController:animated:completion:] + 181
    20  UIKit                               0x0000000107c8dc67 -[UIViewController presentViewController:animated:completion:] + 159

appreciate the help

Regards,


Solution

  • thanks for all of your help , the problem as stated was only on iOS11 , and the reason for that if I present any viewcontroller with animated:Yes and I changed how to call the view controller by adding the following code

    dispatch_queue_t _serialQueue = dispatch_queue_create("x.y.z", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(_serialQueue, ^{
            self.filePath=param;
            [self showForm];
    
        });
    

    and the showForm : just take a copy of the old viewcontroller and present the new one like this [condition was used to wait for the camera to finish picking and saving the file to gallery] :

    -(void)showForm{
        condition = [[NSCondition alloc] init];
        self.parentViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
        [self.parentViewController.view setUserInteractionEnabled:NO];
        destinationViewController = [[ViewController alloc] initWithValues:self.filePath andCondition:condition andChoice:@"Camera"];
        [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:destinationViewController animated:NO completion:nil];
        [condition lock];
        [condition wait];    
        self.filePath = [(ViewController*)destinationViewController getImagePath];
        [self.parentViewController.view setUserInteractionEnabled:YES];
        [condition unlock];
    
    
    
    }
    

    I hope that would help any one who needs it

    Regards,