Xcode同一个项目多个target相互依赖的配置方法

e.g. we have 2 targets:

  1. framework: MOJiAppStorePay
  2. debug: DebugMOJiAppStore

if we want to use MOJiAppStorePay in DebugMOJiAppStore, we should config it as follows:

  1. open DebugMOJiAppStore’s settings
  2. under build settings, add MOJiAppStorePay as DebugMOJiAppStore’s dependency
  3. under build settings, unfold Link Binary With Libraries, add MOJiAppStorePay and drag it after its own dependencies (MOJiBase.xc here)

MOJi辞書进入后台很快被系统杀死的原因排查

应用场景:启动APP,然后切换至后台,30秒~n分钟后,再次打开APP,直接重新启动。

排查过程主要经历如下几点:

1、iOS系统(因iOS 13被曝出会导致APP频繁重启)
查看其他项目是否跟MOJi辞書一样容易被kill掉,于是创建了一个简单项目,根据应用场景,APP仍然处于开启状态,说明该情况不是系统导致的。

2、Xcode开发工具(因Xcode近期更新频繁,而我目前使用的也不是最新版,可能修复了什么bug)
直接把Xcode升级到最新,根据应用场景,APP还是会被kill掉,同时我也继续复测了第一点,说明不是Xcode和iOS系统导致。

3、applicationDidEnterBackground与applicationWillEnterForeground
根据应用场景,发现操作都是在进入后台或者是进入前台相关,然后查看AppDelegate文件中这两个API的内部实现,没太特别的操作,暂时先注掉这两个API,继续应用场景,但APP还是被kill掉。

4、iVersion与iRate
怀疑是他们不再维护的原因,导致部分实现引起程序被kill掉。在Podfile文件中,注掉了这两个框架的引用,重新在终端pod install(删掉这两个框架)。然后重新编译运行,根据应用场景,APP依然是被kill掉,即不是这个原因。

5、Instruments
使用苹果自带的测试工具,查看了多个template,后面发现这个File Activity(可以观察APP前后台对I/O的操作)
使用步骤如下:

a、打开Instruments。

b、选择 File Activity template。

c、点击Choose,进入界面,左上角中选择设备以及对应的应用程序。

d、点击左上角红色圆圈按钮开始运行,界面状态更新如下图所示:

e、这时候,File Activity已经开始记录操作了。由于我们要测试APP在后台做了什么事情,所以让APP进入后台。大概30秒(时间可以为30秒~n分钟)后,关闭分析工具,他开始自动分析并收集之前对APP的各种操作,如图所示:

f、分析完毕后,就会生产一个类似报告的界面,选中MOJiDict.app这一栏查看具体情况,如图所示:

通过Instruments工具中的File Activity模板可以发现,APP后台的时候,Google文件夹里的文件不断的被写入操作(当然Realm也有I/O操作,但是他操作完之后就结束了)。

猜想一:是否是因为APP在后台时的I/O操作过于频繁,系统监测到并直接kill掉?(iOS 13后对性能的要求越来越高,如资源占用,耗电等)

猜想二:是否把这一频繁的操作移除,APP就不会有这个问题?

通过猜想,第一时间就想到了Firebase(Google旗下的产品),于是决定把关于Firebase相关的内容移除看看。这个框架主要是用于APP的统计分析。接着我做了几个尝试:

a、注释掉[FIRApp configure]这个初始化方法;
注掉后编译运行,发现APP还是会被kill掉。这时候我想是不是还有其他地方也用到了Firebase的东西?突然又想到,他是可以监听APP进入后台然后做各种操作的。于是通过全局搜索,搜索DidEnterBackground或者WillEnterForeground等方法,果然发现了


b、由于里面的文件没法改,只能把#import<Firebase/Firebase.h>引用注掉;
重新编译运行,根据应用场景操作APP,发现还是会被kill掉,这时候开始有点蒙了。

c、紧接着再把GoogleService-Info.plist文件也删掉;
再次编译运行,APP还是会被kill掉。

这时候,已经把Firebase相关的文件或者引用都去掉了啊。怎么APP还是被kill掉?

难道是Xcode的bug?记录了缓存?又重启Xcode,不行!!!

重启电脑,还是不行!!!

难道想的方向不对???突然间想到,还有一处地方没有移除—–Cocoapods

最后抱着试一试的态度,决定把Pods下的Firebase相关框架移除。在Podfile文件中,注掉对应的框架,如#pod ‘Firebase/Analytics’,重新在终端输入pod install。然后重新对APP编译运行。

奇迹~~~~出现了!!!
彻底移除Firebase框架APP根据应用场景再操作一波,APP再也没有被kill掉。

总结:
1、目前需要把Firebase框架彻底移除,才能保证APP在进入后台的时候不被系统杀死。
2、可能是新版Firebase框架里面加了一些特殊操作,而这些操作我们无法控制。

3、可能需要使用其他第三方分析平台。

补充:
最后采用Firebase 6.4.0(经boss发现,此版本不会被kill),即在新版本还没有解决该问题之前,暂时还是使用该版本。