You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS端PWA与独立Safari共享IndexedDB的可行性及实现步骤

iOS中PWA与Safari的IndexedDB共享问题及解决方案

首先直接给结论:在iOS系统里,PWA和独立Safari浏览器默认是无法直接共享IndexedDB存储的。这是因为苹果把PWA放在了独立的WebKit容器中,它的存储上下文(包括IndexedDB、LocalStorage、Cookie等)和Safari主应用完全隔离,目的是保障PWA的独立性和数据安全。

不过针对你提到的「第三方认证跳Safari后,要把令牌存到PWA的IndexedDB」这个场景,我们可以通过间接的方式实现令牌的传递和存储,下面是两个可行的方案:

方案一:通过Universal Links(深度链接)将令牌传递回PWA

这是最直接的解决方案,核心思路是认证完成后跳回PWA,在PWA内部完成令牌存储:

  • 步骤1:配置PWA的Universal Links
    在你的域名根目录下创建apple-app-site-association文件,指定PWA可以被唤起的路径(比如你的认证回调路径)。同时在PWA的manifest.json中确保scopestart_url配置正确,支持Universal Links唤起。
  • 步骤2:第三方认证页面处理回调
    当第三方认证成功后,生成包含令牌的Universal Link(比如yourdomain.com/auth-callback?token=xxx,注意要用HTTPS),通过window.location.href跳转到这个链接。iOS会自动识别到这是PWA的关联链接,唤起你的PWA应用。
  • 步骤3:PWA接收令牌并存储
    在PWA的页面初始化逻辑中,解析URL中的token参数,然后使用IndexedDB的标准API将令牌存入本地。比如:
    // 解析URL参数
    const urlParams = new URLSearchParams(window.location.search);
    const authToken = urlParams.get('token');
    
    // 存入IndexedDB
    if (authToken) {
      const request = indexedDB.open('AuthDB', 1);
      request.onupgradeneeded = (event) => {
        const db = event.target.result;
        db.createObjectStore('tokens', { keyPath: 'id' });
      };
      request.onsuccess = (event) => {
        const db = event.target.result;
        const transaction = db.transaction('tokens', 'readwrite');
        const store = transaction.objectStore('tokens');
        store.put({ id: 'user-auth', token: authToken });
        transaction.oncomplete = () => db.close();
      };
    }
    

方案二:通过服务器端中转令牌

如果Universal Links配置有困难,或者令牌过于敏感不适合直接在URL中传递,可以用服务器做中转:

  • 步骤1:认证完成后将令牌存入服务器
    在第三方认证成功的回调页面,将令牌发送到你的后端服务器,同时关联一个临时的用户标识(比如设备指纹、会话ID),并设置这个标识的过期时间(比如10分钟)。
  • 步骤2:PWA从服务器获取令牌
    用户从Safari回到PWA后,PWA向你的后端请求令牌,携带之前的临时标识。后端验证标识有效后,返回令牌给PWA。
  • 步骤3:PWA存储令牌到IndexedDB
    拿到令牌后,用和方案一相同的IndexedDB API将令牌存入本地。

注意事项

  • 不管用哪种方案,都要确保令牌的传输过程使用HTTPS,避免明文泄露。
  • 敏感令牌建议设置较短的过期时间,或者在传递前进行加密处理。
  • 测试Universal Links时,可能需要清除Safari缓存或重启iOS设备,确保关联关系生效。

内容的提问来源于stack exchange,提问作者digiplant

火山引擎 最新活动