移动端(安卓ios微信端)的兼容性问题吴飞ff

前言:这里移动端主要指hybridapp中的H5页面。app中对页面样式和功能的需求会更精细一点。

1、适配:手机端的尺寸多样,3.5英寸的iPhone4应该是最小的,只要考虑兼容到iPhone4就可以了。(iPhone4的用户量现在也很少,有时只要兼容到iPhone5就可以了)

总结:

rem+媒体查询适配(rem基本可以适配大部分的移动端的适配,解决不了的使用媒体查询基本可以解决),重点熟练下媒体查询手机是用height还是device-height来查询的。有的手机,下面有一条黑色的手机按键,此时的device-height有没有包含这块高度。注:不同手机宽度基本没什么适配的,rem基本就解决了。主要是针对需要一屏显示的页面,高度差距太大,用rem基本没什么效果。

2、JS呼起和隐藏键盘(默认是需要用户点击输入框才能呼起):智能机的键盘都是软键盘。应用中有呼起键盘和隐藏键盘的需求。

呼起键盘:进入搜索页,要求键盘拉起。主要聚焦到input框就可以。(安卓上没有问题,ios上无效)

this.$refs.input.focus()//在一个demo上安卓和ios都有效,但是正式项目中,ios中无效隐藏键盘:通过给input标签,设置readonly属性就可以使键盘收起来了。(安卓上没有问题,ios上无效)

或,下面的方法安卓和ios上都有效

this.$refs.input.blur()3、软键盘呼起引起的兼容性问题:

a、会使webview高度变小(这里就要求body最好设置一个最小的高度为没有键盘时的高度),并且fixed定位元素跟着键盘上移(安卓的问题):

问题原因:

安卓手机:同一个手机,H5页面的视口高度在键盘拉起和隐藏时,不一样的。拉起时,键盘部分的高度变成原生的内容了,H5容器高度就变小了。(H5页面本身的高度是不变的)

一般情况这个都不影响,但是如果底部有fixed定位的话。键盘拉起时,会把这块内容也移上去的,需要做一个判断进行隐藏(这个隐藏必须是针对对安卓机,ios机上不能隐藏。ios上也隐藏了,键盘)。

ios手机:更不正常,键盘弹出不影响H5容器的大小变化的,即clientHeight的大小不变,但是却出现了滚动(如果clientHeight同步变小,可以理解为变成了一个小屏的容器。但是ios这样,只是把滚动条的范围变小了;

滚动条到底了,页面的底部在键盘的上了。键盘遮挡的部分也是属于clientHeight,这一部分的高度,凭空给H5页面了)。总结起来就,ios中键盘弹起,会给H5页面的高度增加了一个键盘的高度。

个人看法:键盘弹出,可以这样理解为h5的底板的大小就是webview的大小,包括键盘。底板上一张画布,画布高度可以被撑高,html、body等元素是固定在画布上的。浏览器中页面的滚动的跟着画布滚动的。

安卓上,画布的最小高度是底板不包括键盘的高度;ios上,画布的最小高度是低板的高度加上键盘的高度。(css无非操作画布的属性)

解决问题:

页面只能是一屏的:这个要考虑自适应。键盘呼起,webview的高度变小了。使用absolute定位,bottom设置,定位参考的元素高度不能受webview高度的影响(给body设置一个最小高度,开始就通过js获取);或者使用top设置高度。

如果,要考虑所有手机中底部的按钮必须离底部相同的距离。这个可能就要使用js获取没有键盘时屏幕的高度。然后把定位参考元素高度设置为这个值。

页面可以滚动:这个比较简单,没有键盘时,页面高度已经大于容器的高度了。呼起键盘后还是滚动的。没有任何的问题。

b、软件盘唤起,在表单外滑动,软键盘不关闭,点击才会关闭(这点表现,两者是一样的,没有兼容性问题,记录下这个特性)。

c、软件盘的关闭方法,表单失去焦点/软件盘上的关闭按钮(这点表现,两者是一样的,没有兼容性问题,记录下这个特性)

d、点击软键盘上的关闭按钮、安卓手机不会触发表单的blur事件,ios可以。(安卓的问题)

