我的应用程序是这样的:
用户在一个textField中输入电话号码。应用程序保存它。然后它会在详细屏幕中显示电话号码,其中包含" Call"按钮。我调用canOpenURL
方法,如果成功,则启用我的呼叫按钮,否则将其禁用。
我正在使用以下格式创建网址:tel:phone number
。
现在,我的一位测试人员添加了电话号码=' 55'现在,当我呼叫canOpenURL
时,它正在取得成功,但是当我调用openURL
方法时,它没有显示电话号码的弹出窗口。
对于其他电话号码,即使是2位数的电话号码(例如= 13),这个电话号码也能正常工作,但对于某些特定的电话号码,例如55,56,它会失败。
注意:根据我客户的要求,我不必对电话号码进行任何验证,就像它必须有n个字符左右一样。所以,请不要提供这样的答案。我要求canOpenURL获得成功并且openURL失败的原因。
答案 0 :(得分:1)
函数canOpenURL
仅检查架构是否有效,即是否安装了将处理URL的应用程序。
在您的情况下,并未说明资源是有效的,number
是有效的。见https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl
55 无效的问题是 - 正如我所看到的 - 由RFC 2806中tel
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还可以。