ios中safari无痕浏览模式下,localStorage的支持情况

前言

  前阶段,测试提了个bug,在苹果手机中无痕模式下,搜索按钮不好使,无法跳页,同时搜索历史也没有展示(用户搜索历史时使用localStorage存储)。

正文

  iOS上Sarfari在无痕模式下,浏览器假装支持localStorage,并在全局window上暴漏了该方法,所以校验是有localStorage对象的,但是调用setItem进行保存的时候,就报Error: QuotaExceededError ... : The quota has been exceeded.

因此,进行了个小测试......,可能测试不够全面!

1.测试机型

  iPhone7 Plus  版本 11.3

  iPhone6 Plus  版本 11.3.1

  iPhone6     版本 10.2.1

  iPhoneSE        版本 9

  oppe r9

2.测试浏览器

  Sarfari    UC    自带浏览器

3.结果:

  iOS9,iOS10    Sarfari

    setItem 报错

    getItem null

  iOS 11    Sarfari

    setItem  可set

    getItem  可get

  iOS 11    UC

    setItem  不可set,但不报错

    getItem  null

  安卓机

    可set,可get

4.结论:

  只有iOS9、10还存在无痕浏览下localStorage无法使用的情况,iOS11中Sarfari已支持存取localStorage,但是iOS11中UC不支持存localStorage。

所以,在开发过程中使用loaclStorage就需要对以上情况进行兼容,避免 js 报错后影响整个页面的功能。

5.解决代码及注意要点:

  1.使用try/catch

  2.只针对setItem,进行判断“浏览器是否开启无痕模式”

//判断浏览是否支持localStorage
function isLocalStorageSupport{
    try {
        var isSupport = ‘localStorage‘ in window && window[‘localStorage‘] !== null;
        if (isSupport) {
        localStorage.setItem("local_storage_test", "1");
        localStorage.removeItem("local_storage_test");
        }
        return isSupport;
    } catch (e) {
        return false;
    }
}
//判断浏览器是否开启无痕模式
function  isInPrivate(){
      try {
        localStorage.setItem("local_storage_test", "1");
        localStorage.removeItem("local_storage_test");
        return false;
      } catch(e){
        return true;
      }
    }

  

原文地址:https://www.cnblogs.com/yuxina/p/9173866.html

时间: 2024-10-08 13:55:21

ios中safari无痕浏览模式下,localStorage的支持情况的相关文章

Safari无痕浏览影响localStorage

最近项目中遇到一个问题,有一个登录页,点击登录后,公司两个土豪金都不能正常跳转(但是登录请求已经发送到服务器了),其他人的手机都正常.项目又要急着上线,内心这个抓狂啊..最后静下心来,终于把问题给解决了. 解决过程: 由于服务器有接收到客户端的ajax请求,所以就看客户端是否收到服务器的响应,在回调的success函数下alert(data.code),发现是接收到响应的,并且data.code=0,满足跳转条件,所以在success的else中继续alert,最终将问题定位到 sessionS

iOS中的自定义代理模式

iOS中的自定义代理模式 自定义代理模式分为6步,遵循这6步,就能把代理完整的实现. 1.定义协议(协议中存放代理的任务).我们对于有的自定义的布局视图,并不会带有协议,为了满足我们有时候的开发需求,需要添加代理.那么我们就要先定义一个协议.如下:在自定义视图的DelegateView.h文件中定义一个DelegateViewDelegate协议,协议默认的都是必须的实现的方法,可以根据需求来添加可选实现的方法. 1.定义协议 2.定义代理属性,用来存储代理对象. 2.定义代理属性 3.为Del

OS X 和iOS 中的多线程技术(下)

OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1.1 什么是GCD GCD 全称 Grand Central Dispatch,可译为"牛逼的中枢调度器" GCD 基于纯 C 语言,内部封装了强大的函数库 1.2 使用 GCD 有什么优势 GCD 是苹果公司为多核的并行运算提出的解决方案 GCD 会自动利用更多的CPU内核 (如 二核 ,

iOS中如何让TextView和TextField控件支持return键收起输入法

TextView和TextField控件是iOS中负责接收用户输入的控件,那当用户输入完成时怎么收起面板呢? 1.TextView和TextField控件获得焦点之后的第一反应就是弹出输入法面板: 2.让TextView和TextField失去焦点的方法是调用resignFirstResponder. 3.在TextView(shouldChangeTextInRange)和TextField(shouldReturn)方法中实现.

ios中safari浏览器中date问题

在IOS5以上版本(不包含IOS5)中的Safari浏览器能正确解释出Javascript中的 new Date('2017-3-27') 的日期对象. 但是在IOS5版本里面的Safari解释new Date('22017-3-27') 就不正确,在IOS5的Safari中返回的永远是"Invalid Date". 想要IOS5中的Safari能正确解析new Date()那么必须这么写 new Date('2017/3/27'); 或者  将2017-3-27转成斜线格式,var

iOS中self.xxx 和 _xxx 下划线的区别

property (nonatomic,copy) NSString *propertyName; self.propertyName 是对属性的拜访: _propertyName 是对部分变量的拜访. 其1.@property的声明中,编译器正在天生g] @property (nonatomic,copy) NSString *propertyName; self.propertyName 是对属性的访问: _propertyName 是对局部变量的访问. 其一.@property的声明中,编

vue history模式下出现空白页情况

问题描述:   vue搭建的项目,路由一直用的hash模式,所以url中都会带有一个“#”号.现在想要去掉“#”,于是使用history模式 { mode: 'history' },代码如下: import Vue from 'vue'; import App from './App'; import routers from './router'; import VueRouter from 'vue-router'; Vue.use(VueRouter); const router = ne

DEBUG模式下, 内存中的变量地址分析

测试函数的模板实现 [cpp] view plain copy /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #define MY_TEMPLATE_H_2016_0123_1226 template<int iArySize> void fnTestDataType() { char szBuf[iArySize] = {'\0'}; unsigned short wT

iOS中为网站添加图标到主屏幕以及增加启动画面

虽然没有能力开发Native App,但还是可以利用iOS中Safari浏览器的特性小小的折腾一下,做一个伪Web App满足下小小的虚荣心的. 既然是在iOS中的Safari折腾的,那么代码中利用到的也基本上都是Safari的私有属性. 添加图标到主屏幕是Web App的第一步: <link rel="apple-touch-icon-precomposed" sizes="57x57" href="icon-57.png"> &l