需要软件盘关闭时执行代码,在安卓上就需要做兼容处理。(解决安卓的一些兼容性问题,必须要在软键盘关闭时执行。如键盘拉起时,会把底部fixed元素移上去的,需要做一个判断进行隐藏;关闭软键盘时,再显示)

e、软键盘唤起时fixed元素失效(ios的问题):如下说明

a、顶部fixed元素,input框在顶部:点击这个input框,fixed虽然失效了,但是页面不会滚动。fiexd元素会滚动是因为软键盘的弹出,fixed失效了(或变成了absolute),只要input失去焦点时,立刻把键盘关闭,fixed元素就没有滚动的机会。

这样就可以解决fixed无效的问题了。

b、底部fixed元素,input框在底部:这个input输入框,点击这个输入框,页面都会向上滚动的。input框始终在键盘上面,键盘关闭,滚上去的页面也不会滚下来。

这个当表单失去焦点时(或触发键盘隐藏事件时),让页面滚动到之前的位置就可以解决:

5、解决页面,返回时重复的问题(重要,app中返回是经常会用到的,所以浏览器历史记录需要页面控制下。页面前进或回退时,url只是参数的改变,页面是不刷新的)

A(列表页)=》B(详情页,B中有跳到A页面的按钮):列表A1=》B点击跳到A的按钮=》

列表A2=》B。这个时候回退时,B=》A=》B=>A会出现不断重复的问题

解决方案:使用vue路由的vm.$router.replace()方法跳转,或原生的location.replace(URL)

6、input中占位文字,无法上下居中对齐(应该是字体小于12px,引起的问题)。

7、ios监听软键盘确认按钮:会无效(那个确认按钮会变化为换行按钮,换行时,监听key=13是对的。变成确认时,监听不了key=13的这个键。【猜测可能同一个键,确认的键盘码不是13】)

//form标签必须加这个方法可以不用监听key=13事件,直接监听form的submit事件同样可以监听确认按钮。

(项目中是在搜索框右边加一个搜索按钮,不使用软键盘上的确认按钮)

原因(个人猜测):移动端是支持12px以下的字体的。安卓上小于12px的字体,字体会溢出标签一点。亲测,如下图,设置了居中的样式,字体设置为10px,字体溢出他的包含标签sapn。即,

浏览器12px以下的字体以12px显示;移动端小于12px的字体,也可以正常显示,但是排版有点小问题(会上移)。

常规的居中方案都没有用的,使用scale可以近似解决,但是不够完美。目前没有其他的可行方法。或者使用媒体查询,小于12px的尺寸,就以12px显示。折腾了好久,找不到好的办法

9、ios上vue框架中返回keep-alive的页面(这个页面比较长,有滚动。滚到顶部,进入下一个页面),会出现白屏(被什么东西遮挡住了)。手轻轻滑动下,遮挡层就消失了。

10、ios中h5页面输入框点击空白处不会失去焦点软键盘不会收起(重要):

11、ios-H5中,不过页面的高度是多少(html,body设置为50px,只有一个input标签),只要键盘弹出,页面就一定会滚动。通过上面的方法,input失去焦点马上隐藏键盘。这样活动的时候键盘隐藏,页面就不会滚动了。

但是,在input内部滑动,还是会带动页面滚动的,给input标签添加一个touchmove阻止默认事件。就完美了

12、禁止ios页面上下滚动回弹(橡皮筋效果):没有橡皮筋效果,就不会出现fixed失效的问题。

解决方案1、使用inobounce.js插件(亲测有效)。但是整个页面都不能滑动了,有溢出的屏幕的元素也不能滑动的。

里面的方案1:【纯css实现】.container{position:fixed;top:0;bottom:0;width:100%;height:100%;overflow:scroll;}里面的方案2:【使用js,阻止body默认的touchmove事件,会导致整个页面的的上下滑动被禁止。还要解决里面内容的上下滑动问题】

目前测试这个方案还没有成功,后续会继续验证。

说明:通过阅读inobounce.js的源码(源码代码量很少),发现原理就是使用window代理屏幕上的touchmove事件(window.addEventListener)。判断当前触发的对象是非滚动区域,则阻止事件的默认行为;滚动区域,不阻止事件。

具体实现,插件中考虑的比较全面,比较复杂。直接使用插件是最方便的。

