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
相关产品推荐
相关产品推荐

