2016-07-15 91 views
0

我的應用程序的某些iOS用戶(其中​​一個iPhone 6和iOS 9.3.2)報告說,在強制退出應用程序時,他們將看到只有Apple徽標和重新啓動欄,並且他們的設備將重新啓動。我自己的設備不會重現這一點,我也沒有收到任何崩潰報告,所以我一直無法跟蹤這個問題。用戶的印象是他們的手機或應用程序崩潰。iOS:蘋果標誌+強制退出後重新啓動屏幕

步驟來重現

  1. 打開應用
  2. 按下iPhone上的Home按鈕,然後讓應用程序進入後臺約20分鐘。
  3. 重新開啓應用程式
  4. 輕按兩下home鍵和刷卡強制退出應用程序
  5. 某些用戶報告看到一個黑色的屏幕只有蘋果標誌,在這一點上重啓吧。

我確實有應用程序上運行的後臺位置更新以及後臺進程。當應用程序重新進入前臺時,我已嘗試結束此後臺任務,但這並不妨礙已經看到此效果的用戶出現「蘋果徽標」屏幕。

+0

我認爲這是iOS的一個bug。 – Lumialxk

+0

他們使用的是iOS 10嗎? –

+0

至少有一個用戶在iOS 9上。我認爲這也是iOS的一個bug。但是如果我能找到觸發錯誤的東西,也許我可以避免這種情況,即使我自己沒有造成這種情況。 –

回答

0

雖然沒有堆棧跟蹤,所以很難確定,但最終成爲我的問題。我正在記錄它,以防其他人遇到類似情況。

正如前面提到的,我正在創建後臺進程。這是我用他們:

老辦法:

我宣佈這個在我的位置管理器的頂部:

private var bgId: UIBackgroundTaskIdentifier!

然後,裏面locationManager(_:didUpdateLocations:),我包括這些行:

self.bgId = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { _ in 
    UIApplication.sharedApplication().endBackgroundTask(self.bgId) 
} 

這是爲了保持應用程序活着在後臺lon我認爲,因爲我在使用bgId的單個參考,後臺任務將被覆蓋,並且只有一個會存在,無論位置更新有多頻繁。

新方法:

首先,我做了bgId可選:

private var bgId: UIBackgroundTaskIdentifier?

然後,我取代了早期的代碼片段在locationManager(_:didUpdateLocations:)本:

if self.bgId == nil { 
    self.bgId = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { _ in 
    if let bgId = self.bgId { 
     UIApplication.sharedApplication().endBackgroundTask(bgId) 
     self.bgId = nil 
    } 
    } 
} 

這可能是iOS實際上創造了大量的後臺進程,並沒有像我原先想象的那樣覆蓋它們。如果屬實,這種方法創建的流程就少得多。

進行此更改後,我不再看到蘋果徽標和重新啓動欄的「respring」效果,並且在執行過程中遇到了問題。