插件返回后,Cordova视图无响应

Ker*_*ayi 6 objective-c ios cordova auth0

我正在尝试使用cordova对iOS进行auth0锁定.它似乎工作,但是当我在插件完成后解除视图时我做错了.它被解雇但我不能再与科尔多瓦视图互动.它变得反应迟钝.

这是插件代码:

@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
Run Code Online (Sandbox Code Playgroud)

Roy*_*alk 1

我不得不承认你的代码看起来不错,我在它或谷歌上找不到任何问题。我确实找到了一些关于竞争条件的参考,这让我想到了最新和最后的想法......

missViewControllerAnimated 是从 CDVPluginResult 调用的,并引用 CDVPluginResult.viewController 而不是原始的 viewController。动作本身是动画的,这意味着需要一段时间,到那时,引用为零。或者,您似乎不应该从块中调用解雇,因为它不是 UI 线程。似乎支持了我的第二个理论。尝试做

dispatch_async(dispatch_get_main_queue(), ^{
        [self.viewController dismissViewControllerAnimated:YES completion:nil];
    }); 
Run Code Online (Sandbox Code Playgroud)

=================================================== ===========================

事实上它的工作原理很奇怪。您将锁定变量放置在 init 方法中的本地上下文中,iOS 的 Auth0 文档表示您应该“将其作为强大的属性保留在 AppDelegate 中......只要您需要它,就让它保持活动状态。” 由于它是 init 中的局部变量,因此应在方法终止后立即释放它。

也许每 x 秒进行一次会话检查,并且应用程序有时有足够的宽限期来工作和加载新屏幕。