将 Api 的 openURL 与 iPad 中的模式 tel 错误链接

Posted

技术标签:

【中文标题】将 Api 的 openURL 与 iPad 中的模式 tel 错误链接【英文标题】:Linking Api's openURL with schema tel error in iPad 【发布时间】:2017-06-15 05:17:01 【问题描述】:

我正在使用以下代码...

openPhoneDialler(mobile) 
    let url = 'tel:' + mobile;
    Linking.canOpenURL(url).then(supported => 
      if (!supported) 
        throw 'Cant open phone dialler';
       else 
        return Linking.openURL(url);
      
    ).catch(err =>
      Alert.alert('Error','Error occurred',[text: 'OK', onPress: () => ])
    );
  

我在没有 SIM 卡功能(仅限 Wifi)的 iPad 上进行测试,canOpenURL 被解析并调用 Linking.openURL(url) 显示带有手机号码的警报和两个选项“取消”和“呼叫” .当我按下“呼叫”时,警报会关闭,并且没有任何预期发生,因为它是只有 Wifi 的 iPad。

但是当我按下“取消”时,应用程序崩溃并显示以下错误屏幕

JSON value '
    code = EUNSPECIFIED;
    domain = RCTErrorDomain;
    framesToPop = 1;
    nativeStackios =     (
        "0   workforce_mobile                    0x00000001000d4d00 RCTJSErrorFromCodeMessageAndNSError + 152",
        "1   workforce_mobile                    0x0000000100053e4c __41-[RCTModuleMethod processMethodSignature]_block_invoke_2.224 + 192",
        "2   workforce_mobile                    0x000000010015e2f0 -[RCTLinkingManager openURL:resolve:reject:] + 352",
        "3   CoreFoundation                      0x000000018164ce80 <redacted> + 144",
        "4   CoreFoundation                      0x00000001815422b4 <redacted> + 292",
        "5   CoreFoundation                      0x0000000181546e7c <redacted> + 60",
        "6   workforce_mobile                    0x0000000100055098 -[RCTModuleMethod invokeWithBridge:module:arguments:] + 1704",
        "7   workforce_mobile                    0x00000001000aea54 -[RCTBatchedBridge callNativeModule:method:params:] + 568",
        "8   workforce_mobile                    0x00000001000addf4 __33-[RCTBatchedBridge handleBuffer:]_block_invoke.477 + 1276",
        "9   libdispatch.dylib                   0x00000001804fe9e0 <redacted> + 24",
        "10  libdispatch.dylib                   0x00000001804fe9a0 <redacted> + 16",
        "11  libdispatch.dylib                   0x000000018050cad4 <redacted> + 928",
        "12  libdispatch.dylib                   0x00000001805022cc <redacted> + 884",
        "13  libdispatch.dylib                   0x000000018050ea50 <redacted> + 540",
        "14  libdispatch.dylib                   0x000000018050e7d0 <redacted> + 124",
        "15  libsystem_pthread.dylib             0x00000001807071d0 _pthread_wqthread + 1096",
        "16  libsystem_pthread.dylib             0x0000000180706d7c start_wqthread + 4"
    );
    userInfo = "<null>";
' of type NSDictionary cannot be converted to NSString

注意:当您在没有任何按键的情况下将警报打开大约 10 秒时也会发生同样的崩溃。

测试于:iPad(仅限 Wifi 和物理设备)操作系统版本 10.3.1

这是 React-Native Linking Api 或上述代码中的错误。

【问题讨论】:

【参考方案1】:

Linking.openUrl 返回一个承诺对象。通过按下 Cancel 按钮,您会导致 promise 被拒绝。只需添加一个捕获来吞下被拒绝的承诺。

Linking.openUrl().catch(() =&gt; null)

以下是相关文档:

https://facebook.github.io/react-native/docs/linking.html#openurl

【讨论】:

但我使用的是return Linking.openURL(url),它将承诺返回给外部捕获,它应该捕获正确。

以上是关于将 Api 的 openURL 与 iPad 中的模式 tel 错误链接的主要内容,如果未能解决你的问题,请参考以下文章

iOS 私有 API 调用将应用程序带到前台

作为UIApplication单例对象的方法 openURL方法的变化

如何在 iPad 上以编程方式启动 iBooks 电子阅读器?

覆盖 openURL 后无法推送视图控制器

Swift 中的应用程序 openURL

如何从 iPad 应用程序启动 Safari 浏览器? [复制]