IOS 12以后增加了键盘自动识别验证码的功能;但是在cocos2dx-3.17 中并没有实现这一功能;所以需要对EidtBox修改,增加开启自动获取短信验证码的设置;
在EditBox中,真正与各个平台进行交互的对象是
EditBoxImpl* _editBoxImpl;
在EditBoxImpl中是一系列的纯虚函数。
而EditBoxImplCommon则继承于EditBoxImpl;并对EditBoxImpl中的纯虚函数进行了重写。在重写函数中,保存相应的设置参数,并调用设置原生平台参数的函数。在EditBoxImplCommon中,对一系列原生平台的参数设置函数也都是纯虚函数,由各个原生平台类分别实现函数内容。
基于以上结构逻辑,我们需要在IOS平台上设置开启短信识别功能的话,则需要:
EditBoxImpl 中添加纯虚函数:virtual void setTextContentTypeOneTimeCode() = 0;
在EditBoxImplCommon 中实现:
virtual void setTextContentTypeOneTimeCode() override;
void EditBoxImplCommon::setTextContentTypeOneTimeCode()
{
this->setNativeTextContentTypeOneTimeCode();
}
并添加设置原生平台的对应纯虚函数:
virtual void setNativeTextContentTypeOneTimeCode() = 0;
接下来就是在各个平台实现以上纯虚函数;由于此功能只会在IOS平台上使用,所以在其他平台只需要实现空函数即可
virtual void setNativeTextContentTypeOneTimeCode() override{};
而在IOS平台中,实现如下:
void EditBoxImplIOS::setNativeTextContentTypeOneTimeCode()
{
[_systemControl setTextContentTypeOneTimeCode];
}
在UIEditBoxImplIOS_objc定义- (void)setTextContentTypeOneTimeCode;
并实现
- (void)setTextContentTypeOneTimeCode
{
if (@available(iOS 12.0, *)) {
self.textInput.textContentType = UITextContentTypeOneTimeCode;
} else {
// Fallback on earlier versions
}
}
由于此功能只是在IOS12以上版本版本才添加的,所以需要在函数中判断系统是否是12以上。
注:在EditBox为非空或非选中状态下,不会在键盘上显示获得验证码,所以在接受到验证码时需把EditBox设置为第一响应对象,并清空内容。