iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)
原文链接:http://www.jianshu.com/p/6cbde1b8b922
症状
iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装、第一次启动的时候,app 首屏一片空白,完全没数据。kill 掉重新打开就好了。
一开始以为是用户网络情况不好,但随着越来越多的用户报告这个问题,我意识到这并不是偶然情况。但是并非所有用户都如此。
而且卸载掉之后,如果再装,也不会出现这现象。问题只会出现在这台设备第一次安装、第一次启动的情况下。如果把手机抹掉、重置,问题还能重现。
定位问题
这个问题真的很棘手,也很难定位。幸运的是,公司同事想到把手机抹掉重置,得以在我眼前重现问题。
我发现的是,app 首次启动会弹出一个询问用户“是否允许应用访问数据”的弹框,类似下图:
虽然 app 刚打开的时候是一片空白,但我发现进去之后,登录、下拉刷新等都没问题。因此很容易猜测出这样的结论:用户点“允许”之前,网络请求全都是失败的;而点“允许”之后,网络请求就能正常进行了。
问题原因
有了方向之后就好查了。很快查到了掘金的这篇文章,得知这个弹框来自于工信部的要求。
这篇文章里还有如果弹框不出现,用户可以采取的解决方案。
另外,从少数派的这篇文章 看到,只有国行手机有这个功能。!!!
这也就解释了为何有些用户出现、而有些用户没出现这个问题。
进到手机的 设置->蜂窝移动网络,如果看到如左图就说明是不会弹框的机型,如果看到如右图,说明是会弹框的机型。
那么这个新功能会为用户带来哪些问题呢?问题主要在于,用户点击“允许”之前,所有网络请求都是被禁止的。具体有两种表现:
- 少部分用户根本不显示弹框,所以网络请求一直被禁止。针对这部分用户,只能通过客服引导,按照掘金的这篇文章,逐个尝试里面的解决方案;
- 对于绝大部分用户,弹框会正确显示;然而从 app 启动到用户点击“允许”需要一段时间,在这段时间内发出的网络请求全都会直接失败;
如果用户点击“不允许”,app 永远无法访问网络,Wifi 和数据流量均不可以。当然,这是用户自己的选择,我们没什么可做的。我们主要需要解决的是上面的第二个问题。
影响范围
这个特性推出之后,大部分 app 应该都会受到不同程度的影响。可以着重在这几个方面检查一下自己的 app:
- 首屏数据。首屏几个 tab 的数据往往在 app 启动时即加载,也就是在用户点“允许”之前。很容易造成用户第一次进入时,首屏数据空白。
- 推送。通常的处理逻辑是,把注册设备远程推送的代码写在 appDelegate 里。经过测试发现,这种写法下允许推送的弹框和允许使用网络的弹框出现的顺序没有一定。如果先出允许推送的弹框,用户点击允许,此时注册 deviceToken 是不能成功的。当然如果用户允许访问网络,第二次打开 app 时也会走一遍注册远程推送方法,此时就能注册成功了。
- 其他首次启动的处理。诸如广告页、活动页之类,需要在启动时请求的数据。新版本的更新检查往往也在启动时进行,但这一点影响不大,因为首次打开的用户一般都是处于最新版。另外,常常会在新设备首次启动时,上传一个设备唯一标识用于统计目的,例如 IDFA。
解决方案
在重置过的手机上,尝试装了一些大大小小的 app,发现不少 app 在适配这个新特性上都存在一些小问题。而有些 app 也做了比较有特色的处理。
不幸的是,苹果这个功能可能出得太仓促,并没有给开发者提供相应的 API。所以,我们没办法检测到用户点击“允许”或“不允许”网络请求的回调,也没法检测到当前用户是否授权的状态。只能通过一些特殊处理,来尽量减小对用户的影响。
总体来说,主要有如下几个解决方案:
- 延迟请求。对于首次启动的所有接口,如果能延迟到用户点击“允许”之后再请求,或者重新请求一次,就能把对用户的影响降到最低,是一个比较好的解决方案。因为首次启动往往有几屏引导页,一个比较好的时机是引导页结束时。此时用户已经进行了授权,数据都能正确得到。所以我自己的做法是把请求推迟到了引导页。另外下面评论里饶志臻大神提了一个特别好的思路,就是用 AFN 监听网络状态,有网时开始请求。虽然没有试过(我自己手机不是国行,不太好实验),但感觉应该也能比较完美地处理这个问题。
允许用户手动重新请求。出现数据空白时,如果在空白页面上有“重新加载”的按钮,也可以让用户体验好一些。比较有趣的是,测试中发现网易严选的处理是这样的:
网易严选的首屏界面加了一个“查看解决方案”的按钮。点击这个按钮会跳转到一个描述解决方案的页面,内容跟上面掘金的文章类似。很有意思的处理,虽然不能避免白屏,但用户会尝试重新打开,还可以帮到少部分始终不显示弹框的用户。
- 稍后重新请求。网络框架如果做了请求失败时,定时重新请求的处理,应该也能解决首次请求失败的问题。另外,首次启动时各种处理的逻辑都可以写成一旦失败,下次启动重试。如每次启动都会注册远程推送。另一个例子是上传设备唯一标识的逻辑,可以写成类似这样:
NSString *storedIDFA = [[NSUserDefaults standardUserDefaults] objectForKey:kIDFAKey];
NSString *idfaString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
if ([storedIDFA isEqualToString:idfaString]) {
return;
}
[HAMCommonBusinessStore requestUploadIDFA:idfaString success:^(id response) {
[[NSUserDefaults standardUserDefaults] saveObject:idfaString forKey:kIDFAKey];
}];
每次打开 app 都调用这段代码,而上传成功时才保存到本地。这样首次请求失败也无妨,下次打开时仍能重试上传,直到成功为止。
开发者的无奈
临时出现这种变故,作为开发者也表示很无奈。为了排查问题,技术同事牺牲手机反复重置,老板还一副不相信的样子:“那其他家 app 怎么就没出问题?”
好在总算能用各种特殊处理,把问题先掩盖过去。还是希望苹果能在 iOS 系统的新版本里完善这个新功能,提供类似相机权限的 api 吧。不要再折磨广大开发者了。
iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)的更多相关文章
- Flutter打包release版本安卓apk包真机安装无法请求网络的解决方法
今天flutter build apk打包了一个release.apk包,在真机上安装后网络数据都不显示,但是在模拟器上没问题,然后又连接真机开debug各种测试,一切都正常!那这会是什么问题呢? 查 ...
- iOS开发之企业发布无线安装APP
前提是注册成为企业开发者(¥299),申请到证书并安装到本地,可以正常使用Xcode在IOS移动设备上进行Debug. 首先build看是否报错.如无错 执行下一: 执行Product—Archive ...
- 【转】具透 | 你可能不知道,iOS 10 有一个中国「特供」的联网权限功能
9 月底,苹果正式在北京成立了苹果中国研发中心.近几年,我们也在每年更新的 iOS 系统中不断看到,苹果对中国市场的关照.从早前的九宫格输入法,到最近的骚扰电话拦截,都照顾了国内用户的需求. 在 iO ...
- iOS 10.0 更新点(开发者视角)
html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padding: 0 ...
- iOS 10.3下使用Fiddler抓取HTTPS请求
最近使用Fiddler抓取手机上的HTTPS请求时,遇到一个问题.设置完之后,访问HTTPS的页面,却得到一个错误 网络出错,轻触屏幕重新加载:-1202 (如下图所示) 我印象中,之前都好好的, ...
- ios 10 sticker pack application
看了WWDC2016直播,我们发现变得谨慎而开放的苹果在新一版四大平台系统中展示了很多变化,当然重中之重还是伟大的iOS.通过试用iOS10beta版,除了长大了的更强大的Siri主要感受到iMess ...
- 国行iphone第一次安装APP网络状况
国行手机第一次安装APP,会有请求网络权限的一个弹框出现,在这期间APP是没有任何网络连接的. 想必大部分APP的需求和这个逻辑有冲突. 先推荐一个链接:http://www.cocoachina.c ...
- iOS 10 UserNotification框架解析 – 本地通知
iOS 10以前的通知比较杂乱,把本地通知和远程通知分开了,诞生了许多功能类似的API,很容易让初学者犯迷糊.而iOS 10的通知把API做了统一,利用独立的UserNotifications.fra ...
- iOS 10 之 网络权限带来的坑
症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白,完全没数据.kill 掉重新打开就好了. 一开始以为是用户网络情况不好,但随着越来越多的用 ...
随机推荐
- 【JavaScript】又一神器框架:linq.js
引言 前几天针对一个js数组交集的问题请教了下同事,他第一反应就是循环,这也是常规思路,因为我个人更倾向于js些,我便开玩笑,不知道js能不能像linq那样实现这些操作呢?果断百度了一把,果然有现成框 ...
- 【原创】新手入门一篇就够:从零开发移动端IM
一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...
- Objective-C快速上手
最近在开发iOS程序,这篇博文的内容是刚学习Objective-C时做的笔记,力图达到用最短的时间了解OC并使用OC.Objective-C是OS X 和 iOS平台上面的主要编程语言,它是C语言的超 ...
- [System] CentOS虚拟机系统克隆后的网络配置
VMware Workstation 虚拟机在进行克隆 CentOS 系统之后,在克隆机上配置网卡时,会出现一些细节问题,讨论一二. 一.情景描述 克隆机上默认由 NetworkManager 服务管 ...
- 初入网络系列笔记(2)TCP和UDP
一.借鉴说明,本博文借鉴以下博文 1.BlueTzar,TCP/IP四层模型, http://www.cnblogs.com/BlueTzar/articles/811160.html 2.叶剑峰,漫 ...
- C# foreach 中获取索引index的方法
方法一: int i = 0; foreach (var item in arr) { i++; } 方法二: foreach (var item in arr) { int index = arr. ...
- WinServer远程部署系统打包批处理文件
前言 工作中一直在使用一个部署系统WinServer远程部署系统(RDSystem),部署.回滚都很方便.我们一直都是增量发布或者只更新需要更新的文件,每次发布完之后要整理出一个增量更新包,压缩成zi ...
- golang中如何使用http,socket5代理
Golang Http use socket5 proxy 因为最近想爬取一些网站上的视频,无奈网站在墙外,只能通过代理进行爬取,因此在网上搜索关于golang使用代理的方法. 功夫不负有心人,最后我 ...
- GJM : 中断被Socket.Accept阻塞的线程
原帖地址:http://blog.csdn.net/kingfox/article/details/7233350 原文作者:狐帝 刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦.监听代码 ...
- MongoDB学习笔记—权限管理
1.MongoDB权限介绍 a 上篇文章中,我们在Linux下配置了MongoDB环境并且将其设置为服务随机器启动而启动,那么接下来这篇文章我们就来简单说一下MongoDB下对登录用户权限的管理. b ...