Hi, after upgrading MacOS (MB Air M1 Version 26.2 (25C56)) & Safari (Version 26.2 (21623.1.14.11.9)) to latest versions, we are experiencing a new bug occurring with our web extension (Click & Read) on local storage writing and getting this error :
Invalid call to browser.storage.local.set(). Disk I/O error.
This doesn't happen on other browsers (chromium, Firefox).
export const setLocalStorage = async (value: object) => {
try {
await browser.storage.local.set(value);
} catch (error) {
console.error("[Click & Read] Error setting local storage", error);
}
};
Explore the integration of web technologies within your app. Discuss building web-based apps, leveraging Safari functionalities, and integrating with web services.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I have a simple website, that I would like to make available as a progressive webapp, so I can somewhat customize what happens when people add the website to their homescreen (using the Share button) and maybe, in the future, use PWABuilder or something similar to publish it in some stores.
My website needs authentication using OIDC, which after some redirects within the PWA opens an authenticator app on the phone.
When the app returns from authenticating however, it opens a new browser tab instead of my PWA, so there is no context and the login fails.
I am under the impression that this used to work, but I'm not sure. I'm also not sure what the problem is, I have no idea how, when the Authenticator app opens a URL (which is what I assume is happening under the hood), iOS or Safari or whatever would know which app to open (as the redirect URL is to the OIDC Idp, not the URL of my Web app).
Any hints where I could look for a solution? Thanks!
Topic:
Safari & Web
SubTopic:
General
Subject: Unexpected system confirmation dialog when opening a Universal Link
Description of the issue:
We’re implementing a login flow using Native iOS apps, Universal Links, and OpenID Connect authentication. Our domain is correctly configured with the apple-app-site-association file, and Universal Links work as expected.
However, under certain circumstances, the behavior differs on the same login page:
The user connects to the OIDC provider in their mobile browser.
Instead of automatically switching to the Native application, a popup asks the user to open the app.
The behavior depends on how the login page is opened:
When opened in a new browser tab, the Universal Link opens the app immediately without showing any system confirmation dialog.
When the same tab is reused without a page refresh, iOS displays a system confirmation dialog asking the user to open the link in the app. This confirmation dialog doesn’t appear in the first scenario.
This additional system dialog impacts the user experience, as we aim for a frictionless and seamless login flow with minimal confirmation steps.
Question: Why does the app switch work automatically only the first time?
Is this intentional iOS behavior? If so, what security requirement or system rule causes a confirmation dialog when reusing the same tab, but not when redirecting in a new tab or pressing a button on the reused tab? Is this expected design, or should we adjust our side to avoid this dialog?
Environment details:
Verified on two devices
iOS versions: 18.7.2, 26.1
Thanks for your help.
I am maintaining a PWA that utilizes WebSockets. In this app, after the web page is loaded from the server, JavaScript establishes a WebSocket connection.
Because the app connects to a completely local server on a managed local network, we use http:// and ws:// (non-secure).
The Issue: The app worked perfectly from older iOS versions up to iPadOS 18. However, during testing on iPadOS 26, we encountered an issue where the WebSocket connects successfully but is disconnected by the iPad approximately one second later.
According to our packet captures, the iPad is sending a FIN packet to initiate the teardown.
Additional Context: What makes this particularly confusing is that we have another server hosting the exact same PWA where the WebSocket connection stays stable even on iPadOS 26. This suggests it might not be a universal OS bug, but perhaps related to specific network conditions or a new security policy.
Has anyone experienced similar behavior on iPadOS 26?
Could this be a bug, or is there a new security restriction regarding non-secure WebSocket (ws://) connections in local networks?
Are there any known changes in WebKit/Safari for iPadOS 26 that might cause the OS to send a FIN packet immediately after a handshake?
I would appreciate any insights or suggestions on what might be causing this.
Topic:
Safari & Web
SubTopic:
General
Hi everyone,
I’m building a React Native iOS app where I’m integrating Wazo (native WebRTC) and Jitsi (WebView / WebRTC).
Use case:
Wazo is used to maintain a background call session (mainly signaling + audio keep-alive).
Jitsi is used in the foreground for video calls.
Problem:
When Jitsi starts, it takes control of the microphone and camera.
The Wazo call disconnects after ~5 minutes (likely due to media / audio session conflict).
Even if Wazo audio/video is muted or tracks are disabled, the session still drops.
My questions:
Is it officially supported or recommended to run two WebRTC stacks (Wazo + Jitsi) simultaneously on iOS?
Can Wazo stay connected without active audio/video tracks while Jitsi uses mic/camera?
Is there a way to release Wazo media streams temporarily (but keep signaling alive) while Jitsi is loading or active?
Are there any AVAudioSession / background mode limitations on iOS that make this impossible by design?
If this is not supported, what is the recommended architecture (single WebRTC pipeline, switching media ownership, etc.)?
Environment:
iOS (React Native)
Wazo SDK (native WebRTC)
Jitsi Meet (WebView)
CallKit + PushKit enabled
Any guidance, documentation, or real-world experience would be greatly appreciated.
Thanks in advance 🙏
I'm working on a web browser App that's distributed via the App Store. This app renders web pages using WKWebView.
Our users are requesting a way for us to allow them to play videos in Picture in Picture. After some investigation, we noticed that in order to allow PiP videos in our browser in the sandboxed environment, we need to add the com.apple.PIPAgent entitlement under the com.apple.security.temporary-exception.mach-lookup.global-name option.
We tried to submit our app with this entitlement, but unfortunately, we were rejected:
Guideline 2.4.50) - Performance
We've determined that one or more temporary entitlement exceptions requested for this app are not appropriate and will not be granted:
com.apple.security.temporary-exception.mach-lookup.global-name
com.apple.P|PAgent
We would like to have access to this entitlement so we can offer PiP to our users.
We already created a radar about this as well: FB13814428
Additionally, we have another radar (FB13557716) regarding allowing the usage of a private flag _allowsPictureInPictureMediaPlayback, which would also be required to enable us to use PiP.
Is there any way in which we can currently enable PiP? Would opening a TSI help here?
Hello,
I am implementing video calling on iOS and need to support Picture in Picture (PiP) behavior similar to FaceTime or WhatsApp.
What works
Audio continues correctly in background
CallKit UI works as expected
Video works correctly while the app is in the foreground
What I’m trying to achieve
When the user presses the Home button or switches apps, I want to show a system Picture in Picture window (floating video outside the app).
Current setup
Video is rendered via WebRTC
The video is displayed inside a WKWebView (HTML / JavaScript)
PiP works only while the app is foregrounded
When the app backgrounds, the video disappears (only audio remains)
Questions
Does iOS support system Picture in Picture for:
WebRTC video
WKWebView / HTML video
2 Is AVPictureInPictureController limited only to:
AVPlayerLayer
AVSampleBufferDisplayLayer
3 If PiP requires native rendering:
Is it mandatory to render WebRTC frames natively using AVSampleBufferDisplayLayer?
Is PiP explicitly unsupported for WebView / HTML video?
📌 Clarification
Apps like FaceTime and WhatsApp are able to show PiP outside the app.
I want to understand whether this behavior is achievable only with native video pipelines, or if WebView-based video is fundamentally restricted by iOS.
Any official clarification or documentation reference would be appreciated.
Thank you.
I’m currently developing an application using WKWebView.
After updating to iOS 26.2 Developer Beta, the following Web API started returning false:
isUserVerifyingPlatformAuthenticatorAvailable
MDN: https://developer.mozilla.org/ja/docs/Web/API/PublicKeyCredential/isUserVerifyingPlatformAuthenticatorAvailable_static
This issue did not occur on iOS 26.1 — it only happens on the beta version.
Has anyone else encountered this problem or is aware of any related changes?
OS: iOS 26.2 beta 3 (23C5044b)
The passkey authentication dialog appears, and after unlocking with Touch ID, the dialog closes without any notification of success or failure.
This issue occurs with high frequency.
access to the https://passkeys-demo.appspot.com/
register account and create passkey.
logoff
access to the url again
you can see the passkey dialog
unlock device then the dialog disappears
nothing happens
reload the page
proceed 5) to 6)
nothing happens or success webauthn.
Topic:
Safari & Web
SubTopic:
General
Tags:
WebKit JS
WebKit
Safari and Web
Passkeys in iCloud Keychain
Touch not working to close in-app close-ups since latest iOS 26 update
Topic:
Safari & Web
SubTopic:
General
I'm building a progressive web app (PWA) and came to the conclusion that almost nobody knows that this feature exists - Add to Home Screen. Not many people even understand what a PWA is or that you can add it to the home screen. This feels unnatural compared to installing an app from a store. Why do we make it so hard for users? Could we not make this easier by having the ability to call this installation or show an install notification?
Right now, when users visit a PWA on iOS, there's no way for developers to let them know they can install it. The "Add to Home Screen" option is tucked away in the Share menu, and most users never find it. I'd really like to be able to show them a friendly prompt.
Comparing to other browsers, this is possible via the beforeinstallprompt event. This would make a huge difference for user experience. Right now the only way is to show iOS users a separate set of instructions with screenshots, which feels clunky compared to what's possible on other platforms.
I'm curious - is there any reason why this hasn't been added to Safari yet? Other browsers have supported this for years now. Is there any progress being made on this, or is it being considered for the roadmap? It would be really helpful to know if this is something that will be worked on in the future.
I know there's a lot on the roadmap, but this would really help developers create better installation experiences for our users.
Thanks for considering this!
I am following up on Thread (https://developer.apple.com/forums/thread/733233). Currently, SFSafariExtensionManager.getStateOfSafariExtension only returns if an extension is enabled, but not if "Allow in Private Browsing" is toggled on.
Is there an API in macOS 26 and Safari 19 that allows a native Safari App Extension to detect this specific permission?
Cross posting from Spatial Computing, apologies if this is not the appropriate forum. The purpose is to create a simple web-based gallery of spatial photos and videos using static html files. I have successfully displayed spatial photos using the img tag and IMG.heic files. I can tap and hold the image to bring up the contextual menu and from there select View Spatial Photo. Is there any way to add a control to the image, like a link or overlay on the image itself, that a user can simply tap to show the image in 3D? And how to host a (small!) video file on a web page without going through a CDN/streaming service? Sample html would be much appreciated.
Hello,
After upgrading to macOS 26.2, I’ve noticed a significant performance regression when calling evaluateJavaScript in an iOS App running on Mac (WKWebView, Swift project).
Observed behavior
On macOS 26.2, the callback of evaluateJavaScript takes around 3 seconds to return.
This happens not only for:
evaluateJavaScript("navigator.userAgent")
but also for simple or even empty scripts, for example:
evaluateJavaScript("")
On previous macOS versions, the same calls typically returned in ~200 ms.
Additional testing
I created a new, empty Objective-C project with a WKWebView and tested the same evaluateJavaScript calls.
In the Objective-C project, the callback still returns in ~200 ms, even on macOS 26.2.
Question
Is this a known issue or regression related to:
iOS Apps on Mac,
Swift + WKWebView, or
behavioral changes in evaluateJavaScript on macOS 26.2?
Any information about known issues, internal changes, or recommended workarounds would be greatly appreciated.
Thank you.
Test Code Swift
class ViewController: UIViewController {
private var tmpWebView: WKWebView?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
setupUserAgent()
}
func setupUserAgent() {
let t1 = CACurrentMediaTime()
tmpWebView = WKWebView(frame: .zero)
tmpWebView?.isInspectable = true
tmpWebView?.evaluateJavaScript("navigator.userAgent") { [weak self] result, error in
let t2 = CACurrentMediaTime()
print("[getUserAgent] \(t2 - t1)s")
self?.tmpWebView = nil
}
}
}
Test Code Objective-C
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
NSTimeInterval startTime = [[NSDate date] timeIntervalSince1970];
WKWebView *webView = [[WKWebView alloc] init];
dispatch_async(dispatch_get_main_queue(), ^{
[webView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
NSTimeInterval endTime = [[NSDate date] timeIntervalSince1970];
NSLog(@"[getUserAgent]: %.2f s", (endTime - startTime));
}];
});
}
Description:
In our app, we have login page which displayed in WKWebView. In that page, there is an Remember my Device cookie option which user can select, so next time it OTP page will not be displayed.
Problem Statement:
Recently we found that some issue happened with this cookie. Especially, when users upgraded their OS versions to 18.6 or 26.1 or 26.2.
Need to understand, any changes related to Cookie part in latest OS Versions?
Topic:
Safari & Web
SubTopic:
General
When trying to login using apple account it shows me this error "Your request could not be completed because of an error. Please try again later." although in the inspector everything looks fine (200)
I coded two demo websites as follows (both written in NextJS):
Website 1: I coded an interval counter that increments every 1 second.
Website 2: I used the MediaRecorder API (described in the WebKit documentation: https://webkit.org/blog/11353/mediarecorder-api/).
In the ondataavailable function, I periodically send a blob (once every 1 second) to my server. In the backend, I coded a POST API to upload this blob.
I noticed that with website 1, the interval doesn't work when I run Safari in the background, even on iOS and iPadOS. However, website 2 works, meaning it still calls my API normally (I tried running Safari in the background for about 1-2 hours and it worked).
So, does this mean Apple allows native APIs like MediaRecorder and its callbacks to run in the background?
I’m encountering an issue on iOS when rendering a list using React.
Each list item uses the array index as the React key and consists of two parts:
a header section that uses position: sticky for dynamic sticking behavior, and
a body section whose height is automatically adjusted based on its content.
When the list data is updated, I sometimes observe that the sticky header content does not update visually in time, even though the underlying data and DOM have changed.
// demo.jsx
import React, { useState } from 'react';
import { Button } from '@iftide/mobile';
import './style2.less';
// import data1 from './data1.json';
// import data2 from './data2.json';
const prefixCls = 'im-detaillist';
const data1 = [
{
sectionTitle: '2025年05月'
},
{
sectionTitle: '2025年04月'
},
{
sectionTitle: '2025年03月'
}
];
const data2 = [
{
sectionTitle: '2023年08月'
},
{
sectionTitle: '2023年07月'
},
{
sectionTitle: '2023年06月'
},
{
sectionTitle: '2023年05月'
}
];
export default function App() {
const [list, setList] = useState(data1);
const [toggle, setToggle] = useState(true);
return (
<div>
<Button
title="更新2"
onClick={() => {
setToggle(!toggle);
setList(data2);
}}
/>
<div className={`${prefixCls}-container2`} style={{ height: `700px` }}>
{list.map((section: any, sectionIdx: number) => {
return (
<div
className={`${prefixCls}`}
key={String(sectionIdx)}
// id={section.sectionTitle}
>
<div className={`${prefixCls}-section-title`} role="text">
{section.sectionTitle}
</div>
<div
style={{
background: 'green',
height: `${Math.ceil(400 * Math.random()) + 50}px`
}}
>
省略
</div>
</div>
);
})}
</div>
</div>
);
}
.@{prefixCls}-section-title {
position: sticky;
position: -webkit-sticky;
will-change: transform;
top: 0;
z-index: 1;
padding-left: 11px;
width: 100%;
height: 30px;
font-size: var(--font-size-s);
font-weight: 400;
line-height: 30px;
color: #000000;
background-color: #F4F5F7;
letter-spacing: 0;
}
Please kindly improve the Safari browser side bar implementation further along with what The Browser Company has done with their Arc browser. Arc is about to retire soon too and they're willing to sell their SwiftUI code perhaps too for a decent pile of dollars, not the Jony Ive piles at least it should not.
The toggle for side bar is nice and works perfect though!
The crash is specific to iOS 26.2 prior versions working fine.
WKScriptMessageHandler delegate func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
Name attribute is accessible but WKScriptMessage body attribute causes crash
The object seems to be not accessible(not in memory)
self.webkit.configuration.userContentController.add(self, name: "sampleHandler")
self.webkit.load(request)
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.name) // works print(message.body) // crashes
}