為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複製程式碼