【每日一问】iOS 开发中,如果使用 CocoaPods 进行组件化,组件中如何配置 subSpecs?
比如 Vendor 组件通过 CocoaPods 集成神策 iOS SDK,主 App 通过 CocoaPods 集成 Vendor 组件。 如何配置神策 iOS SDK 中 DISABLE_UIWEBVIEW、DISABLE_TRACK_GPS 这两个 subSpecs?
比如 Vendor 组件通过 CocoaPods 集成神策 iOS SDK,主 App 通过 CocoaPods 集成 Vendor 组件。 如何配置神策 iOS SDK 中 DISABLE_UIWEBVIEW、DISABLE_TRACK_GPS 这两个 subSpecs?
程序编译成功后,会在每一个 Module 的 build/generated/sources/buildConfig/debug(或 release)/包名 文件夹下生成一个 BuildConfig 类,应用代码通过这个类可以获取跟 Gradle 构建有关的信息。例如通过 BuildConfig.DEBUG 就可以判断当前是否处于 debug 模式,来控制日志输出。并且官方提供了 buildConfigField() 方法,将自定义字段添加到 Gradle 构建配置文件的 BuildConfig 类中,神策 Android SDK 中正是采用这种方式去配置 SDK 版本号。
通过 getResources().getConfiguration().orientation 可以获取到当前的屏幕方向,有两种取值 ORIENTATION_LANDSCAPE 和 ORIENTATION_PORTRAIT。这样我们通过对比就可以判断出当前的方向:
一般情况下,当我们做了一个 SDK 提供给其他开发者使用的时候,总是会预留一个初始化接口,然后要求使用者去调用它以让 SDK 生效。这种模式会导致用户的业务里堆满了各种各样的 XXX.init(),并且如果用户忘记调用我们的初始化方法也会导致 SDK 失效。无侵入的完成 SDK 初始化意味着不需要开发者调用任何代码,只需要集成依赖,SDK 就可以自动进行初始化并生效。
Fragment 与 Activity 相似,有自己的生命周期、布局。常作为 Activity 的组成部分。Fragment 在 App 开发中十分常用,例如,很多应用页面中会有多个 Tab 页对应不同的 Fragment ,还有很多 App 采用单页面实现,即只有一个 Activity ,所有的页面使用 Fragment 来实现 。不同的 Fragment 可能会复用相同的布局或包含相同的元素内容,这些元素的点击事件如果采集不到 Fragment 的页面名称和标题,就很难区分点击事件是在哪个页面中触发的,导致全埋点点击事件很难发挥它最大价值,所以在 Fragment 内的 App 点击事件需要采集 Fragment 的页面名称和标题。
在回答页面浏览事件之前,我们先介绍 UIViewController 生命周期相关的内容,然后再介绍 iOS 的“黑魔法” Method Swizzling。
在分析如何采集启动和退出事件之前,我们先简单介绍一下 iOS 应用程序状态相关的内容。大家都知道,对于一个标准的 iOS 应用程序来说,在不同的时期会有不同的状态,如下图所示。
对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区。私有区类似于沙盒,只有本程序存储的数据可以访问。如果要想做到两个 App 间共享数据则需要数据放在公共区。想要数据放到公有区则首先要配置公有区的名称,即 ”Keychain Groups”。
在 Android 系统中,Fragment 页面浏览其实就是指切换不同的 Fragment 。Fragment 本身是没有生命周期的监听的,后期在 Android Support 25.1.0 和 AndroidX 中的 FragmentManager 增加了 FragmentLifecycleCallbacks 用来监听 Fragment 的生命周期,如果不依赖于 Support 库和 AndroidX 库,就无法使用 FragmentLifecycleCallbacks 来监听 Fragment 的生命周期。
神策的服务端 SDK 是通过 Consumer 去构建适用不同场景的 SensorsAnalytics 实例,一般来说会有三种 Consumer:DebugConsumer、BatchConsumer、FileConsumer(在不同代码实现里实际的类名和这里不一致)。