ios - 由于 `sharedApplication` 不可用,如何以编程方式在 iOS 扩展中发送操作?
<p><p>我正在使用与主应用共享的代码来实现 iOS 操作扩展。其中一些使用 <code>[ sendAction:to:from:event]</code> 向第一响应者发送操作。
由于 <code>sharedApplication</code> 在扩展中不可用,因此无法编译此代码。 </p>
<p>我尝试了一种解决方法,即实例化一个 <code>UIControl</code>,并使用 <code>-</code> 从它发送一个 Action 。这可行,但有一个很大的缺点(除了感觉很hacky):无法控制发件人(这将是 <code>UIControl</code> 实例),在我的情况下这是必要的。</p>
<p>我正在考虑的另一种解决方法是通过观察 UIApplication 通知并从中获取 <code>object</code> 属性来检索包装扩展的 <code>UIApplication</code> 对象(我已经确认某些这些通知仍然在扩展中发送。)但即使这确实有效,它是否有机会被 Apple 批准,因为它只是在欺骗 <code>sharedApplication</code> 限制?有人在实时应用中体验过这种技术吗?</p>
<p>谢谢!</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>看起来没有直接的方法可以做到这一点。看看一个反汇编的 UIKit,调用 <code>-</code> 的方法非常少,而且所有这些方法都明确地提供了一个发送者。</p>
<p>好消息是 <code>-</code> 只是 <code>-</code> 的一个薄包装:</p>
<pre><code>void -(void * self, void * _cmd, void * arg2, void * arg3, void * arg4) {
rbx = ;
[*_UIApp sendAction:arg2 toTarget:rbx fromSender:self forEvent:arg4];
rdi = rbx;
;
return;
}
</code></pre>
<p>如果您愿意冒险 Apple 可能会更改控件交互的基本行为以完全取消扩展中的 <code>UIApplication</code>,那么调用 <code>sendAction:to 可能相对安全:from:forEvent:</code> 在找到的应用程序实例上。我将检索它的方式是 <code>view.window.nextResponder</code>,因为如果窗口不为零,这始终是一个 <code>UIApplication</code>:</p>
<pre><code>[(id)view.window.nextResponder sendAction:@selector(foo:) to:nil from:nil event:nil]
</code></pre>
<p>Apple 不应该拒绝这一点,因为您没有使用不允许的 API,并且您没有做任何 <code>UIControl</code> 尚未做的事情。</p>
<p>如果您不想冒险,您正在做的可能是最好的方法,创建一个虚拟控件(如果需要)并使用它来发送操作。</p></p>
<p style="font-size: 20px;">关于ios - 由于`sharedApplication` 不可用,如何以编程方式在 iOS 扩展中发送操作?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/34746093/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/34746093/
</a>
</p>
页:
[1]