Код: Выделить всё
https://web.whatsapp.com). Мне нужно определить, когда сообщение удаляется в веб-интерфейсе WhatsApp, и обработать это событие в моем приложении с помощью WKScriptMessageHandlerВот соответствующий код, в котором я обрабатываю сообщения в WKScriptMessageHandler код>:
Код: Выделить всё
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, который я добавляю в 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();
})();
- 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? Что может быть причиной этой проблемы и как ее исправить? Будем очень признательны за любые предложения!
Подробнее здесь: https://stackoverflow.com/questions/793 ... -via-wkscr
Мобильная версия