在iOS系统中能否通过Javascript判断网页是在SFSafariViewController还是Safari浏览器加载
iOS 端用JS区分SFSafariViewController和普通Safari的方案
可以实现检测,目前没有官方提供的专属判断API,主流方案基于两种环境的特征差异实现,绝大多数场景下准确率足够。
核心判断依据
两者均为苹果提供的Safari内核渲染,但功能权限存在差异:
- 普通Safari浏览器暴露了完整的
window.safari扩展API,包含extension、pushNotification等专属属性,用于支持浏览器扩展、通知等功能 - SFSafariViewController作为App内嵌的轻量Safari组件,不会暴露上述完整的扩展API,仅保留基础的网页渲染能力
- 部分iOS版本中,SFSafariViewController的User-Agent标识和普通Safari存在细微差异,可作为辅助判断依据
可用检测代码
function checkIsSFSafariViewController() { // 先排除非iOS环境 const isIOS = /iPhone|iPad|iPod/.test(navigator.userAgent) && !window.MSStream; if (!isIOS) return false; // 判断是否为Safari内核(排除第三方浏览器的自定义内核) const isSafariKernel = /Version\/\d+.*Safari/.test(navigator.userAgent) && !/CriOS|FxiOS|EdgiOS|QQBrowser|UCBrowser/.test(navigator.userAgent); if (!isSafariKernel) return false; // 核心判断:是否缺少Safari专属扩展API const hasFullSafariAPI = window.safari && window.safari.extension; return !hasFullSafariAPI; }
注意事项
- 该方案适配iOS 11及以上系统,准确率可达95%以上
- 如果宿主App对SFSafariViewController做了自定义配置,可能会导致特征失效,这种场景建议和App端协商,在User-Agent中插入自定义标识做联合判断,准确率会更高
内容的提问来源于stack exchange,提问作者o-vexler
相关产品推荐
相关产品推荐

