iOS WidgetUI开发遇到的问题点
CocoaPods 多target配置共享
(推荐)方式1
#targetA: [AFNetworking,Masonry]
#targetB:[AFNetworking,SDWebImage]
abstract_target 'abstract_pod' do #这里的abstract_pod在实际targets中不存在,是虚拟
pod 'AFNetworking'
target 'targetA' do
pod 'Masonry'
end
target 'targetB' do
pod 'SDWebImage'
end
end
方式2 提取公共pods 各个target引入
platform :ios, '10.0'
#source 'https://github.com/CocoaPods/Specs.git'
source 'https://cdn.cocoapods.org/'
inhibit_all_warnings!
#多个target的pod引入,方式二:如每个pod都引入masonry
def commonPods
pod 'Moya', '~> 13.0'
end
#工程一:
target '工程名' do
commonPods
pod 'AFNetworking'
target '工程Tests' do
inherit! :search_paths
pod 'Specta', '~> 1.0.7'
pod 'OCMock', '~> 3.4.2'
pod 'Expecta', '~> 1.0.6'
end
target '工程UITests' do
inherit! :search_paths
# Pods for testing
end
target '小组件WidgetExtension' do
commonPods
end
end
#工程二:
target 'App' do
commonPods
end
注意:
这里的小组件WidgetExtension
是如下图的名称:
执行pod install
之后,可能会遇到如下错误:
'sharedApplication' is unavaliable:not available on iOS(App Extension)
问题:‘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.shared
如图:
默认的Require Only AppExtension-Safe 都为Yes,需要改为No;完事了吗?不是,对于一个工程有十个二十个的库用到UIApplication.shared
的时候,难道每个都要去改动吗?
好吧,这不失为一种操作方式,但是问题来了。pod install
之后所有的库都会恢复成默认状态也就是 Require Only AppExtension-Safe
都为Yes
。
解决方案
Podfile
中添加如下代码
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
end
end
end