canOpenURL成功但openURL失败,tel为urlschema

时间:2017-07-28 11:10:14

标签: ios swift url-scheme

我的应用程序是这样的:

用户在一个textField中输入电话号码。应用程序保存它。然后它会在详细屏幕中显示电话号码,其中包含" Call"按钮。我调用canOpenURL方法,如果成功,则启用我的呼叫按钮,否则将其禁用。

我正在使用以下格式创建网址:tel:phone number

现在,我的一位测试人员添加了电话号码=' 55'现在,当我呼叫canOpenURL时,它正在取得成功,但是当我调用openURL方法时,它没有显示电话号码的弹出窗口。

对于其他电话号码,即使是2位数的电话号码(例如= 13),这个电话号码也能正常工作,但对于某些特定的电话号码,例如55,56,它会失败。

注意:根据我客户的要求,我不必对电话号码进行任何验证,就像它必须有n个字符左右一样。所以,请不要提供这样的答案。我要求canOpenURL获得成功并且openURL失败的原因。

1 个答案:

答案 0 :(得分:1)

函数canOpenURL仅检查架构是否有效,即是否安装了将处理URL的应用程序。 在您的情况下,并未说明资源是有效的,number是有效的。见https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl

55 无效的问题是 - 正如我所看到的 - 由RFC 2806tel URLScheme的规范引起。 我复制了一些相关部分:

telephone-url         = telephone-scheme ":"
                        telephone-subscriber
telephone-scheme      = "tel"
telephone-subscriber  = global-phone-number / local-phone-number
global-phone-number   = "+" base-phone-number [isdn-subaddress]
                        [post-dial] *(area-specifier /
                        service-provider / future-extension)
base-phone-number     = 1*phonedigit
local-phone-number    = 1*(phonedigit / dtmf-digit /
                        pause-character) [isdn-subaddress]
                        [post-dial] area-specifier
                        *(area-specifier / service-provider /
                        future-extension)
...
area-specifier        = ";" phone-context-tag "=" phone-context-ident

在我阅读EBFN时,telephone-subscriper始终以+1字符开头。

此外,在2.5.2 Phone numbers and their scope中,RFC说:

If a <local-phone-number> is used, an
<area-specifier> MUST be included as well.

在我看来,这就是tel:55失败的原因,但tel:13还可以。