Моя цель проста: когда пользователь нажимает кнопку во всплывающем окне расширения Safari, я хочу отправить сообщение (например, текущую метку времени) на Apple Watch.
Настройка:
- iOS 26.2 / Xcode 26.2
- Цель 1: Основное приложение iOS (успешно активирует WCSession).
- Цель 2: Веб-расширение Safari (манифест V3, с использованием SafariWebExtensionHandler).
- Цель 3: Приложение Watch.
Хотя WatchConnectivity отлично работает из основного приложения iOS, при вызове из SafariWebExtensionHandler он сразу же завершается сбоем. Похоже, что процесс расширения изолирован таким образом, что не позволяет ему подключиться к демону Watch Connectivity Daemon (com.apple.wcd).
Триггер (JavaScript):
Логика Swift запускается через встроенный обмен сообщениями из всплывающего окна расширения (popup.js), когда пользователь нажимает кнопку. У меня включено разрешение «nativeMessaging» в моем манифесте.
Код: Выделить всё
// popup.js
browser.runtime.sendNativeMessage({ message: "sendTime" }, function(response) {
console.log("Response from Swift:", response);
});
Я использую Singleton для управления сеансом, чтобы избежать состояний гонки в течение короткого жизненного цикла расширения.
Код: Выделить всё
import SafariServices
import WatchConnectivity
import os.log
class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling, WCSessionDelegate {
func beginRequest(with context: NSExtensionContext) {
// ... extracting message from JS ...
if WCSession.isSupported() {
let session = WCSession.default
session.delegate = self
session.activate() //
Подробнее здесь: [url]https://stackoverflow.com/questions/79865762/ios-safari-web-extension-communication-with-apple-watch-app-fails[/url]
Мобильная версия