用作记录这次更新遇到的一些坑。目前有以下,持续更新:
蓝牙隐私权限
modal样式:modalPresentationStyle
(13.1.2上已修复)UIGestureRecognizer的delaysTouchesBegan与touchesBegan:
UITextField的UIKeyboardWillChangeFrameNotification通知
暂时不适配DarkMode的问题
关于UTI的一个小问题
待更新......
1. 蓝牙隐私权限
原本公司的app是请求了蓝牙权限Privacy - Bluetooth Peripheral Usage Description
的,后来更新的时候也看到有这方面的问题但是没多想,结果就崩了。
解决:添加Privacy - Bluetooth Always Usage Description
,而且老的还不能删貌似,否则iOS13以下的又不能用了。
2. modalPresentationStyle
其他分享里肯定也有说到这个,默认modal样式改了,需要手动设置对应的style,不过我发现了有两种说法:
// 说法一
self.modalPresentationStyle = UIModalPresentationOverFullScreen
// 说法二
self.modalPresentationStyle = UIModalPresentationFullScreen
目前知道的区别是选用UIModalPresentationOverFullScreen
会导致dismiss以后前一个controller的viewWillAppear:
不走。其他区别未深究。
解决:present控制器的时候添加x.modalPresentationStyle = UIModalPresentationFullScreen
3. (13.1.2上已修复)UIGestureRecognizer的delaysTouchesBegan与touchesBegan:
我有个view上同时添加了UITapGestureRecognizer
和重写了touchesBegan:
系列方法,之前为了防止tap的began与touchesBegan产生可能的冲突,我对手势的delaysTouchesBegan
属性赋值了YES
。在13之前没问题,但是在更新了13的设备上,总是先识别tap手势,只有在tap识别失败的时候才会调用touchesBegan:
系列方法(虽然看苹果解释本来就是这样的,但是以前不会感觉有什么问题,而这次实测我手指触摸view手指都快抬起来了才走了touchesBegan),这样导致操作的时候看上去页面像卡住了一样。
我做了一些测试:
在iOS13上不注释
delaysTouchesBegan
:
a. 单次点击(期望是tap),tap被识别,触摸不被触发。
b. 触摸view,会先等tap手势识别失败,然后触发touches系列回调,等待手势失败的时间很长。
在iOS13上注释delaysTouchesBegan
:
a. 单次点击(期望是tap),会执行touchesBegan:
,touchesCancelled:
和tap手势,并且触摸的began和tap同时执行,触摸的cancelled在began执行完后立即执行。
b. 触摸view,也是两种同时识别,touches正常执行,tap也如预期的失败
在iOS12上不注释delaysTouchesBegan
:
a. 单次点击(期望是tap),如期。
b. 触摸view,跟上面的iOS13上的区别是等待时间很短。
所以现在苹果也说一定要处理touchesCancelled:
,原本我只期望在tap手势里执行的一些操作,现在由于touchesBegan-Cancelled
也会走一遍,这个在我这里导致了一些问题,所以cancelled里要处理。
解决:我注释掉了delaysTouchesBegan
,改在touchesCancelled:
里处理操作。这个属性慎用,感觉苹果偷偷把时间延长了。
// tapGesture.delaysTouchesBegan = YES;
4. UITextField的UIKeyboardWillChangeFrameNotification通知
我有个页面有多个textField,在它们之间切换输入的时候,会多次收到UIKeyboardWillChangeFrameNotification
,而13之前没这个问题,这个可能会导致布局上的问题。
连接手机调试的时候,在多个textField输入框之间快速来回点击,会出现CPU飙到95+的情况,观察到后面的banner都不滚动了,Time Profile里给出的信息:
解决:关注一下键盘弹出收回操作时视图布局可能出现的问题。
5. 暂时不适配DarkMode的问题
- 原本app里的某些文字颜色是自定义的一种深色,结果在设置了深色模式的设备上直接看不到了(应该是很浅的颜色?跟白色背景混一起了)。
- 状态栏手动设置
UIStatusBarStyleDefault
的地方颜色会与期望的不一致
解决:最好的解决办法当然是适配DarkMode了。对于暂时不适配的,我在info.plist
里设置了User Interface Style = Light
,然后在需要设置状态栏的地方分情况判断。
6. 关于UTI的一个小问题
app有自定义一个文件格式,原本conform topublic.content
,在iOS13之前都没问题,在iOS13的设备上,从第三方app打开我这个自定义格式的文件,居然找不到我的app了,我怀疑是不是我原本对于public.content
有哪里理解错了。
解决:自定义文件类型改成comforms topublic.data
,现在看来没问题。