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

时间:2016-05-17 13:18:20

标签: ios objective-c 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

1 个答案:

答案 0 :(得分:1)

我必须承认您的代码看起来不错,我发现它或Google上没有任何问题。我确实找到了一些关于竞争条件的参考资料,这让我了解了最新的想法...

从CDVPluginResult调用dismissViewControllerAnimated,引用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秒进行一次会话检查,应用程序有时会有足够的宽限期来工作并加载新屏幕。