iOS开发日常踩坑--UIWindow

1.坑从何处来?

       很多APP都有截屏分享的功能,在某个详情页按下截屏键,将当前页面绘制成UIImage,再贴上一个二维码。通过微信/微博/QQ之类的渠道分享出去。很常见,对吧?

       但是有用户反映二维码尺寸太小,URL太长以至于生成的二维码太密集,导致识别率不高。于是产品狗提出了解决方案:1.二维码尺寸放大。2.将原本的URL压缩成短链接。

       放大二维码so easy,这里就略过了。而第二步压缩长链接需要走后台的接口。于是乎新的截屏分享流程如下:

       1.出发截屏操作

       2.将现有的长链接通过后台接口变换成短链接

       3.成功返回短链接则用短链接生成二维码

       4.返回短链接失败则继续用原来的长链接生成二维码(此处有坑!)

       这个流程看起来没什么毛病,但是没过多久就有人反馈了bug。。。


2.问题重现

昨天下午被叫过去,看到了如下一张图,

what the f**k ?

看到此图,我一脸懵逼,这特么是个啥,为了方便说明,正常情况应该是类似于这样


我是正常图

       这种截图分享的方式相信大家实现的方法大同小异,截取当前屏幕的内容生成UIImage,然后放到一个UIImageView里,然后根据URL生成二维码,再add到这个UIImageView上,最后绘制为一个有二维码的UIImage。新建一个UIWindow来展示这个弹出的浮层。基本就和上面一样了。

       我最无法理解的是,明明截屏的内容和二维码是在一张图上,为啥后面截屏的内容没了,就剩个码,而且下面分享button也不见了。。。询问发现bug的人,只说了截屏发微信乱点点再切回来就成这样了,而且还卡死了,只能杀掉APP。终于在昨天深夜,有大佬找到了稳定复现的方法:打开飞行模式,进入详情页,在内容没有加载好的时候立刻截屏退到后台,过一会再回到前台就这样了。

       有了稳定复现的方法,就可以开始debug了!

3.定位原因

       我按照步骤开始重现问题,关键点就在于网络请求超时后,依然继续走了后续的流程,导致APP还在后台的时候,弹出了新的window。我就重点跟踪了这个window的创建过程!

+ (UIWindow *)sharedWindow{    

        static UIWindow *sharedWindow = nil;    

        static dispatch_once_t onceToken;    

        dispatch_once(&onceToken, ^{        

                sharedWindow = [[UIWindow alloc] initWithFrame:[[[UIApplication sharedApplication] keyWindow] bounds]];    

        });    

        return sharedWindow;

}


keyWindow呢?

       重点在于keywindow上,因为此时APP在后台,po出来可以看到keywindow是nil,所以[[[UIApplication sharedApplication] keyWindow] bounds]取出来的frame是{0,0,0,0}。所以新弹出的window才不能响应任何手势,显得APP像是卡死了一样。

       于是我就想,那我换一种取frame的方式:[UIScreen mainScreen].bounds,这会怎么样呢?这次得到了下面的样子:


起码有点正常了

       因为获取到了正常的frame,弹出的window看起来稍微有点正常了,黑屏不是就是因为APP在后台,所以获取不到任何屏幕上的信息,绘制出来自然就是一团黑,这是在预料之内的。而且此时新弹出的window也能正常响应手势了。点击空白了新弹出的window消失了,但此时有了另一个问题,APP的主window不见了,所以又卡死了。。当然主window消失就是另一个问题了,这里就不展开说了。

4.总结

       发现了问题所在,解决起来也就有很多方法了。

       回想一下造成这个bug的根本原因就是[[UIApplication sharedApplication] keyWindow]是nil,所以截屏获取不到内容,弹出的window的frame为0。

       APP在后台获取不到keyWindow!

       APP在后台获取不到keyWindow!

       APP在后台获取不到keyWindow!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容