2016-07-23 48 views
6

有沒有什麼辦法可以基於運行時版本的iOS版本有條件地導入Swift中的框架?有條件地在Swift中導入基於iOS版本的框架(如Speech)?

特別是,我有一個部署目標爲iOS 8的應用程序。如果它在運行時可用,我想在應用程序中使用新的Apple Speech框架。我知道代碼段的#available(iOS 10, *)指令以及可用於整個類的@available(iOS 10, *)指令。所以我可以輕鬆地避免執行任何使用Speech框架的代碼。但是在包含使用Speech的類的文件中,我需要「import Speech」語句,並且這兩個指令都不能在那裏使用。我發現,即使我有我的整個班級的@available(iOS 10, *)指令,當我在iOS 9設備上運行我的應用程序是在推出殺害與

"dyld: Library not loaded: /System/Library/Frameworks/Speech.framework/Speech". 

我缺少的東西,或僅僅是有可能在部署目標爲10的應用程序中使用語音框架?

回答

4

可以使框架可選(從Ray Wenderlicht細節和圖像):

Making a framework optional

這與您使用的@available相結合,應防止系統試圖加載它的設備,其中上它不可用。

+0

這不起作用,至少在這種情況下。有趣的是,在Apple的示例SpeakToMe項目中,Speech Framework甚至沒有鏈接到項目中,但它仍然可以在設備上正常生成並運行。同樣,在我的項目中,在iOS 10上,它沒有鏈接語音框架。如果我繼續添加框架並使其成爲可選項,它仍然可以在iOS 10上構建並運行,但是我在iOS 9上遇到了相同的崩潰。 –

+0

@MattF_PI好奇。您需要覆蓋@ available的每個框架使用。嘗試註釋包含在每個包含引起編譯錯誤,以便您可以檢查它們 - 只有一個參數使用沒有@可用仍然會觸發系統嘗試加載「可選」框架。如果沒有,對不起,這應該起作用。 –

+0

對不起我的錯誤 - 我剛剛意識到我已經將該框架添加到項目中的錯誤目標(我們有很多目標)。因此,明確地將Speech框架添加到正確的目標,然後使其可選(與@available和#available結合以避免代碼),確實允許代碼在iOS 9和iOS 10上運行。 –