安卓和ios对软键盘关闭的行为是不一样的。安卓中软键盘关闭,webview高度变化(blur事件不一定触发);ios中软键盘关闭,触发blur事件【或focusout】(webview高度没有变化)。

解决方案:移动端开发,body内的元素,最外层的标签要设置一个高度(一般是容器的高度100vh),溢出属性设置滚动。不要让body的高度超过100vh了,不然fixed的遮罩层上面滚动,下面的内容一会滚动。处理起来比较麻烦。

亲测问题:在fixed层上使用vue的@touchmove.prevent阻止默认事件,结果上下两层的滚动都禁止了;使用@touchmove.stop阻止冒泡事件,结果无效。

问题分析:

a、body的高度超过容器高度,body是比较特殊的标签。fixe层的touchmove事件,会导致body滚动。

b、非body的标签,如div标签是一个溢出滚动的标签,其内的一个标签作为fixed遮罩层,则遮罩层内的内容滚动,不会触发这个div标签的高度。(个人猜测,遮罩层虽然在div标签内,但是已经脱离标准文档流,事件上于div已经没有关系)

c、body是比较特殊的标签,fixed遮罩层内的touchmove还是会到body上的。

说明:测试测出这个bug,自己测试一直没复现出来。可能触发机制不是很准确。

在安卓的容器(webview)中,视频播放需要点击两次,即播放-暂停-播放,才能开始播放。(暂时没有找到解决方案)

注意:1、移动端1像素问题,和视口大小没有关系。css中的像素是逻辑像素。

2、最后展示到屏幕上的是物理像素实现的,即逻辑像素经过计算,转化为物理像素显示。

3、0.5px是有兼容性问题的,安卓手机会把0.5px处理成1px,显示还是比较粗的。

产生原因:在retina屏中,1个逻辑像素,可能需要2个或3个物理像素来显示。而px已经是css最小的逻辑像素单位,css中0.5像素会处理成0px。

所以无法实现1px的物理像素渲染。

【注意:css中的px,是渲染在布局视口上的。是布局视口无法正常处理0.5px,布局视口的1px是可以渲染出0.5px的物理像素的】

解决方法:

1、0.5px方案:可能手机厂商知道存在这个问题,所以现在有的手机已经可以实现0.5px渲染1px的物理像素了。

在IOS8+,苹果系列都已经支持0.5px了,可以借助媒体查询来处理。

2、最佳解决方案:transform:scaleY(0.5);【在一个方向缩小一半】

原理:将布局视口放大,布局视口最后还是要全部呈现到屏幕宽度的【即缩小】。如dpr=2时,这时候css中1px就是布局视口的1px,

布局视口中的1px会被处理成0.5px对应的物理像素进行渲染。

总结:安卓和ios的兼容性,主要的问题,还是软件键盘引起的。所以两者关于软键盘的处理一定要让他们尽可能的保持一致。如下要做到一致:

a、输入框,聚焦时弹出软件盘。失去焦点时,隐藏软件盘(ios需要处理的)。

b、ios的橡皮筋效果一定要禁掉(使用inobounce插件)。

c、ios和安卓两者对软键盘关闭的判断的逻辑不同(软键盘关闭时,执行代码这个功能是一定会用到的)。现在的手机不是ios就是安卓手机,可以把这两段代码封装在一个方法里,变成一个软键盘关闭的事件(实际开发中,一般只是对一种情况做出处理)。

