You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS Safari扩展中ASWebAuthenticationSession窗口大小设置问题

macOS Safari扩展中ASWebAuthenticationSession窗口尺寸自定义方案

问题背景

按照App Store Connect审核要求,为macOS Safari扩展实现ASWebAuthenticationSession登录流程后,发现启动的认证窗口默认占满整个屏幕。尝试过初始化时设置窗口rect、创建后修改尺寸等Native层面的方法均无效,仅能通过Safari视图的JS控制台执行window.resizeTo(600, 400)手动调整大小,需要可行的自动自定义尺寸方案。

原实现代码:

// This works in App Extension, so we do not have any root NSWindow
let loginSession = ASWebAuthenticationSession(url: authURL, callbackURLScheme: scheme) { callbackURL, error in ... }
let window = NSWindow()
let presentationContextProvider = MyPresentationContextProvider(view: window)
loginSession.presentationContextProvider = presentationContextProvider
loginSession.prefersEphemeralWebBrowserSession = true
loginSession.start()

可行解决方案

由于Safari扩展的沙箱限制,Native代码无法直接控制ASWebAuthenticationSession的窗口尺寸,目前最可靠的方式是结合JS注入和窗口初始配置实现:

1. 自动注入JS调整尺寸

在认证页面加载完成后自动执行尺寸调整代码,无需手动操作:

  • 页面内置代码:如果有权限修改认证服务的页面,直接添加加载事件:
window.addEventListener('DOMContentLoaded', () => {
    window.resizeTo(600, 400); // 自定义目标尺寸
});
  • URL参数传递逻辑:若无法修改认证页面,可在构造authURL时追加自定义参数(如authURL.appendPathComponent("?targetSize=600x400")),然后在页面中读取参数并执行调整:
window.addEventListener('DOMContentLoaded', () => {
    const params = new URLSearchParams(window.location.search);
    const size = params.get('targetSize')?.split('x');
    if (size?.length === 2) {
        window.resizeTo(parseInt(size[0]), parseInt(size[1]));
    }
});

2. 优化Presentation Context的窗口初始配置

虽然无法通过Native代码直接固定最终尺寸,但可以设置初始窗口属性,让JS调整后的效果更合理:

// 创建窗口时指定初始尺寸与样式,避免默认全屏
let initialRect = NSRect(x: 0, y: 0, width: 600, height: 400)
let window = NSWindow(
    contentRect: initialRect,
    styleMask: [.titled, .closable, .resizable],
    backing: .buffered,
    defer: false
)
window.center() // 让窗口居中显示,提升用户体验

let presentationContextProvider = MyPresentationContextProvider(view: window)
loginSession.presentationContextProvider = presentationContextProvider
loginSession.prefersEphemeralWebBrowserSession = true
loginSession.start()

注意事项

  • ASWebAuthenticationSession在Safari扩展环境下受系统沙箱约束,Native层面无法直接控制窗口尺寸,JS调整是当前唯一可行的自动方案。
  • 调整后的窗口尺寸需符合App Store审核的用户体验要求,建议保持在600x400至800x600之间,避免过小或过大。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:50:08