? ? 為APP添加的Extension的方法很簡單,在工程下new一個(gè)target,選擇相應(yīng)功能的Extension即可。Xcode會(huì)為我們自動(dòng)創(chuàng)建好入口文件,我們只要在相應(yīng)函數(shù)里填上響應(yīng)代碼就可以了。
如下圖:
這里討論使用cocoapods的工程使用Extension會(huì)遇到的三個(gè)問題。
問題一:如何為Extension這個(gè)target添加pod?
答:就把這個(gè)target當(dāng)成普通的target一樣,在每個(gè)target里寫指定的pod。不需要就直接省略。
target 'testExtension' do
pod 'ReactiveCocoa','2.4.7''
end
target 'NotificationService' do
pod 'SDWebImage'
end
問題二:為什么明明沒有為Extension那個(gè)target添加pod,編譯卻報(bào)錯(cuò)說缺少其他target指定的lib?(如下圖,是我在實(shí)際項(xiàng)目中run extension target時(shí)的報(bào)錯(cuò),而我并沒有為此target指定過這個(gè)pod,這是其他target下指定的一個(gè)pod)
答:經(jīng)過一番排查,我發(fā)現(xiàn)因?yàn)槲覀兊捻?xiàng)目是這樣的,一個(gè)project下有多個(gè)target app,每一個(gè)都調(diào)用相同文件,只有info.plist會(huì)有些參數(shù)差別,所以每個(gè)target需要的pod也都是一樣的。為此,我們寫了個(gè)project的xcconfig文件,在里面引入了主工程的pod config文件并指定了一些參數(shù),以便讓同一個(gè)project下的所有target都使用同一批pod,這樣一來就影響到了extension那個(gè)target。
下圖里可以看到project和target的配置文件從屬關(guān)系。project xcconfig指定了pod配置,會(huì)影響它下面的所有target,而pod file里我們沒有給NotificationService這個(gè)target寫上配置里的那些pod,那就會(huì)出現(xiàn)上面的報(bào)錯(cuò)。
如果你也遇到類似的問題,可以看下project下的類似“公用配置”,基本就能解決了~
問題三:'sharedApplication' is unavaliable:not available on iOS(App Extension),這是在extension target使用了pod的情況下會(huì)遇到的問題。
答:原因在于Extension不能調(diào)用sharedApplication,事實(shí)上Extension不能訪問的API還有其他的,可以查看蘋果官方文檔App Extension Programming Guide
文檔里說了,NS_EXTENSION_UNAVAILABEL這個(gè)宏標(biāo)記的接口都無法在Extension里調(diào)用。
但是,很多很多第三方庫都會(huì)調(diào)用到[UIApplication sharedApplication],怎么解決呢?看下圖:
pods工程下的所有targets的Require Only AppExtension-Safe API參數(shù)默認(rèn)是YES,我們需要把它設(shè)置為NO,但是不要手動(dòng)去改哦,不是會(huì)累死你,而是因?yàn)槊看螆?zhí)行一次pod install,這參數(shù)還是會(huì)變回默認(rèn)值的,真正的解決方案是:在podfile文件里設(shè)置該參數(shù)。
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