問題
iOS用戶更新至iOS 11之后,widget展開/折疊按鈕的點擊率明顯增大,加上用戶的反饋,發現在iOS 10上正常顯示的widget在iOS 11上會出現展開/折疊狀態錯亂的情況
如下圖所示
p1.png
p2.png
京東也存在類似問題
p3.png
p4.png
查找問題
- 經過試驗,當我們在對widget界面調試的時候,在viewDidLoad、viewWillAppear等生命周期內的斷點并不會阻塞widget界面的滑動,說明這可能并未在主線程進行操作,這即違背了刷新UI要在主線程的規律
- 之前widgetLargestAvailableDisplayMode的設置是在viewWillAppear里執行的,這有可能會改變在viewDidLoad內經過計算數據已設置完成的view展示狀態,導致出現問題
解決方法
- 在涉及更新UI狀態的時候,確保回到主線程進行刷新
p5.png
- 對于widgetLargestAvailableDisplayMode的狀態移到viewDidLoad執行
類似這樣:
- (void)viewDidLoad{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
//
if([[UIDevice currentDevice].systemVersion floatValue] >= 10){
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
}
}
總結
這次修復bug,除了解決方法以外,感覺有些東西不能盲目的去網上copy,對于設置widget狀態,網上幾乎所有demo都是寫在viewWillAppear里,其實每次打開widget界面都會執行viewDidLoad方法,寫在viewWillAppear里甚至有可能會強制又改變了設置好的frame,導致出現問題。