的设计与实现指南)
跨平台移动开发开发工具【免费下载链接】WinObjCObjective-C for Windows项目地址https://gitcode.com/gh_mirrors/wi/WinObjC点击查看免费下载本篇指南围绕 WinObjCWindows Bridge for iOS即 Objective-C for Windows中 Toast 通知操作的前台激活功能展开解析这一功能如何让以 iOS 代码为主构建的应用接入 Windows Toast 通知体系并在用户点击通知或提交输入时被激活到前台、携带参数回调应用。读完本文你将掌握 WinObjC 为 Toast Action 激活新增的公开 API含 launch options 常量与委托方法、底层跨语言桥接路径C/CX 与 Objective-C 投影以及如何在自己的应用中实现application:didReceiveToastAction:并验证整条激活链路。功能概述与需求特性摘要Toast 前台激活Toast Foreground Activation允许 Toast 通知携带参数供应用在激活后处理。也就是说用户与通知交互通常表现为点击通知上的按钮或通过通知提交文本输入时应用不仅能被唤起还能拿到与该操作绑定的参数和用户输入据此执行对应逻辑。这一特性解决的典型场景是一个主要使用 iOS 代码Objective-C/UIKit构建的应用希望同时利用 Windows 平台的 Toast 通知能力并让通知上的操作按钮驱动应用内业务流程。核心需求设计规范明确的需求为当收到一个 Toast Action 时应用应被激活到前台并携带用户给出的任何输入any input given。这要求激活不仅发生在后台或仅唤起进程还要确保 UI 进入前台可交互状态且输入数据能够被应用代码读取。文档术语Toast Action用户与 Toast 通知的一次交互通常是点击通知上的某个操作或通过通知提交输入。架构与技术决策跨语言桥接方案WinObjC 的代码主体是 Objective-C而 Windows Toast 通知激活事件由 WinRTC/CX层提供因此核心架构决策是完成一次类型桥接将 C/CX 的Windows::Foundation::ValueSet^转换为 Objective-C 的NSDictionary*将Platform::String^转换为NSString*桥接方式通过 C 函数在两个语言之间传递底层句柄——IInspectable*承载 ValueSetHSTRING承载字符串。这一设计意味着对开发者暴露的 API 全部是纯 Objective-C 类型NSDictionary、NSString符合 iOS 开发者习惯而 WinRT 层的转换细节被封装在 WinObjC 内部。语言决策依据设计文档实现采用Objective-C 投影projection与C/CX 包装wrapper相结合的方式面向应用层的 API 用 Objective-C 投影提供面向 Windows 系统侧的交互用 C/CX 包装完成这正是 WinObjC 处理系统集成功能的标准做法。对既有激活流程的兼容性设计文档强调加入 Toast Action 激活不需要改变现有激活流程只需在激活路径上分叉split在转换为 Objective-C 投影后重新汇合rejoin。因此改动是纯增量式的包括新增内部方法与枚举用于正确调用委托方法新增公开常量与新委托方法供开发者响应 Toast Action 激活重构现有激活路径使其能够处理ToastNotificationActivatedEventArgs类型的激活对象。详细设计改动清单与源码实现依据设计规范该特性涉及以下文件与新增项逐一对照仓库源码说明如下。Frameworks/UIKit/UIApplication.mmUIApplicationLaunchOptionsToastActionKey公开常量标识 launch options 中携带 Toast Action 数据。NSString* const UIApplicationLaunchOptionsToastActionKey UIApplicationLaunchOptionsToastActionKey;见 UIApplication.mm。与其配套的还有两个内部键NSString* const UIApplicationLaunchOptionsToastActionArgumentKey UIApplicationLaunchOptionsToastActionArgumentKey; NSString* const UIApplicationLaunchOptionsToastActionUserInputKey UIApplicationLaunchOptionsToastActionUserInputKey;见 UIApplication.mm。ArgumentKey对应通知激活参数即开发者在 Toast 通知 XML 中设置的arguments字符串UserInputKey对应ValueSet转换来的用户输入字典。_sendToastActionReceivedEvent:内部方法负责把 Toast Action 数据转发给应用委托- (void)_sendToastActionReceivedEvent:(NSDictionary*)toastAction { if ([self.delegate respondsToSelector:selector(application:didReceiveToastAction:)]) { [self.delegate application:sharedApplication didReceiveToastAction:toastAction]; } }见 UIApplication.mm。该实现使用respondsToSelector:做能力检测因此委托未实现新方法时不会产生崩溃兼容旧代码。Frameworks/UIKit/UIApplicationMain.mmUIApplicationMainHandleToastActionEventC 函数入口由 XAML 激活层在收到 Toast 激活事件时调用完成 WinRT 类型到 Objective-C 类型的转换并触发委托回调extern C void UIApplicationMainHandleToastActionEvent(HSTRING toastArgument, IInspectable* toastUserInput) { NSString* argument Strings::WideToNSString(toastArgument); // 将 IInspectable 查询为 IPropertySet再转换为 NSMutableDictionary ComPtrIInspectable comPtr toastUserInput; ComPtrABI::Windows::Foundation::Collections::IPropertySet map; THROW_NS_IF_FAILED(comPtr.As(map)); NSMutableDictionary* userInput nil; THROW_NS_IF_FAILED(::Collections::WRLToNSCollection(map, userInput)); NSDictionary* toastAction { UIApplicationLaunchOptionsToastActionArgumentKey : argument, UIApplicationLaunchOptionsToastActionUserInputKey : userInput }; [[UIApplication sharedApplication] _sendToastActionReceivedEvent:toastAction]; }见 UIApplicationMain.mm。从实现可以确认两条数据通道toastArgumentHSTRING通知的激活参数与toastUserInputIInspectable用户输入集合二者被封装为一个NSDictionary后经_sendToastActionReceivedEvent:送达委托。此外应用首次启动时同一激活参数还会被写入 launch options供标准的application:didFinishLaunchingWithOptions:读取case ActivationTypeToast: [launchOption setValue:activationArg forKey:UIApplicationLaunchOptionsToastActionKey]; break;见 UIApplicationMain.mm。这保证了冷启动 Toast 激活场景下应用仍能在didFinishLaunchingWithOptions:中拿到 Toast 参数而当应用已在运行或处于挂起状态时则走UIApplicationMainHandleToastActionEvent的实时回调路径。include/UIKit/UIApplicationDelegate.happlication:didReceiveToastAction:新增的公开委托方法- (void)application:(UIApplication*)application didReceiveToastAction:(NSDictionary*)action;见 UIApplicationDelegate.h。action字典内包含UIApplicationLaunchOptionsToastActionArgumentKey激活参数字符串与UIApplicationLaunchOptionsToastActionUserInputKey用户输入字典两个键值。Frameworks/UIKit/StarboardXaml激活源设计文档中提及的ActivationTypeToastAction枚举在实际仓库中以ActivationTypeToast形式实现见 UIApplicationMain.mm 的 switch 分支可推断设计阶段命名最终落地为ActivationTypeToast。真正的激活入口在 StarboardXaml.cppif (args-Kind ActivationKind::ToastNotification) { ToastNotificationActivatedEventArgs^ toastArgs safe_castToastNotificationActivatedEventArgs^(args); if (initiateAppLaunch) { _ApplicationLaunch(ActivationTypeToast, toastArgs); } UIApplicationMainHandleToastActionEvent(reinterpret_castHSTRING(toastArgs-Argument), reinterpret_castIInspectable*(toastArgs-UserInput)); }这段逻辑揭示了完整的系统侧流程XAML 应用收到ActivationKind::ToastNotification激活 → 若应用此前未运行则先走_ApplicationLaunch将参数写入 launch options→ 随后无条件调用UIApplicationMainHandleToastActionEvent触发委托回调。开发者公开 API 与使用示例设计文档明确指出需要向开发者公开文档化的两项 APIUIApplicationLaunchOptionsToastActionKeyUIApplication.mm 定义application:didReceiveToastAction:UIApplicationDelegate.h 定义冷启动场景从 launch options 读取当应用因 Toast 激活而被冷启动时在既有的didFinishLaunchingWithOptions:中读取- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { NSDictionary* toastAction launchOptions[UIApplicationLaunchOptionsToastActionKey]; if (toastAction ! nil) { NSString* argument toastAction[UIApplicationLaunchOptionsToastActionArgumentKey]; NSDictionary* userInput toastAction[UIApplicationLaunchOptionsToastActionUserInputKey]; // 依据 argument 与 userInput 执行对应业务逻辑 } return YES; }运行中场景实现委托方法当应用已在运行或从挂起状态恢复时系统调用新委托方法实时投递- (void)application:(UIApplication*)application didReceiveToastAction:(NSDictionary*)action { NSString* argument action[UIApplicationLaunchOptionsToastActionArgumentKey]; NSDictionary* userInput action[UIApplicationLaunchOptionsToastActionUserInputKey]; // 处理 Toast Action参数与用户输入均已就绪 }提示userInput的值以NSDictionary形式给出键为通知文本框中声明的输入标识符值为用户实际提交的字符串argument为通知 XML 中配置的激活参数通常用来自动续的launch...属性携带。功能与单元测试测试方法设计文档采用的验证策略是功能测试框架构建一个以给定参数激活的测试应用外壳用于验证所有委托方法都被调用且携带的数据正确同时新增一个完整测试应用验证整条激活路径端到端工作正常。仓库中对应的测试用例位于 tests/functionaltests/Tests/ToastNotificationTests.mm其做法与设计文档完全对应通过MOCK_CLASS模拟ToastNotificationActivatedEventArgs实现get_Argument、get_UserInput、get_Kind等接口伪造系统侧的激活事件对象见该文件 L36-L48定义ToastNotificationForegroundActivationTestDelegate实现UIApplicationDelegate在willFinishLaunchingWithOptions:与didFinishLaunchingWithOptions:中校验EXPECT_NE(nullptr, launchOptions[UIApplicationLaunchOptionsToastActionKey]); NSDictionary* toastAction launchOptions[UIApplicationLaunchOptionsToastActionKey]; EXPECT_OBJCEQ(TOAST_NOTIFICATION_TEST, toastAction[UIApplicationLaunchOptionsToastActionArgumentKey]); NSDictionary* userInput toastAction[UIApplicationLaunchOptionsToastActionUserInputKey]; EXPECT_OBJCEQ(TOAST_NOTIFICATION_TEST_VALUE, userInput[TOAST_NOTIFICATION_TEST_KEY]);见 ToastNotificationTests.mm。测试以TOAST_NOTIFICATION_TEST作为激活参数、TOAST_NOTIFICATION_TEST_KEY/TOAST_NOTIFICATION_TEST_VALUE作为用户输入键值对逐一验证 launch options 中的三个键UIApplicationLaunchOptionsToastActionKey及其内部的 Argument/UserInput 子键数据链路正确。测试代码同时印证了文档中的架构描述UIApplicationActivationTest以IInspectable*形式注入伪造激活参数模拟从 WinRT 侧发起激活验证整条StarboardXaml → UIApplicationMainHandleToastActionEvent → _sendToastActionReceivedEvent → 委托方法的调用链。总结Toast 前台激活是 WinObjC 让 iOS 代码应用接入 Windows Toast 通知交互的标准路径其设计核心可概括为三点增量式接入不改变既有激活流程仅新增常量、内部方法与委托方法类型安全桥接通过 C 函数 IInspectable*/HSTRING句柄将 WinRT 的ValueSet/Platform::String转换为开发者熟悉的NSDictionary/NSString双路径投递冷启动时经 launch options 提供参数UIApplicationLaunchOptionsToastActionKey运行中经application:didReceiveToastAction:实时回调两类场景均有功能测试覆盖。开发者只需实现一个委托方法、读取一个 launch options 常量即可在 WinObjC 应用中完整支持 Toast 通知交互的前台激活与参数处理。赞分享跨平台移动开发开发工具【免费下载链接】WinObjCObjective-C for Windows项目地址https://gitcode.com/gh_mirrors/wi/WinObjC点击查看免费下载相关推荐Budibase通知系统Toast消息与通知中心的设计Budibase通知系统Toast消息与通知中心的设计 概述 Budibase作为一款低代码开发平台其通知系统设计体现了现代Web应用的交互最佳实践。通知系低代码人工智能AI Agent工作流自动化后端前端Apache Atlas业务元数据管理自定义属性与标签系统全攻略Apache Atlas业务元数据管理自定义属性与标签系统全攻略 Apache Atlas作为开源的元数据管理与治理平台为Hadoop生态系统及其他数据平台Moodle 前端 Toast 通知组件core/toast 模块完整使用指南Moodle 前端 Toast 通知组件core/toast 模块完整使用指南 导读 Toast轻量级通知是 Moodle 前端中用于向用户展示短暂提示信教育后端前端上一篇使用 Terraform AWS Provider 构建 API Gateway WebSocket 聊天应用完整示例解析下一篇MMPose 中 MotionBERT 三维人体姿态估计实战指南基于 DSTFormer 的 Human3.6M 序列姿态提升创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考