问询:普通App启动与WatchKit sendMessage唤醒iPhone App的差异
Watch Connectivity 后台唤醒与普通前台启动的差异及疑问解答
已列出疑问解答
- 关于
didFinishLaunchingWithOptions的launchOptions为nil的问题:这一现象符合苹果官方设计,不存在文档冲突。WCSession触发的后台唤醒不会在启动参数中携带特殊标识,系统会在App启动完成后优先调用WCSession的对应delegate方法,启动参数仅对推送、地理位置、URL Scheme等常规唤醒场景返回对应标识。 - 关于
[UIScreen mainScreen]及主窗口创建逻辑无差异的问题:后台唤醒时UIKit基础栈会完整初始化,UIScreen.main是全局单例属性,和进程是否前台运行无关,主窗口的初始化逻辑也会正常执行,只是该窗口不会被渲染到屏幕上,用户无感知,相关属性和前台启动时完全一致。 - 关于后台唤醒的运行限制:这类后台进程的最高运行时长为10秒,到期后系统会强制杀死进程,且无法通过申请后台任务延长执行时间;同时进程的内存回收优先级远高于前台进程,系统内存不足时会优先终止该类进程,内存占用上限也比前台运行时低约30%。
- 关于XCode调试该类进程的方法:可以实现自动附着调试器。操作路径为:打开XCode顶部菜单
Product > Scheme > Edit Scheme,选择Run标签下的Info页,将Launch选项修改为Wait for the executable to be launched,启动调试后触发Watch端的sendMessage唤醒App,XCode会自动附着调试器,断点、日志输出都可正常使用。 - 关于React Native应用JS层未运行的问题:RN官方默认的初始化逻辑中,JS bundle加载、JS runtime初始化的触发条件是
UIApplicationDidBecomeActiveNotification通知,后台唤醒的App全程处于UIApplicationStateBackground状态,不会触发该通知,因此JS层不会启动。如需后台唤醒时执行JS逻辑,可将JS初始化逻辑提前到didFinishLaunchingWithOptions阶段执行。
其他核心差异补充
- 进程状态:前台启动的App会进入
UIApplicationStateActive状态,后台唤醒的App全程处于UIApplicationStateBackground状态,不会触发任何和前台活跃相关的通知。 - 权限限制:后台唤醒时无法触发需要用户交互的权限申请弹窗,相关申请会直接返回拒绝。
- 功能限制:后台唤醒时无法进行任何UI相关的操作,比如弹窗、切换根视图控制器等,操作即使执行也不会展示给用户,部分依赖前台运行的API(比如广告标识获取、摄像头调用等)会返回空或者报错。
内容的提问来源于stack exchange,提问作者Jonas Sourlier
相关产品推荐
相关产品推荐

