iOS 9.3 freeze after calling openURL
Asked Answered
Z

2

6

My app freezes after calling openURL on iOS 9.3 builds 13E233 & 13E234.

I tried using dispatch_after but that does not fix the issue.

Here's the code, nothing special.

+ (void)someMethod:(UIView *)senderView {

    [Utility showLoadingHUDWithText:nil inView:senderView];

    [[SomeClient sharedClient] someNetworkAPI:^(id result) {
        [Utility hideAllHUDsForView:senderView];

        NSDictionary *dict = (NSDictionary *)result;
        NSString *someString = dict[@"someKey"];
        NSURL *url = [NSURL URLWithString:someString];
        if ([[UIApplication sharedApplication] canOpenURL:url]) {
            [[UIApplication sharedApplication] openURL:url];
        }
    } fail:^(NSError *error) {
        [Utility hideAllHUDsForView:senderView];
        [Utility showMessageHUD:error.localizedDescription];
    }];
}

It seems like an iOS bug, many other apps affected, too.

Zahn answered 28/3, 2016 at 7:29 Comment(6)
can you show your code?Misadventure
Can you post the whole function code please?Praiseworthy
I bet that this is related to thenextweb.com/apple/2016/03/27/…Hadji
I have the same problem with a very similar code. Works fine on all my devices, but freezes on some random customers ... @nix-wang the HUD keep on screen instead dismiss? Because this is what customers reports ...Necklace
@Necklace Exactly. But I found this issue on other apps, which don't have any HUD.Zahn
Only comment that Apple releases iOS 9.3.1 that seems to fix this issue.Necklace
M
7

This indeed causes a deadlock when being called on the main thread on iOS 9.3 (tested on an iPhone 6 and iPhone 6 Plus).

semaphore

Backtrace:

* thread #1: tid = 0x41840, 0x0000000180ac1014 libsystem_kernel.dylib`semaphore_wait_trap + 8, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x0000000180ac1014 libsystem_kernel.dylib`semaphore_wait_trap + 8
    frame #1: 0x000000010023fa20 libdispatch.dylib`_dispatch_semaphore_wait_slow + 244
    frame #2: 0x0000000180bda934 libxpc.dylib`xpc_connection_send_message_with_reply_sync + 204
    frame #3: 0x000000018276a238 MobileCoreServices`_LSStartOpenOperation + 232
    frame #4: 0x0000000182791efc MobileCoreServices`-[LSOpenOperation main] + 1160
    frame #5: 0x0000000182771bc0 MobileCoreServices`-[LSApplicationWorkspace openURL:withOptions:error:] + 472
    frame #6: 0x000000018633cdd8 UIKit`-[UIApplication _openURL:] + 356
    frame #7: 0x0000000100096c04 MyApp`__29-[ViewController someMethod]_block_invoke(.block_descriptor=0x0000000125d37e20) + 216 at ViewController.m:57
    frame #8: 0x000000010022da7c libdispatch.dylib`_dispatch_call_block_and_release + 24
    frame #9: 0x000000010022da3c libdispatch.dylib`_dispatch_client_callout + 16
    frame #10: 0x00000001002334e4 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 2096
    frame #11: 0x0000000180ef8dd8 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
    frame #12: 0x0000000180ef6c40 CoreFoundation`__CFRunLoopRun + 1628
    frame #13: 0x0000000180e20d10 CoreFoundation`CFRunLoopRunSpecific + 384
    frame #14: 0x0000000182708088 GraphicsServices`GSEventRunModal + 180
    frame #15: 0x00000001860f5f70 UIKit`UIApplicationMain + 204
    frame #16: 0x00000001000970d0 MyApp`main(argc=1, argv=0x000000016fd6fae8) + 124 at main.m:14
    frame #17: 0x00000001809be8b8 libdyld.dylib`start + 4

I found that wrapping the entire call in a dispatch_async block fixed the issue:

dispatch_async(dispatch_get_main_queue(), ^{
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }
});

I would file a Radar with Apple and post it on Open Radar.

Looks like this was fixed with iOS 9.3.1:

Fixes an issue that caused apps to be unresponsive after tapping on links in Safari and other apps.

Madalinemadalyn answered 31/3, 2016 at 20:8 Comment(2)
I found the same error on my iPhone6 with iOS 9.3. Actually I can't use Safari (I can't open links :S) and all the application that use openURL are going to crash. An example: Slack. What's strange is that my colleague has the same configuration (iPhone6 with iOS9.3) but the error doesn't occurPraiseworthy
Actually I'm receiving this error in console: <Warning>: Error getting NanoAppRegistry workspace info: Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service named com.apple.nanoappregistry.workspace was invalidated." UserInfo={NSDebugDescription=The connection to service named com.apple.nanoappregistry.workspace was invalidated.}Praiseworthy
D
2

I faced the same issue on iPad Air 2 / 3 running iOS 9.3.5 and JAL's answer did not solve the problem for me.

The code below works like charm.

fileprivate func letApplicationHandleUrl(_ url: URL) {

    guard UIApplication.shared.canOpenURL(url) else {

        return
    }

    if #available(iOS 10.0, *) {

        UIApplication.shared.open(url, options: [:], completionHandler: nil)

    } else {

        DispatchQueue.global(qos: .userInteractive).async {

            UIApplication.shared.openURL(url)
        }
    }
}
De answered 28/8, 2017 at 13:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.