• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 由于 `sharedApplication` 不可用,如何以编程方式在 iOS 扩展中发送操作?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 18:07:11 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用与主应用共享的代码来实现 iOS 操作扩展。其中一些使用 [[UIApplication sharedApplication] sendAction:to:from:event] 向第一响应者发送操作。 由于 sharedApplication 在扩展中不可用,因此无法编译此代码。

我尝试了一种解决方法,即实例化一个 UIControl,并使用 -[UIControl sendAction:to:forEvent:] 从它发送一个 Action 。这可行,但有一个很大的缺点(除了感觉很hacky):无法控制发件人(这将是 UIControl 实例),在我的情况下这是必要的。

我正在考虑的另一种解决方法是通过观察 UIApplication 通知并从中获取 object 属性来检索包装扩展的 UIApplication 对象(我已经确认某些这些通知仍然在扩展中发送。)但即使这确实有效,它是否有机会被 Apple 批准,因为它只是在欺骗 sharedApplication 限制?有人在实时应用中体验过这种技术吗?

谢谢!



Best Answer-推荐答案


看起来没有直接的方法可以做到这一点。看看一个反汇编的 UIKit,调用 -[UIApplication sendAction:to:from:forEvent:] 的方法非常少,而且所有这些方法都明确地提供了一个发送者。

好消息是 -[UIControl sendAction:to:forEvent:] 只是 -[UIApplication sendAction:to:from:forEvent:] 的一个薄包装:

void -[UIControl sendAction:to:forEvent:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4) {
    rbx = [arg3 retain];
    [*_UIApp sendAction:arg2 toTarget:rbx fromSender:self forEvent:arg4];
    rdi = rbx;
    [rdi release];
    return;
}

如果您愿意冒险 Apple 可能会更改控件交互的基本行为以完全取消扩展中的 UIApplication,那么调用 sendAction:to 可能相对安全:from:forEvent: 在找到的应用程序实例上。我将检索它的方式是 view.window.nextResponder,因为如果窗口不为零,这始终是一个 UIApplication:

[(id)view.window.nextResponder sendActionselector(foo to:nil from:nil event:nil]

Apple 不应该拒绝这一点,因为您没有使用不允许的 API,并且您没有做任何 UIControl 尚未做的事情。

如果您不想冒险,您正在做的可能是最好的方法,创建一个虚拟控件(如果需要)并使用它来发送操作。

关于ios - 由于 `sharedApplication` 不可用,如何以编程方式在 iOS 扩展中发送操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34746093/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap