插件返回后 Cordova 视图无响应
Posted
技术标签:
【中文标题】插件返回后 Cordova 视图无响应【英文标题】:Cordova view unresponsive after plugin returns 【发布时间】:2016-09-13 15:00:42 【问题描述】:我正在尝试使 ios 的 auth0 锁定与 cordova 一起使用。它似乎可以工作,除非我在插件完成后关闭视图时做错了。它被解雇了,但我不能再与科尔多瓦视图交互。它变得没有反应。
插件代码如下:
@implementation lockPlugin
-(void)init:(CDVInvokedUrlCommand*)command
A0Lock *lock = [A0Lock sharedLock];
A0LockViewController *controller = [lock newLockViewController];
controller.onAuthenticationBlock = ^(A0UserProfile *profile, A0Token *token)
CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
messageAsDictionary:@
@"idToken":token.idToken,
@"refreshToken":token.refreshToken,
@"tokenType":token.tokenType,
@"accessToken":token.accessToken,
@"email":profile.email
];
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
[self.viewController dismissViewControllerAnimated:YES completion:nil];
;
[lock presentLockController:controller fromController:self.viewController];
@end
【问题讨论】:
您在 iOS 上使用了 Auth0,而不是在 Cordova 上使用了 Auth0。我无法找到 Cordova 与原生 iOS 兼容的示例,并且可能存在一些问题。你能详细说明你为什么选择这个选项吗? @RoyFalk 我希望登录时具有原生外观。奇怪的是,有时它工作得很好。 如果您在 Xcode 上打开项目,您会在控制台上看到一些消息吗? @jcesarmobile 它会关闭锁定视图,但随后我无法与科尔多瓦交互。没有错误,Safari 开发工具仍然可以工作,所以我仍然可以在控制台中执行 js。 本机错误不会出现在 safari 控制台上,您可以打开 Xcode 项目并尝试从那里运行吗?它在平台/ios上,只需双击 .xcodeproj 【参考方案1】:我不得不承认您的代码看起来不错,而且我在它或 Google 上都找不到任何问题。我确实找到了一些关于比赛条件的参考资料,这让我想到了最新和最后的想法......
dismissViewControllerAnimated 从 CDVPluginResult 调用,并引用 CDVPluginResult.viewController 而不是原始 viewController。动作本身是动画的,这意味着需要一段时间,到那时,引用是零。或者,您似乎不应该从块中调用dismiss,因为它不是UI线程。 This 似乎支持我的第二个理论。尝试做
dispatch_async(dispatch_get_main_queue(), ^
[self.viewController dismissViewControllerAnimated:YES completion:nil];
);
================================================ ===============================
它的工作原理很奇怪。您将 lock 变量放置在 init 方法中的本地上下文中,Auth0 for iOS docs 说您应该“将其作为强大的属性保存在 AppDelegate 中......只要您需要它就让它保持活跃。”由于它是 init 中的局部变量,因此应在方法终止后立即将其释放。
也许每 x 秒进行一次会话检查,并且应用有时有足够的宽限期来工作和加载新屏幕。
【讨论】:
我正在使用插件来获取令牌并将结果发送到科尔多瓦。身份验证不是问题,因为我得到了令牌并且一切正常。我遇到的问题是正确关闭视图。 这行得通。我必须添加一个 UINavigationController 并用它呈现 lockController。谢谢! 它有效,但并非一直有效。我接受了答案,但这件事让我发疯了,因为没有办法可靠地重现它。 你能添加一些 NSLog 吗?在解除之前/之后的 UI 线程内 2. 在 prepareForDealloc 或 dealloc 中。这可能暗示了问题。 顺序正确。我能够将问题过滤到 auth0 的 signupviewcontroller。登录视图工作正常,但如果我通过注册,它就不起作用。以上是关于插件返回后 Cordova 视图无响应的主要内容,如果未能解决你的问题,请参考以下文章