CocoaPods集成Facebook SDK报错:sharedApplication在iOS扩展不可用
问题原因与解决方案
为什么会出现这个报错?
这个问题的核心原因很明确:
- 你的项目里包含了OneSignalNotificationServiceExtension这个App Extension,而iOS对App Extension有严格的沙盒限制——Extension是运行在独立进程中的,没有完整的主App生命周期,因此绝对不能调用
UIApplication.sharedApplication这类属于主App的API。 - 报错指向的FBSDKCoreKit代码里正好用到了
[UIApplication sharedApplication],而这段代码被错误地纳入了Extension target的编译流程,触发了iOS的限制检查,所以才会报这个错误。
具体解决办法
我给你几个可行的方案,按优先级从高到低推荐:
方案1:给Extension添加Facebook适配宏(最直接)
Facebook SDK本身已经考虑到了App Extension的适配,只要添加一个预编译宏,就能让SDK自动跳过那些不兼容的API调用:
- 打开Xcode,选中你的项目文件,在左侧Targets列表里找到
OneSignalNotificationServiceExtension - 切换到Build Settings标签,在搜索框输入
Preprocessor Macros - 在Debug和Release两个配置项里,都添加
FB_APP_EXTENSION=1这个宏 - 按下
Cmd+Shift+K清理项目,然后重新编译试试
方案2:调整Podfile,确保Facebook SDK只在主App target加载
有时候CocoaPods可能会因为依赖传递,把主App的pods间接引入到Extension里,你可以修改Podfile明确隔离:
# Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'testapp' do use_frameworks! # 主App专属的Pods pod 'FLAnimatedImage', '~> 1.0' pod 'SDWebImage', '~> 4.0' pod 'FacebookLogin' pod 'FacebookShare' pod 'FacebookCore' pod 'OneSignal', '>= 2.5.2', '< 3.0' target 'testappTests' do inherit! :search_paths end target 'testappUITests' do inherit! :search_paths end end # 单独配置Extension的Pods,只引入需要的OneSignal target 'OneSignalNotificationServiceExtension' do use_frameworks! pod 'OneSignal', '>= 2.5.2', '< 3.0' end
修改后执行以下命令,再重新编译:
pod deintegrate pod install
方案3:检查是否误引入了Facebook代码到Extension
偶尔可能是手动操作导致的:
- 检查Extension的Build Phases > Compile Sources里,有没有FBSDK相关的文件,如果有就移除
- 检查Extension的代码里,有没有
import <FBSDKCoreKit/FBSDKCoreKit.h>这类不必要的导入语句,有的话删掉
内容的提问来源于stack exchange,提问作者MattBlack
相关产品推荐
相关产品推荐

