我正在开发一个Iphone应用程序,我需要在后台本身执行自动注销,即在按下Home按钮之后。
我已尝试使用以下代码进行会话超时,该代码适用于桌面。但是这个解决方案在Iphone的后台不起作用,因为我必须等待完整的10秒才能重定向到所需的页面。
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script>
$(document).ready(function(){
var wintimeout;
function SetWinTimeout() {
wintimeout = window.setTimeout("window.location.href='try.html';",10000); //after 5 mins i.e. 5 * 60 * 1000
}
$('body').click(function() {
window.clearTimeout(wintimeout); //when user clicks remove timeout and reset it
SetWinTimeout();
});
SetWinTimeout();
});
</script>
</head>
<body>
<a href = "try.html"> try link </a>
Hey there.. is this working fine?
</body>
</html>
有人可以为此提供解决方案吗?
上述代码中的会话超时间隔也没有在Iphone上重置,因为即使我点击屏幕,我也被重定向到所需的页面。我该如何解决这个问题?
答案 0 :(得分:0)
iPhone Sdk在后台进入后5秒后挂起所有任务。如果app支持多任务处理(如音频播放位置更新),它将支持后台任务。我可以为您提供一种解决方案,即节省您进入后台的时间,并节省您前景的时间。如果它计算的时间超过了注销的时间,那么点击你想要的服务。
答案 1 :(得分:0)
也许是这样的?
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script>
$(document).ready(function(){
document.lastActivity = new Date().getTime();
document.threshold = 20000; // some value
// and set an interval to keep an eye on last activity
var interval = setInterval(/* something here */);
$('body').on('click keydown', function() {
document.lastActivity = new Date().getTime(); // keep resetting this
});
}).on('focus', function () {
var timeSince = new Date().getTime() - document.lastActivity;
if (timeSince > document.threshold) {/* do stuff here */}
});
</script>
</head>
<body>
<a href = "try.html"> try link </a>
Hey there.. is this working fine?
</body>
</html>
想法是计算自上次活动以来经过的时间。当浏览器处于后台时,iOS设备暂停 JS,在我看来是有充分理由的。
答案 2 :(得分:0)
这样的事情怎么样...... 注意:我有几个可以用其他任何东西切换出来的MVC Razor片段。我没有测试过这个,但这是一个好的开始。非Safari iOS浏览器将忽略pageshow / pagehide事件处理程序,因此这不是移动设备的完整解决方案。请随意改进,以获得更广泛的跨浏览器功能。此外,此解决方案还需要使用JQuery cookie插件:https://github.com/carhartl/jquery-cookie
/////////客户端代码
//Safari iOS example that could be further developed to handle other mobile browsers
var sessTimeCutOffInMs = 600000; //600000 ms equals 10 minutes
//Safari iOS event handler for resume tab and/or focus from sleep mode
window.addEventListener("pageshow", function(e){
var timeIn = getTime();
var timeOut = $.cookie('timeOut');
if(timeOut != null) {
//Let us compare
compareTimes(timeIn,timeOut);
}
}, false);
//Safari iOS event handler when creating new tab/app switching and/or putting into sleep mode
window.addEventListener("pagehide", function(e){
var timeOut = getTime();
$.cookie('timeOut', timeOut, { path: '/' });
}, false);
function getTime() {
@{
//MVC Razor syntax
//formatted as milliseconds since 01.01.1970
var _serverTime = DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds.ToString("F0");
}
var serverTime = @_serverTime;
return serverTime;
//return (new Date()).getTime();
}
function compareTimes(timeIn,timeOut) {
var diff = timeIn - timeOut;
//If the mobile page was asleep for 10 minutes or more, force iOS user to logout
//Especially useful for when forms auth is set to slidingExpiration=true
if(diff >= sessTimeCutOffInMs) {
//Redirect to logout routine
//MVC Razor code shown below for redirecting to my Home Controller/Action
simpleReset('@(Html.ResolveUrl("~/Home/SignOut"))');
}
}
function simpleReset(url) {
window.location.href = url;
}
///////////// MVC 4 HomeController.cs SignOut()的代码片段动作
[AllowAnonymous]
public ActionResult SignOut()
{
try
{
ViewBag.Message = "You are signed out.";
//DELETE SSO Cookie
HttpCookie ssoCookie = new HttpCookie("SMSESSION", "NO");
ssoCookie.Expires = DateTime.Now.AddYears(-1);
ssoCookie.Domain = ".myDomain.com"; //IMPORTANT: you must supply the domain here
Response.Cookies.Add(ssoCookie);
//Look for an existing authorization cookie and kill it
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
authCookie.Value = null;
authCookie = null;
Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
// clear authentication cookie
//Overriding the existing FormsAuthentication cookie with a new empty cookie ensures
//that even if the client winds back their system clock, they will still not be able
//to retrieve any user data from the cookie
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie1.Path = FormsAuthentication.FormsCookiePath;
cookie1.Expires = DateTime.Now.AddYears(-1);
cookie1.HttpOnly = true;
Response.Cookies.Add(cookie1);
// clear session cookie
HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);
//Explicitly destroy roles object and session
SimpleSessionHandler.myRoles = null;
Session.Clear();
Session.Abandon();
// Invalidate the Cache on the Client Side
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
FormsAuthentication.SignOut();
}
catch (Exception ex) {
//Swallow it
Log.LogError("AUTH COOKIE ERROR: " + ex.Message, ex);
}
//The loginUrl on IWH is actually a LOGOUT page for the SSO cookie
return Redirect(FormsAuthentication.LoginUrl);
}