iOS AppDelegate 订阅者
编辑
学习如何使用 Expo 模块 API 订阅与应用相关的 iOS 系统事件,例如传入链接和通知。
要响应某些与应用相关的 iOS 系统事件,例如传入链接和通知,有必要在 AppDelegate 中处理相应的方法。
React Native 模块 API 并不提供任何钩住这些方法的机制,因此 React Native 库的设置说明通常包括将代码复制到 AppDelegate 文件的步骤。为了简化和自动化设置和维护,Expo 模块 API 提供了一种机制,允许您的库订阅对 AppDelegate 函数的调用。为了使其工作,应用的 AppDelegate 必须继承自 ExpoAppDelegate,这是使用 Expo 模块的要求。
ExpoAppDelegate 实现了 UIApplicationDelegate 协议的大多数函数,并将它们的调用转发给所有订阅者。
开始
首先,您需要创建一个 Expo 模块或使用 React Native 模块 API 集成 Expo 模块 API。 了解更多。
创建一个新的公共 Swift 类,该类扩展自 ExpoAppDelegateSubscriber,并将其名称添加到 模块配置 的 apple.appDelegateSubscribers 数组中。运行 pod install,订阅者将在应用程序项目中的 ExpoModulesProvider.swift 文件中生成。
现在,您可以通过向订阅者类添加委托函数来订阅事件。有关您可以订阅的函数的完整列表,请参阅 ExpoAppDelegate.swift 中的重写函数。可能导致副作用的应用委托函数尚不支持(例如,application(_:viewControllerWithRestorationIdentifierPath:coder:))。
不支持 Objective-C 类。
返回值
需要返回值的委托函数有一些额外的逻辑,用于协调多个订阅者的响应并尽量满足它们。以下是两个良好的边缘案例示例:
application(_:didFinishLaunchingWithOptions:) -> Bool
根据 Apple 文档,如果应用无法处理 URL 资源或继续用户活动,则应返回 false,否则应返回 true。如果应用因远程通知启动,则返回值将被忽略。
在此情况下,如果至少一个订阅者返回 true,则 ExpoAppDelegate 也将返回 true。
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
此方法通知应用委托收到远程通知,并为应用提供了获取新数据的机会。它接收一个完成块,以便在获取操作完成时执行。该块应使用最佳描述获取请求结果的获取结果值进行调用。可能的值为:UIBackgroundFetchResult.newData、UIBackgroundFetchResult.noData 或 UIBackgroundFetchResult.failed。
在此场景中,ExpoAppDelegate 向每个订阅者传递一个新的完成块,等待所有完成后收集结果,然后再调用原始完成块。最终结果取决于从订阅者收集的结果,顺序如下:
- 如果至少一个订阅者以
failed结果调用完成块,则委托也返回failed。 - 如果存在至少一个
newData结果,则委托返回newData。 - 否则返回
noData。
要查看其他函数如何处理您的订阅者的结果,我们建议直接阅读代码:
ExpoAppDelegate.swift。
示例
import ExpoModulesCore public class AppLifecycleDelegate: ExpoAppDelegateSubscriber { public func applicationDidBecomeActive(_ application: UIApplication) { // 应用已变为活动状态。 } public func applicationWillResignActive(_ application: UIApplication) { // 应用即将变为非活动状态。 } public func applicationDidEnterBackground(_ application: UIApplication) { // 应用现在处于后台。 } public func applicationWillEnterForeground(_ application: UIApplication) { // 应用即将进入前台。 } public func applicationWillTerminate(_ application: UIApplication) { // 应用即将终止。 } public func applicationDidReceiveMemoryWarning(_ application: UIApplication) { // The app has received a memory warning. } }
{ "apple": { "appDelegateSubscribers": ["AppLifecycleDelegate"] } }