2016-12-23 66 views
0

我有一个MVC网络数据库应用程序,其中的记录基本上是带有项目的文档。IIOS IPAD不卸载,beforeunloador,paghide事件

当用户查看任何给定文档的4个或5个不同屏幕中的任何一个时,文档被锁定,而不是项目,并且被代码锁定。 记录锁有10分钟超时。用户在10分钟内不做任何记录,另一个可以记录。有代码检测到锁被丢失并被其他人占用。它工作正常,技术上合理。

应用程序的工作流程依赖于当用户离开屏幕或关闭浏览器时或者他们按下刷新按钮时释放的锁定。

这些工作正常在Windows和Android上,但不是在iPad上。

我知道没人

beforeunload

在iOS上,但我虽然有

卸载

pageHide

没有这些工作。

这是我的代码。

变种isOnIOS = navigator.userAgent.match(/ ipad公司/ I)|| navigator.userAgent.match(/ iPhone/i); var eventName = isOnIOS? “pageHide”:“beforeunload”; (EventName){ ReleaseRecordLock();});};}}

此代码适用于所有提及的平台,但事件不会在IOS上触发。

它在我看来这是苹果的故意,所以我不认为它会改变。

所以现在的问题。

如果用户更改屏幕或关闭浏览器,我可以做些什么来确保这些记录被解锁。如果他们没有任何用户可以访问文档10分钟,这是不可接受的。

谢谢

编辑...我不需要弹出窗口或通知。我只是需要可靠的解锁

回答

0

如上所述,没有任何事情应该实际上工作。页面隐藏和卸载不做任何事情。

我发现提到如何解决这个问题,但没有细节,所以我虽然我会在这里详细说明。

该解决方案适用于地区和标准站点。

我解决这个问题的方法之一是检测浏览器是否在IOS上运行,如果是,则更改菜单中的链接。

 <li> 
     @{ 
      if(Request.UserAgent.Contains("iPad") || Request.UserAgent.Contains("iPhone")) 
      { 
       <a onclick="IOSReleaseLock('controller', 'action')" href="javascript:void(0);">LinkText</a> 
      } 
      else 
      { 
       @Html.ActionLink("link Text","action","controller",new { Area = "Tasks" },null); 
      }       
     }              
    </li> 

在应用程序每一个环节都需要有一个叫做IOSReleaseLock可用的功能()或解决方案将无法工作。并非所有页面都会锁定记录,只有那些实际更改文档的记录。报告和基本网站功能(如更改密码,注销和系统管理员)不需要记录锁定。

在这一点上我有2个版本IOSReleaseLock的()

这是在不要求解锁页面中使用的版本。

function IOSReleaseLock(_controller, _action) 
    { 
     var url = '/__controller__/__action__/'; 
     url = url.replace('__controller__', _controller); 
     url = url.replace('__action__', _action); 
     window.location.href = url; 
    } 

这是放置在需要解锁的页面上的版本。

function IOSReleaseLock(_controller, _action) 
{ 
    var url = '/__controller__/__action__/'; 
    url = url.replace('__controller__', _controller); 
    url = url.replace('__action__', _action); 
    UnloadingRecordLockRelease();  
    window.location.href = url;  
} 

每个链接都有一个包装,所以每一个页面都必须加载一个IOSReleaseLock()版本。这包括您的/ home/index或您的应用程序启动的位置。如果你错过了那么一旦你在该页面上,你的菜单系统链接将不再工作。

需要UnloadingRecordLockRelease()函数加载该版本的页面以及不需要解锁的页面加载第一个版本。

在IOS上,每当你点击一个链接时,都会调用IOSReleaseLock()。这看起来很明显,但为了清楚起见,执行的IOSReleaseLock()版本是当前页面上的版本,而不是您要访问的页面上的版本。

因此,只要用户停留在网站上并且没有关闭浏览器,记录就可以正确解锁。

当用户注销时,所有记录都被解锁,但当浏览器选项卡关闭或者浏览器关闭时没有用户注销时,我无法解决问题。