). Мне нужно обнаружить, когда сообщение удаляется в веб -интерфейсе WhatsApp, и обрабатывать событие в моем приложении, используя wkscriptmessagehandler . Тем не менее, событие Mossedeleted не запускается, когда сообщение удаляется в WhatsApp Web UI. Код>: < /p>
extension WhatsWebVC: WKScriptMessageHandler {
@objc func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
guard let body = message.body as? [String: Any],
let type = body["type"] as? String,
let data = body["data"] as? [String: Any] else { return }
switch type {
case "messageDeleted":
handleDeletedMessage(data) // This function is not being called
case "mediaMessage":
handleMediaMessage(data)
case "wsReceive":
handleWebSocketMessage(data)
case "wsSend":
print("Outgoing WS message:", data)
default:
print("Unknown message type received:", type)
}
}
}
Во внедрении JavaScript в WebView я отслеживаю удаление сообщения с помощью MutationObserver в контейнере веб-чата WhatsApp. Когда сообщение удаляется, я отправляю событие messageDeleted обратно в приложение iOS с помощью window.webkit.messageHandlers.messageObserver.postMessage().
Вот Код JavaScript, который я добавляю в WhatsApp Web:
(function() {
let messageCache = new Map();
function extractMessageContent(element) {
let messageContainer = element.querySelector('[data-pre-plain-text]');
let messageText = element.querySelector('.selectable-text');
let mediaContainer = element.querySelector('.media-container');
let timestampElement = element.querySelector('div[data-pre-plain-text]');
let timestamp = '';
let sender = '';
let mediaUrl = '';
let mediaName = '';
if (timestampElement) {
let preText = timestampElement.getAttribute('data-pre-plain-text');
if (preText) {
let matches = preText.match(/\\[(.*?)\\].*?([^:]+):/);
if (matches) {
timestamp = matches[1];
sender = matches[2].trim();
}
}
}
if (mediaContainer) {
let mediaElement = mediaContainer.querySelector('img, video');
if (mediaElement) {
mediaUrl = mediaElement.src;
mediaName = mediaElement.alt || mediaElement.src.split('/').pop();
}
}
return {
id: element.getAttribute('data-id'),
text: messageText ? messageText.innerText : '',
sender: sender,
timestamp: timestamp,
hasMedia: !!mediaContainer,
mediaUrl: mediaUrl,
mediaName: mediaName
};
}
const messageObserver = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === 'childList') {
mutation.removedNodes.forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE) {
let messageElement = node.querySelector('[data-id]');
if (messageElement) {
let messageId = messageElement.getAttribute('data-id');
window.webkit.messageHandlers.messageObserver.postMessage({
type: 'messageDeleted',
data: extractMessageContent(messageElement)
});
}
}
});
}
});
});
function observeChat() {
const chatContainer = document.querySelector('#main div.copyable-area');
if (chatContainer) {
messageObserver.observe(chatContainer, {
childList: true,
subtree: true
});
} else {
setTimeout(observeChat, 1000);
}
}
function initObserver() {
if (document.querySelector('#app')) {
observeChat();
} else {
setTimeout(initObserver, 1000);
}
}
initObserver();
})();
В этом коде JavaScript:
MutationObserver прослушивает изменения в контейнере чата и специально проверяет когда сообщения удаляются.
Если сообщение удалено, я вызываю window.webkit.messageHandlers.messageObserver.postMessage(), чтобы уведомить приложение о сообщении messageDeleted тип и соответствующие данные сообщения.
Что я пробовал:
Убедитесь, что JavaScript добавлен: я подтвердил, что JavaScript правильно внедрен в WKWebView. Наблюдатель срабатывает, когда элементы удаляются из DOM, но сообщение messageDeleted никогда не достигает метода userContentController(_:didReceive:) в приложении iOS.
Тип сообщения и данные: я добавил в приложение операторы печати для регистрации входящих сообщений, но случай «messageDeleted» не срабатывает, хотя WebView правильно выполнение JavaScript.
Конфигурация WebView: я гарантирую, что WKUserContentController WebView правильно настроен для обрабатывать сообщения:
let userContentController = WKUserContentController()
userContentController.add(self, name: "messageObserver")
let config = WKWebViewConfiguration()
config.userContentController = userContentController
let webView = WKWebView(frame: .zero, configuration: config)
Внедренный JavaScript: я дважды проверил, что JavaScript выполняется правильно и что функция postMessage вызывается с ожидаемыми данными.
Вопрос:
Почему messageDeleted случай не вызывается? Есть ли какие-либо проблемы с взаимодействием JavaScript с приложением iOS или с тем, как я настроил обработчик сообщений в WKWebView? Что может быть причиной этой проблемы и как ее исправить? Будем очень признательны за любые предложения!
Я разрабатываю приложение для iOS, которое использует WKWebView для отображения [b]WhatsApp Web[/b] ([code]https://web.whatsapp.com[/code]). Мне нужно обнаружить, когда сообщение удаляется в веб -интерфейсе WhatsApp, и обрабатывать событие в моем приложении, используя wkscriptmessagehandler . Тем не менее, событие Mossedeleted не запускается, когда сообщение удаляется в WhatsApp Web UI. Код>: < /p> [code]extension WhatsWebVC: WKScriptMessageHandler { @objc func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { guard let body = message.body as? [String: Any], let type = body["type"] as? String, let data = body["data"] as? [String: Any] else { return }
switch type { case "messageDeleted": handleDeletedMessage(data) // This function is not being called case "mediaMessage": handleMediaMessage(data) case "wsReceive": handleWebSocketMessage(data) case "wsSend": print("Outgoing WS message:", data) default: print("Unknown message type received:", type) } } } [/code] Во внедрении JavaScript в WebView я отслеживаю удаление сообщения с помощью MutationObserver в контейнере веб-чата WhatsApp. Когда сообщение удаляется, я отправляю событие messageDeleted обратно в приложение iOS с помощью window.webkit.messageHandlers.messageObserver.postMessage(). Вот Код JavaScript, который я добавляю в WhatsApp Web: [code](function() { let messageCache = new Map(); function extractMessageContent(element) { let messageContainer = element.querySelector('[data-pre-plain-text]'); let messageText = element.querySelector('.selectable-text'); let mediaContainer = element.querySelector('.media-container'); let timestampElement = element.querySelector('div[data-pre-plain-text]'); let timestamp = ''; let sender = ''; let mediaUrl = ''; let mediaName = '';
if (timestampElement) { let preText = timestampElement.getAttribute('data-pre-plain-text'); if (preText) { let matches = preText.match(/\\[(.*?)\\].*?([^:]+):/); if (matches) { timestamp = matches[1]; sender = matches[2].trim(); } } } if (mediaContainer) { let mediaElement = mediaContainer.querySelector('img, video'); if (mediaElement) { mediaUrl = mediaElement.src; mediaName = mediaElement.alt || mediaElement.src.split('/').pop(); } } return { id: element.getAttribute('data-id'), text: messageText ? messageText.innerText : '', sender: sender, timestamp: timestamp, hasMedia: !!mediaContainer, mediaUrl: mediaUrl, mediaName: mediaName }; }
const messageObserver = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'childList') { mutation.removedNodes.forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE) { let messageElement = node.querySelector('[data-id]'); if (messageElement) { let messageId = messageElement.getAttribute('data-id'); window.webkit.messageHandlers.messageObserver.postMessage({ type: 'messageDeleted', data: extractMessageContent(messageElement) }); } } }); } }); });
function initObserver() { if (document.querySelector('#app')) { observeChat(); } else { setTimeout(initObserver, 1000); } }
initObserver(); })(); [/code] В этом коде JavaScript: [list] [*]MutationObserver прослушивает изменения в контейнере чата и специально проверяет когда сообщения удаляются. [*]Если сообщение удалено, я вызываю window.webkit.messageHandlers.messageObserver.postMessage(), чтобы уведомить приложение о сообщении messageDeleted тип и соответствующие данные сообщения. [/list] Что я пробовал: [list] [*] [b]Убедитесь, что JavaScript добавлен[/b]: я подтвердил, что JavaScript правильно внедрен в WKWebView. Наблюдатель срабатывает, когда элементы удаляются из DOM, но сообщение messageDeleted никогда не достигает метода userContentController(_:didReceive:) в приложении iOS.
[b]Тип сообщения и данные[/b]: я добавил в приложение операторы печати для регистрации входящих сообщений, но случай «messageDeleted» не срабатывает, хотя WebView правильно выполнение JavaScript.
[*][b]Конфигурация WebView[/b]: я гарантирую, что WKUserContentController WebView правильно настроен для обрабатывать сообщения: [code]let userContentController = WKUserContentController() userContentController.add(self, name: "messageObserver") let config = WKWebViewConfiguration() config.userContentController = userContentController let webView = WKWebView(frame: .zero, configuration: config) [/code]
[*][b]Внедренный JavaScript[/b]: я дважды проверил, что JavaScript выполняется правильно и что функция postMessage вызывается с ожидаемыми данными.
[/list] Вопрос: Почему messageDeleted случай не вызывается? Есть ли какие-либо проблемы с взаимодействием JavaScript с приложением iOS или с тем, как я настроил обработчик сообщений в WKWebView? Что может быть причиной этой проблемы и как ее исправить? Будем очень признательны за любые предложения!