gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:55:50 25 4
gpt4 key购买 nike

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

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

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

谢谢!

最佳答案

看起来没有直接的方法可以做到这一点。查看反汇编的 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,因为如果窗口不是 nil,这始终是一个 UIApplication:

[(id)view.window.nextResponder sendAction:@selector(foo:) to:nil from:nil event:nil]

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com