调用 openURL 后 iOS 9.3 卡住

标签 ios objective-c openurl ios9.3

在 iOS 9.3 版本 13E233 和 13E234 上调用 openURL 后我的应用程序卡住。

我尝试使用 dispatch_after 但这并没有解决问题。

这是代码,没什么特别的。

+ (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];
    }];
}

这似乎是一个 iOS 错误,许多其他应用也受到影响。

最佳答案

在 iOS 9.3 的主线程上调用时确实会导致死锁(在 iPhone 6 和 iPhone 6 Plus 上测试过)。

semaphore

回溯:

* 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

我发现将整个调用包装在 dispatch_async block 中可以解决问题:

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

我会向 Apple 提交 Radar 并将其发布在 Open Radar 上.

看起来这是在 iOS 9.3.1 中修复的:

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

关于调用 openURL 后 iOS 9.3 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36257922/

相关文章:

ios - Swift 中的某些东西类似于 C# 中的 LINQ

ios - UILabel内容未刷新

flutter - 如何将 http url 链接到 flutter-web

iphone - 如何更改 UIButton 标题?

ios - UILabel 新文本值未在 XCUITest 内更新

ios - 是否可以设置 AVPlayer 以允许设备在视频播放期间进入休眠状态?

ios - NSWidgetExtensionContext openURL Swift

ios - openvpn ios 客户端自定义 url 方案

ios - NSRange,在段落中找到一个词得到错误的结果

ios - 寻找一种更简洁的方式来执行此搜索功能