CocoaPods工程使用插件App Extension

爲APP添加的Extension的方法很簡單,在工程下new一個target,選擇相應功能的Extension便可。Xcode會爲咱們自動建立好入口文件,咱們只要在相應函數裏填上響應代碼就能夠了。html

以下圖:bash

這裏討論使用cocoapods的工程使用Extension會遇到的三個問題。app

問題一:如何爲Extension這個target添加pod?iphone

答:就把這個target當成普通的target同樣,在每一個target裏寫指定的pod。不須要就直接省略。ide

target 'testExtension' do

    pod 'ReactiveCocoa','2.4.7'' end target 'NotificationService' do pod 'SDWebImage' end複製代碼

問題二:爲何明明沒有爲Extension那個target添加pod,編譯卻報錯說缺乏其餘target指定的lib?(以下圖,是我在實際項目中run extension target時的報錯,而我並無爲此target指定過這個pod,這是其餘target下指定的一個pod)函數

答:通過一番排查,我發現由於咱們的項目是這樣的,一個project下有多個target app,每個都調用相同文件,只有info.plist會有些參數差異,因此每一個target須要的pod也都是同樣的。爲此,咱們寫了個project的xcconfig文件,在裏面引入了主工程的pod config文件並指定了一些參數,以便讓同一個project下的全部target都使用同一批pod,這樣一來就影響到了extension那個target。post

下圖裏能夠看到project和target的配置文件從屬關係。project xcconfig指定了pod配置,會影響它下面的全部target,而pod file裏咱們沒有給NotificationService這個target寫上配置裏的那些pod,那就會出現上面的報錯。ui


若是你也遇到相似的問題,能夠看下project下的相似「公用配置」,基本就能解決了~

問題三:'sharedApplication' is unavaliable:not available on iOS(App Extension),這是在extension target使用了pod的狀況下會遇到的問題。spa

答:緣由在於Extension不能調用sharedApplication,事實上Extension不能訪問的API還有其餘的,能夠查看蘋果官方文檔 App Extension Programming Guide
3d


文檔裏說了,NS_EXTENSION_UNAVAILABEL這個宏標記的接口都沒法在Extension裏調用。

可是,不少不少第三方庫都會調用到[UIApplication sharedApplication],怎麼解決呢?看下圖:


pods工程下的全部targets的Require Only AppExtension-Safe API參數默認是YES,咱們須要把它設置爲NO,可是不要手動去改哦,不是會累死你,而是由於每次執行一次pod install,這參數仍是會變回默認值的,真正的解決方案是:在podfile文件裏設置該參數。

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '8.0'
            config.build_settings['SDKROOT'] = 'iphoneos10.3'
            config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
        end
    end
end複製代碼
相關文章
相關標籤/搜索