插件返回后 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 视图无响应的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 插件从本机函数获取异步响应

iOS 上的 PhoneGap 条码扫描仪无响应

Cordova IOS webview 界面随机无响应

关闭模式视图后 UIScrollView 无响应

部署聊天机器人插件后,Fiori 启动板无响应

iOS UIButton 点击无响应的解决办法