2016-09-30 44 views
10

因此,我們正在創建一個iOS應用程序,只需按一下按鈕即可打開設備的設置應用程序。我已經看到該方法在iOS 10和Swift 3中略有改變,所以我使用條件來檢查用戶在執行代碼之前所在的iOS版本。iOS 10打開設置崩潰

if let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) { 

    if #available(iOS 10.0, *) { 

     // iOS 10.0. 

     UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil) 

    } else { 

     // Fallback on earlier versions. 

     UIApplication.shared.openURL(settingsUrl) 
    } 
} 

這在iOS 9設備上可以很好地工作,但不適用於iOS 10。問題是,雖然應用程序將用戶發送到iOS 10中的設置應用程序,但它會立即崩潰而不會出現崩潰日誌。如果我使用相同的方法打開像Google這樣的網站,它在iOS 9和10上都可以很好地工作。我做了大量的研究,看起來他們已經通過URL方案更改了一些內容,但找不到任何內容修復/解決方法。

+0

我已經獨立測試的應用程序在設備上不運行Xcode時,如果這就是你的意思?我仍然得到同樣的行爲。 – BenSDConway

+0

這是一個自定義的鍵盤擴展,所以在容器應用程序中,我們只是簡單地顯示一個按鈕,點擊後直接將它們發送到設置應用程序,而不必自己在那裏導航。它在用戶有機會在設置應用程序中執行任何操作之前崩潰。這主要是一種用戶體驗,但我們相信非常重要。 – BenSDConway

+0

如果您的應用程序仍支持iOS 9,爲什麼不使用較舊的'openURL'方法而不考慮iOS版本?這是完全有效和安全的。 – rmaddy

回答

6

我找到了一種方法通過將設置捆綁到我的項目,並使用此代碼來打開iOS設置應用程序:

let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString) as! URL 
    UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil) 

看起來這是你可以爲了打開使用的唯一途徑本機設置應用程序,如果您的應用程序沒有自定義鍵盤。

+0

這與任何鍵盤設置無關。此代碼段不會阻止iOS 10中的設置應用崩潰。無論模擬器或實際設備如何,設置都會在從任何應用打開時崩潰。我用一個按鈕創建了一個新項目,只是爲了打開設置。並從應用程序中打開導致iOS 10崩潰的設置。僅供參考,相關的線程:http://stackoverflow.com/questions/39659720/open-phone-settings-when-button-is-clicked-in-my- APP-IOS-10迅速-3-問題,您能不能給點「蘋果文檔」 – Mesbah

5

Apple沒有正式記錄自定義URL方案。它不再適用於iOS 10。該應用程序僅允許用戶使用您的應用程序擁有設置頁面。 如果在iOS 10中沒有設置頁面,則您的應用程序會崩潰。

您可以嘗試按如下方式通過「灰色區域」API打開設置頁面。但我沒有在Swift中取得成功。祝你好運!

The "prefs" URL Scheme not woring in iOS 10 (Beta 1 & 2)

+0

你是指什麼? – Mesbah

+0

對不起,我的錯。我想說我沒有在他們的文檔中找到自定義URL方案。 – User9527

0

你的代碼是正確的,不用擔心。這只是因爲,在您的應用程序設置中沒有任何內容(例如,相機訪問權限或照片訪問權限等任何類型的權限)。所有你需要做的是在重定向到你的應用程序設置頁面之前詢問任何類型的許可,然後它將完美工作。

注:您的應用沒有得到墜毀,它只是將背景因爲沒有什麼顯示(您的應用設置中只包含您的許可和訪問信息。)