在UIViewController Xamarin-iOS中捕获来自UIWebview的windows.external.notify消息

时间:2016-04-11 15:02:41

标签: xamarin uiwebview xamarin.ios

我有一个场景,我正在尝试从UIWebview登录,如果成功通过身份验证,那么我将使用脚本代码段window.external.notify获取字符串令牌我能够获得令牌在Windows Phone中使用myWebView.ScriptNotify+=WinNotify;并在android中使用myWebView.AddJavascriptInterface(new ExternalInterface(),""); 但问题是我无法在iOS webview中检测到任何代码片段来读取此通知脚本。

我已经尝试了This我曾使用IWKScriptMessageHandler,但没有效果。

你能帮助我在iOS上完成它吗?

1 个答案:

答案 0 :(得分:1)

我之前为Azure Access Control Services做过类似的事情。代码可以在这里找到:https://github.com/Cheesebaron/Cheesebaron.MvxPlugins/blob/0e8b7765fe375d1d4998552074d664e6cf5397a3/AzureAccessControl/AzureAccessControl.Touch/Views/AccessControlWebAuthController.cs

基本上这样做是将Notify脚本注入到页面中,当调用该脚本时,它会导航到我知道的特定URL,从中我可以获取有效负载。

private const string ScriptNotify = @"
    <script type=""text/javascript"">
        window.external = {
            'Notify': function(s) {
                document.location = 'acs://settoken?token=' + s; 
            }, 
            'notify': function(s) {
                document.location = 'acs://settoken?token=' + s; 
            }
        };
    </script>";

因此,在调用通知脚本时,上面的代码会导航到acs://settoken?token=。您可以通过检查网址方案在UIWebView.ShouldStartLoad中检测到这一点。如果它与通知脚本中的匹配,则表示您已完成。

要注入脚本,我实现NSUrlConnectionDelegate并在FinishedLoading覆盖中将其作为数据的一部分注入,并使UIWebView加载该内容。