开启Apple Pencil Scribble点击输入框致Cordova应用崩溃如何解决
问题根因
开启Apple Pencil的Scribble功能后点击输入框触发的崩溃,是iOS Scribble功能与Cordova iOS平台WebView桥接层的兼容问题:系统识别到可输入元素时,会调用DOMRange实例的asDomRange方法获取文本选区范围,6.2.0版本之前的cordova-ios平台(以及旧版独立WKWebView插件)未实现该方法,最终抛出*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DOMRange asDomRange]: unrecognized selector sent to instance异常并终止应用。
适配方案
- 方案一(推荐):升级Cordova iOS平台版本
直接将项目的iOS平台升级到6.2.0及以上正式版,官方已经在版本迭代中完成了Scribble相关的方法兼容,无需额外修改代码即可正常使用手写输入功能。执行升级命令:
如果项目中单独安装了cordova platform rm ios cordova platform add ios@6.2.0cordova-plugin-wkwebview-engine插件,升级平台后需要卸载该插件,直接使用cordova-ios内置的WKWebView实现,避免插件版本与平台内置逻辑冲突。 - 方案二(适配无法升级平台的场景):手动补全缺失方法
在Xcode打开的iOS原生工程中,新建Objective-C分类文件,给DOMRange类补充缺失的asDomRange方法实现,代码如下:
将两个文件添加到iOS项目的编译源中,重新打包即可解决崩溃问题。// DOMRange+ScribbleFix.h #import <WebKit/WebKit.h> @interface DOMRange (ScribbleFix) @end // DOMRange+ScribbleFix.m #import "DOMRange+ScribbleFix.h" @implementation DOMRange (ScribbleFix) - (instancetype)asDomRange { return self; } @end - 方案三(临时兜底):禁用Scribble触发逻辑
如果业务场景不需要支持Apple Pencil手写输入,可以在config.xml中添加配置禁用WebView的输入辅助栏,阻止系统触发Scribble的选区检测:<preference name="HideKeyboardFormAccessoryBar" value="true" />
内容的提问来源于stack exchange,提问作者Josiah
相关产品推荐
相关产品推荐

