我有一个场景,我正在尝试从UIWebview登录,如果成功通过身份验证,那么我将使用脚本代码段window.external.notify
获取字符串令牌我能够获得令牌在Windows Phone中使用myWebView.ScriptNotify+=WinNotify;
并在android中使用myWebView.AddJavascriptInterface(new ExternalInterface(),"");
但问题是我无法在iOS webview中检测到任何代码片段来读取此通知脚本。
我已经尝试了This我曾使用IWKScriptMessageHandler
,但没有效果。
你能帮助我在iOS上完成它吗?
答案 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加载该内容。