iOS应用WebKit视图点击拨号按钮报错Error acquiring assertion是什么原因?
[assertion] Error acquiring assertion: <Error Domain=RBSServiceErrorDomain Code=1 "(originator doesn't have entitlement com.apple.runningboard.assertions.webkit AND originator doesn't have entitlement com.apple.multitasking.systemappassertions)" UserInfo={NSLocalizedFailureReason=(originator doesn't have entitlement com.apple.runningboard.assertions.webkit AND originator doesn't have entitlement com.apple.multitasking.systemappassertions)}>
该错误来自iOS系统的RunningBoard服务,该服务负责全系统进程的生命周期管控、权限校验和运行资源断言分配。报错的直接触发逻辑如下:
- 当在WKWebView中点击
tel:协议的呼叫链接时,WebKit内核会先尝试向RunningBoard服务申请进程保活断言,确保跳转至系统拨号页面前Web进程不会被系统提前回收 com.apple.runningboard.assertions.webkit和com.apple.multitasking.systemappassertions是苹果仅向系统内置应用、Safari浏览器开放的专属权限,普通第三方应用默认没有该权限,断言申请被系统拒绝后就会抛出该错误
注意:该报错本身属于警告级别的日志输出,绝大多数情况下不会直接导致呼叫功能失效。如果你的呼叫功能完全无法触发,是因为WKWebView默认没有对
tel:协议做跳转适配,和该报错没有直接关联。
如果呼叫功能无法正常触发,按照以下步骤处理即可:
- 实现WKNavigationDelegate的
decidePolicyFor navigationAction代理方法,手动拦截tel:协议跳转,不要交予WebKit默认处理 - 拦截到
tel:链接后,主动调用UIApplication的开放接口触发系统拨号逻辑,避免WebKit的断言申请动作 - 无需为该报错额外申请权限,苹果不会向第三方应用开放对应的entitlement,不会影响应用审核和正常功能使用
示例代码(Objective-C):
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSURL *requestUrl = navigationAction.request.URL; if ([requestUrl.scheme isEqualToString:@"tel"]) { if ([[UIApplication sharedApplication] canOpenURL:requestUrl]) { [[UIApplication sharedApplication] openURL:requestUrl options:@{} completionHandler:nil]; } decisionHandler(WKNavigationActionPolicyCancel); return; } decisionHandler(WKNavigationActionPolicyAllow); }
示例代码(Swift):
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let url = navigationAction.request.url, url.scheme == "tel" else { decisionHandler(.allow) return } if UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url) } decisionHandler(.cancel) }
如果呼叫功能已经可以正常触发,仅控制台输出该报错,无需做任何额外处理,属于iOS系统的正常日志输出。
内容的提问来源于stack exchange,提问作者MLima