if(isIOS){//在ios中执行下面监听事件,捕获软键盘关闭事件。(isIOS通过获取navigator.userAgent就可以判断)window.addEventListener('focusin',()=>{//键盘弹出事件处理alert("iphone键盘弹出事件处理")});window.addEventListener('focusout',()=>{//键盘收起事件处理alert("iphone键盘收起事件处理")});}if(isAndroid){//在android中执行下面监听事件,捕获软键盘关闭事件constinnerHeight=window.innerHeight;window.addEventListener('resize',()=>{constnewInnerHeight=window.innerHeight;if(innerHeight>newInnerHeight){//键盘弹出事件处理alert("android键盘弹窗事件");}else{//键盘收起事件处理alert("android键盘收起事件处理")}});}感悟:1、如果不用输入框,基本没有什么兼容性问题。css的兼容性问题也基本没有,就几个默认样式的区别;没有软键盘,ios回弹效果也没什么影响,可以不做处理。

2、上面讲的安卓和ios上的兼容性问题,都是webview内核的兼容性问题。hybrid-app中SDK方法也会有兼容问题的,这种bug完全就是安卓和ios软件开发者没有(或无法)统一引起的。一般安卓和ios是不同的人开发的。

1、touch事件:

touchstart:手指触摸到屏幕会触发

touchmove:当手指在屏幕上移动时,会触发

touchend:当手指离开屏幕时,会触发。

注意:使用touchend事件时,一定要考虑touchcancel事件。比如,语音功能。按下说话,突然弹出语音权限未开。这个时候手指拿开就不会触发touchend事件了,touch事件被打断了,屏幕上一直是touchstart的状态。

THE END
1.苹果手机之间怎么互转短信不知道题主找到答案没有,我这里回答一下吧,也许对别人有帮助,首先,这个是可以实现的,前提是两部手机一定要登陆同一个苹果ID,不过电话的话要要求另一部手机在被打电话旁边而且接通无线网短信可以完美实现同步,两部手机不需要在附近,只要另外一部手机有接通互联网,不插卡可以。设置方法得话在苹果的设置-短信,两部手http://m.51goumai.com/know/198160.html
2.苹果手机怎么粘贴复制的东西苹果手机怎么复制粘贴苹果手机复制粘贴操作步骤 1. 打开手机找到所需要复制粘贴的内容。 2. 长按需要复制的内容,等待出现淡黄色选择框。 3. 调节选择框两侧可以选择需要复制的内容,选择完成后点击拷贝。 4. 复制步骤就完成了,点击需要复制粘贴内容的框中,单击屏幕再点击粘贴。https://www.hq66.cn/a/kpv7vqjpj.html
3.新舊交替!舊iPhone轉新iPhone資料轉移方法大全雖然有官方的方式可以將資料從舊 iPhone 轉到新 iPhone,但使用專業的第三方程式來協助可能會是最好的選擇——如專為 iOS 所設計的 AnyTrans,即可幫你做到無痛轉移資料。使用 AnyTrans,你不僅能將資料從舊 iPhone 轉到新 iPhone,你還能將資料從舊 iPhone 轉到舊 iPhone,無需重置你的 iPhone。現在就讓我們先來https://www.imobie.com/tw/iphone-manager/old-iphone-to-new-iphone.htm
4.iphone怎么群发短信②信息内容由于群发短信会同时发送给多个人,因此信息内容的选择要尤为谨慎。避免发送过于私人或敏感的内容,以免给收件人带来不适。 ③发送频率频繁地发送群发短信可能会被视为骚扰行为,因此建议合理控制发送频率,避免给收件人造成不必要的困扰。 四、群发短信的扩展功能 https://sybrsound.com/jiqiao/8194.html
5.没想到苹果手机还有这么多隐藏功能!网友:我用了十几年头一次知道白没想到苹果手机还有这么多隐藏功能!网友:我用了十几年头一次知道2024-12-19 16:44:40 来源: 滑稽斑马呀 陕西举报 0 分享至 嘿,你还在以为你的苹果手机只是用来打电话、发短信吗?那就OUT啦!其实苹果手机里藏着的那些小秘密,绝对让你大开眼界!从快捷手势到隐藏应用,每一项都让你惊叹不已! (视频源于网络https://www.163.com/dy/article/JJPLQN5R05561G2G.html
6.短信验证码:iOS和安卓端系统的设计方案差异和最优选择人人都是而优化后的iOS系统操作路径,只需要做1步:点击系统键盘上面“From Message”的验证码。 相对来说,安卓系统反而没那么便捷(基于不对短信进行第三方授权基础上)。 操作路径如下: 点击收到短信的“一键复制按钮”(3-5秒有效)>点击输入框>长按/双击>点击粘贴选项 https://www.woshipm.com/pd/3099182.html
7.讯飞输入法更新时间版本号更新内容 2015/10/16 V5.2.1482 1、新增:“随声译”功能,输入文字时,说中文直接出英文,英文交流So Easy! 2、优化:提升iOS9输入法稳定性[18]。 2015/03/20 V5.0.1392 1、新增皮肤商店,多套精美皮肤自由选择 2、新增祝福语功能,祝福短信一键即发 3、新增南京话、陕西话、山西话方言输入 4、https://baike.sogou.com/v10447869.htm
8.中国移动云盘隐私政策Ancroid端您可通过云盘中的【设置】>>【账户与安全】>>【权限管理】 对系统权限进行开关管理,包括日历、通话记录、通讯录、存储、相机、麦克风、短信、位置、剪切板、个性化推荐设置、通讯录权限开关的设置。 ios 端您可通过云盘中的【设置】>>【账户与安全】>>【权限管理】 对系统权限进行开关管理,包括相机、麦克https://yun.139.com/doc/policy.html
9.APP聊天源码视酷服务端安装部署文档老吴搭建教程2.替换ios apns推送证书,个人版和企业版选择一个使用即可,需要注意在申请ios apns 证书的时候必须要设置密码。 3.修改application.properties 配置文件 将申请好的小米、华为、极光 等平台的key secret 配置到对应的位置 ? 修改完配置后使用 sh start 命令启动shiku-push服务 https://www.lw50.com/post/158.html
10.移动端微信页面兼容性问题集合–开源达人博客15、 IOS获取短信验证码–自动填充被复制两遍问题:参考链接 说明:测试测出这个bug,自己测试一直没复现出来。可能触发机制不是很准确。 16、video标签,在安卓手机 不能自动播放:https://blog.csdn.net/weixin_34037173/article/details/88718114 在安卓的容器(webview)中,视频播放需要点击两次,即播放-暂停-播放,才能http://www.kydr.net/archives/15605
11.IOS自动化任务监视短信内容ios自动化发信息IOS自动化任务 监视短信内容 ios自动化发信息 安装部署 在敏捷开发中,经常会听到TDD,BDD这些词语,对于如何进行测试驱动开发,不同的敏捷团队有不同的执行方式,针对于目前在iOS下的测试方案,我们搭建了iOS的自动化测试平台。 需要的安装文件(以下文件放到同一个目录下面,我的命名是setup_cucumber):https://blog.51cto.com/u_39037/10884698
12.自己动手实现Android自动化:用Auto.js自动复制短信验证码至此,自动复制短信验证码的实现逻辑就大致被我细化成如下流程: 教你手把手实现 前期准备 下载Auto.js 之后我们首先需要为其开通相应的通知权限,以便能够获取到通知消息栏里的内容;除此之外,为了能够方便地调试脚本,所以我们需要在连接 WiFi 的同时开启「服务器模式」选项,第一次开启该选项的时候会弹出有关于手机的网https://ios.sspai.com/post/76377
13.iOS小技能:提取数字(文本框对粘贴内容进行手机号码提取)复制 // 监听文本改变-(void)textViewEditChanged:(NSNotification*)obj{UITextField*textField=(UITextField*)obj.object;if([textField.placeholder containsString:@"手机号"]||self.model.type==UserEnterViewType4PhoneNO){//登录界面的【请输入手机号】文本框,对粘贴内容进行格式判断:经过前后空格处理之后,https://cloud.tencent.com/developer/article/2078843
14.隐私条款明道云您可以通过我们向您发送的短信或邮件中所提示的方式拒绝接收我们向您发送的营销信息,或通过“联系我们”部分所列方式与我们联络。为了保障您可以正常接收推送内容,避免消息遗漏,我们使用了App自启动和关联启动其他App功能。 249 1.7搜索功能 当您使用搜索功能时,我们会收集您的搜索记录,以便更好地向您展示和您的搜索https://www.mingdao.com/privacy
15.隐私协议(标准)(一)查询、更正、补充和复制您的个人信息 1、勤策(原外勤365)企业/组织用户 作为勤策(原外勤365)企业/组织用户的管理员,您有权查询、更正或补充您所在企业/组织的信息,但法律法规规定的例外情况除外。您可以通过以下方式自行进行: 打开勤策(原外勤365)官方主页(qince.com),选择右上角“登录”后通过输入密码后登https://www.waiqin365.com/p-faq-1635.html
16.意昂意昂平台意昂注册地址打开(意昂登录平台)官方主页,选择右上角“登录”后通过输入密码后登录“(意昂官网)企业管理后台” 可以查询、更正企业/组织控制信息,包括通讯录信息、修改登录密码、更换管理员、设置子管理员等。 2、(意昂注册平台)个人用户 作为(意昂登录注册)个人用户,您有权查询、更正、补充或复制您的个人信息。您可以通过以下方http://www.zztaimin.com/book/
17.iOS12贴心小功能:iPhone也能自动复制短信验证码了WWDC18已经正式发布iOS12测试版,主要提高了设备的流畅度,很多人认为这是功能增加最少的大版本。然而据爱思助手网友体验,iOS12新增了一个官方未提及的贴心小功能,iPhone也能自动复制短信验证码了。 当你的iPhone收到一条短信验证码,iOS自带输入法上方,会直接出现“From Messages”和验证码,点击即可快速输入验证码。 https://m.i4.cn/article/20458.html
18.其他坚果云帮助中心第2页在电脑本地的同步文件夹或者网页端,选中需要分享的文件或文件夹,右键点击【获取分享链接】,然后【复制链接】就能获得一串分享链接。您可以将它发送给任何您想要分享的好友,对方通过这个链接就可以打开你分享给他的文件内容,在分享前,也可以在弹出的对话框内可以选择【权限设置】,对这个分享链接进行分享范围及密码等权限https://help.jianguoyun.com/?cat=1&paged=5&paged=2
19.超赞!每个设计师都应该了解的IOS编年史优设网iOS 1: iPhone诞生 虽然现在很难以想象当时的情形,但是当iPhone1公布的时候,如果严格比较功能的话,iPhone落后他的竞争对手一大截,Windows Mobile,Palm OS,Symbian,BlackBerry的操作系统都有一大堆功能,远超iPhone。 那时候的iPhone缺点还是不少的:不支持3G,不支持多任务处理,不支持第三方应用,无法复制粘贴文本,电邮无https://www.uisdc.com/ios-history-iphone-ipad/
20.ios短信验证码自动填充时总是被复制两遍某些app或者微信网页里复制验证码是苹果手机会触发UITextFieldTextDidChangeNotification监听事件,导致验证码出现了两次。 解决: 限制input标签的maxlength;验证码长度如果是4位就限制到4,如果是6位,就限制到6位,也算是曲线救国。 input 属性为 number,maxlength不起作用,记得改为type=texthttp://wlphp.com/?post=306
21.苹果IOS免费接收短信验证码软件常用软件运行之后,我们可以看到如图内容,展示一部分手机号及其所属国家和目前已接收过的短信条数,并且可以通过点击「上一页」「下一页」来查看更多手机号。 选择一个手机号之后,会自动将所选择的手机号复制到剪贴板,并展示最近接收的五条短信。接下来我们回到需要注册的APP,粘贴手机号并获取验证码。然后在回到捷径点击刷新按https://www.qqshen.com/article-2718-1.html
22.ios短信验证码自动填充时总是被复制两遍bug某些app或者微信网页里,复制手机收到的短信验证码,会触发UITextFieldTextDidChangeNotification监听事件,导致验证码出现了两次,这个应该是ios系统内部的bug. 解决方法 如果input框的type=“text” 或者 type=“password”,则可以给input框加上maxLength属性,让最大长度等于验证码的位数。 https://huaweicloud.csdn.net/64e855a54165333c3076ae56.html
23.将三星转移到iPhone:将所有内容从三星移至iPhone6s/6/iPhone现在,您必须在中间列中选择要复制的内容,您可以在其中选中或取消选中内容以决定要切换的内容以及不切换的内容。 然后单击“开始复制”以开始数据传输。 好的,您已将文件复制到新的iPhone 6而不会丢失数据。 借助Mobile Transfer,您可以随意将音乐,短信,联系人和照片复制到新的iPhone 6中。 https://www.android-iphone-recovery.com/zh-CN/?p=1063
24.iOS提取数字(手机号):文本框对粘贴内容进行手机号码提取// 监听文本改变 -(void)textViewEditChanged:(NSNotification *)obj{ UITextField *textField = (UITextField *)obj.object; if ([textField.placeholder containsString:@"手机号"] || self.model.type == UserEnterViewType4PhoneNO) { //登录界面的【请输入手机号】文本框,对粘贴内容进行格式判断:经过https://developer.aliyun.com/article/854171