App扩展是独立的可执行模块,将移动应用的功能扩展到其主界面之外:主屏幕上的Today Widget、通过CallKit处理VoIP电话以及通过BroadcastReceiver响应系统事件。系统集成允许应用在深层级上与操作系统交互,解锁普通屏幕无法使用的功能。根据苹果开发者文档,每个扩展在隔离进程中运行,并由系统独立于主应用进行管理。移动应用中的App扩展允许实现主进程中不可用的功能。
要点
iOS上的App扩展出现在iOS 8中,成为移动开发中系统集成的基础。这些是独立二进制文件,与主应用打包在一起,但在隔离进程中启动。每个扩展都有自己的Info.plist和通过NSExtensionPrincipalClass定义的入口点。系统管理App扩展的生命周期 — 它们在完成任务后不能停留在后台。
WidgetKit(iOS 14+)是在主屏幕创建小部件的现代框架。WidgetKit使用SwiftUI描述界面,使用TimelineProvider定义更新计划。小部件有三种尺寸:小(2×2单元格)、中(4×2)和大(4×4)。基于UICollectionViewController的旧版Today Widget仍然受支持,但Apple建议迁移到WidgetKit。WidgetKit上的App扩展不支持动画、键盘输入或手势 — 它们是静态或伪动画元素,定期更新。
Share Extension允许通过系统共享表单从任何应用向您的应用发送内容。Share Extension通过NSExtensionItem接收数据,并使用SLComposeServiceViewController作为UI。Action Extension在原地处理内容 — 例如,在浏览器中翻译文本,无需切换到其他应用。这两种类型都必须在有限时间内完成工作,否则系统会"杀死"扩展。这是移动应用中App扩展的重要限制 — 后台任务在扩展级别不可用。
iOS上的系统集成远不止小部件:CallKit、PushKit和SiriKit允许移动应用在系统级别工作。这些框架需要特殊权限,但为用户提供无缝体验 — 通过CallKit的通话看起来像普通电话通话,Siri无需打开应用即可处理请求。
CallKit将第三方应用的通话集成到系统通话屏幕中,包括锁定屏幕。CXProvider将应用注册为VoIP服务,CXCallController管理通话。CallKit自动阻止重复通话,并支持Call Directory Extension以阻止不需要的号码。CallKit在移动开发中的系统集成对于语音通信应用至关重要 — WhatsApp、Skype和Zoom使用它来显示来电。
PushKit将推送通知直接传递到移动应用,而不向用户显示。PushKit唤醒"已杀死"状态的应用,并通过委托PKPushRegistryDelegate传递数据。这是VoIP应用的主要机制:PushKit传递通话信息,CallKit显示它。PushKit具有比常规推送通知更高的传递优先级,并且不需要显示横幅。移动应用中的App扩展经常将PushKit与CallKit结合用于语音通信。
SiriKit允许通过Siri和快捷指令应用处理请求。Intents Extension是一个独立的App扩展,注册支持的意图并处理它们。SiriKit支持20多个领域:通话、消息、支付、笔记、锻炼。快捷指令允许用户创建自动化 — 例如,"通过Siri在WhatsApp中发送消息。"与SiriKit和快捷指令的系统集成提高了参与度,因为用户无需打开应用即可执行操作。
BroadcastReceiver是响应系统广播消息的Android组件。与iOS App扩展不同,BroadcastReceiver不需要单独的二进制文件 — 只需在清单中或通过Context.registerReceiver在代码中注册接收器即可。Android上的系统集成通常从BroadcastReceiver开始:从设备启动时启动服务到响应网络连接。
IntentFilter将BroadcastReceiver绑定到特定系统事件。典型事件:BOOT_COMPLETED(设备启动)、CONNECTIVITY_ACTION(网络变化)、BATTERY_LOW(电量低)、TIME_SET(时间变化)。接收器在AndroidManifest.xml中注册,或通过Context.registerReceiver进行动态注册。动态注册更可取 — 不需要清单权限,仅在应用活动时工作。App扩展在Android上不作为概念存在,但BroadcastReceiver扮演类似角色 — 通过系统集成扩展应用功能。
NotificationListenerService是接收所有系统通知的服务。NotificationListenerService需要BIND_NOTIFICATION_LISTENER_SERVICE权限和通过辅助功能设置的访问权限。AccessibilityService是更强大的系统集成工具:它可以读取屏幕内容、模拟点击和自动化操作。这两个服务都需要用户在设置中明确启用,这提高了安全性。通过AccessibilityService的移动应用系统集成用于自动填充器、屏幕阅读器和辅助功能工具。
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
该示例为BOOT_COMPLETED事件注册了BroadcastReceiver。WorkManager用于在设备启动后延迟执行任务 — 这是Android应用的标准方法。
Android上的App Widget Provider是小部件上下文中iOS App扩展的对应物:它是一个在主屏幕上显示交互内容的组件。与WidgetKit不同,Android小部件可以接受用户输入 — 点击、开关和手势。App Widget Provider通过大小和更新频率的XML描述在清单中注册。
RemoteViews通过XML布局描述小部件界面,仅支持有限的View集合。RemoteViews不允许自定义View — 仅标准组件:TextView、ImageView、Button、ProgressBar。AppWidgetProvider是处理小部件更新、启用和删除的基类。onUpdate方法通过updatePeriodMillis的定时器或通过WorkManager(用于精确控制)调用。Android上与小部件的系统集成需要谨慎 — 过于频繁的更新会消耗电池。
Glance API是使用Kotlin DSL代替XML创建小部件的Jetpack库。Glance API编译为RemoteViews,并支持类似Compose的语法:GlanceComposable、Column、Row、Text。该库解决了复杂XML代码的问题,并允许通过JUnit测试小部件。Glance API尚未支持所有RemoteViews功能 — 对于复杂的交互式小部件,经典方法更好。Android移动开发中的App扩展正在向Glance API发展,简化了小部件的创建和维护。
Content Provider是通过统一ContentResolver接口在应用间共享结构化数据的Android组件。与iOS App扩展不同,Content Provider不创建单独的进程 — 数据在调用应用的上下文中同步请求。Content Provider是Android系统集成的基础:联系人、媒体文件、日历和标准应用使用它来发布数据。
FileProvider是ContentProvider的子类,用于应用间的安全文件传输。FileProvider生成临时的content:// URI,而不是直接的file://路径,后者在Android 7+上被禁止。使用时,需要在XML配置中指定files-path或external-files-path。Android移动开发中的App扩展不作为独立概念存在,但FileProvider执行它们的功能 — 将数据共享能力扩展到单个应用之外。
在iOS上,文件共享的角色由File Provider Extension执行。File Provider Extension通过NSFileProviderManager将应用的文件发布到文件应用中。与FileProvider不同,iOS扩展需要单独的二进制文件,并在隔离进程中运行。File Provider Extension支持用于文件描述的NSFileProviderItem和用于文件夹导航的NSFileProviderEnumerator。通过File Provider Extension的移动应用系统集成允许用户从文件应用管理应用文件,而无需打开应用。
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
该示例展示了Swift中File Provider Extension的最小实现。item(for:)方法根据标识符返回NSFileProviderItem对象 — 系统在文件应用中显示文件时调用它。
常见问题
App扩展是独立的二进制文件,将应用的功能扩展到其进程之外:Today Widget、Share Extension、Action Extension、Keyboard Extension以及在隔离环境中运行的其他类型。
CallKit将VoIP电话集成到系统电话接口中,并在锁定屏幕上显示。PushKit在后台传递推送通知而不显示给用户 — 它唤醒应用以处理数据,如来电信息。
BroadcastReceiver是响应系统广播消息的Android组件:设备启动(BOOT_COMPLETED)、网络连接(CONNECTIVITY_ACTION)、飞行模式更改和其他操作系统事件。
使用AppWidgetProvider和RemoteViews创建小部件界面,或使用Glance API(Jetpack)实现Kotlin DSL方法。小部件通过指定大小和更新频率的XML描述在清单中注册。
Content Provider是通过ContentResolver在应用间共享数据的Android组件。用于访问联系人、媒体文件和来自其他应用的任何结构化数据。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。