CocoaPods工程使用外掛App Extension

大力居士又叫小丸子發表於2019-03-04

為APP新增的Extension的方法很簡單,在工程下new一個target,選擇相應功能的Extension即可。Xcode會為我們自動建立好入口檔案,我們只要在相應函式裡填上響應程式碼就可以了。

如下圖:

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

問題一:如何為Extension這個target新增pod?

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

    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。

下圖裡可以看到project和target的配置檔案從屬關係。project xcconfig指定了pod配置,會影響它下面的所有target,而pod file裡我們沒有給NotificationService這個target寫上配置裡的那些pod,那就會出現上面的報錯。

如果你也遇到類似的問題,可以看下project下的類似“公用配置”,基本就能解決了~

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

答:原因在於Extension不能呼叫sharedApplication,事實上Extension不能訪問的API還有其他的,可以檢視蘋果官方文件 App Extension Programming Guide

文件裡說了,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複製程式碼

相關文章