我正在尝试从我的键盘扩展中打开。我有自定义键盘,并且已从设置中添加该键盘。在我的自定义键盘上有一个“显示更多”按钮,我想点击这个按钮打开我的应用程序。
所以我尝试了以下代码:
let context = NSExtensionContext()
context.open(url! as URL, completionHandler: nil)
var responder = self as UIResponder?
while (responder != nil) {
if responder?.responds(to: Selector("openURL:")) == true {
responder?.perform(Selector("openURL:"), with: url)
}
responder = responder!.next
}
Run Code Online (Sandbox Code Playgroud)
它运行成功,但正如我们所知,swiftSelector("method_name:")已被弃用并#selector(classname.methodname(_:))改为使用,因此它发出警告。我想解决这个警告。所以我尝试过 Xcode 自动建议:
if responder?.responds(to: #selector(UIApplication.openURL(_:))) == true {
responder?.perform(#selector(UIApplication.openURL(_:)), with: url)
}
Run Code Online (Sandbox Code Playgroud)
也试过:
if responder?.responds(to: #selector(NSExtensionContext.open(_:))) == true {
responder?.perform(#selector(NSExtensionContext.open(_:)), with: url)
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过其他可能的方法,但没有运气。如果有人知道该怎么做,请告诉我。
我提到了这个链接,Julio Bailon 的回答:
我有一个动作扩展,它接受图像,对图像进行小修改(例如叠加水印),然后允许用户打开另一个UIActivityController,将修改后的图像发送到另一个(任意)扩展(例如与社交媒体分享图片)。与大多数(但不是全部)扩展共享后,我的扩展崩溃了,因为达到了内存限制。
我得到的错误是:
EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=120 MB, unused=0x0)
Run Code Online (Sandbox Code Playgroud)
这在操作系统驱动的UIImage调用的深处发生。
脚步:
对于iOS提供的扩展名(例如保存或打印),不会出现崩溃。崩溃确实会出现在我尝试过的所有第三方扩展中。
我用仪器进行诊断。我的扩展程序在执行图像操作时的内存使用量短暂达到75MB的峰值,然后降至27MB。当用户界面开始为其他扩展程序构建时,我的应用程序的内存占用量迅速飙升。它达到120MB,然后消失。
在内存升级期间,我收到了三个didReceiveMemoryWarning调用。我持有的唯一数据是屏幕上的UIImageView。我已经尝试过杀死UIImageView了(imageView.removeFromSuperview然后imageView = nil),结果没有变化。
似乎辅助扩展正在我的扩展的内存中加载,并且合并的占用空间超过了120MB的限制。那有意义吗?那是预期的吗?
我承认存在一个扩展的想法是存在的,它只是暂时保留要与另一个扩展共享的数据,但这并不是我能想到的最佳方法。修改后的数据不需要永久保存-如果新版本的照片库中也有新版本,则用户很容易混淆。我曾考虑过扩展程序可以从那里打开我的主应用程序进行共享,但是这似乎是被设计所阻止的(有些黑客建议我没有尝试过-请参见openURL在Action Extension中不起作用)。
有任何解决方法吗?谢谢!
我试过了[self.extensionContext openURL:completion],但我的应用程序崩溃了.我听说有些扩展无法使用此方法,可以使用iMessage扩展吗?
顺便说一句,主持应用程序可以激活其iMessage扩展吗?
我有一个Safari共享扩展,我希望能够从扩展中打开主应用程序.向用户显示警报,其中他们可以选择打开应用程序.
func openAppHandler() {
self.extensionContext?.completeRequest(returningItems: []) { (success) in
if let url = URL(string: "myapp://...") {
self.extensionContext?.open(url, completionHandler: nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
didSelectPost()调用该方法后会出现警报 ,您可以看到它出现在扩展的后台优先级完成块中.该open方法在其文档中说"在iOS 8中,只有今天的扩展点(用于创建小部件)支持这种方法." 我猜它仍然是在Safari Share Extension中仍然不支持它的情况.
有没有人知道从共享扩展中打开我的主应用程序的方法?
我希望能够在我的应用程序中打开 Safari 链接。为此,我创建了一个操作扩展。我尝试了以下代码的多种变体进行测试,但没有一个变体打开我的主应用程序:
第一次尝试:
func openContainerApp() {
var responder: UIResponder? = self as UIResponder
let selector = #selector(openURL(_:))
while responder != nil {
if responder!.responds(to: selector) && responder != self {
responder!.perform(selector, with: URL(string: "awesome://item?id=20036169")!)
}
responder = responder?.next
}
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
Run Code Online (Sandbox Code Playgroud)
第二次尝试:
func redirectToHostApp() {
let url = URL(string: "awesome://item?id=20036169")
let selectorOpenURL = sel_registerName("openURL:")
let context = NSExtensionContext()
context.open(url! as URL, completionHandler: nil)
var responder = self as UIResponder?
while (responder != nil){
if responder?.responds(to: selectorOpenURL) …Run Code Online (Sandbox Code Playgroud) ios ×4
swift ×2
imessage ×1
ios10 ×1
objective-c ×1
selector ×1
swift3 ×1
uiimage ×1
uiresponder ×1