为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
问题三:'sharedApplication' is unavaliable:not available on iOS(App Extension),这是在extension target使用了pod的状况下会遇到的问题。spa
答:缘由在于Extension不能调用sharedApplication,事实上Extension不能访问的API还有其余的,能够查看苹果官方文档 App Extension Programming Guide
3d
可是,不少不少第三方库都会调用到[UIApplication sharedApplication],怎么解决呢?看下图:
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复制代码