Messagedeleted` nicht aufgerufen, wenn eine Nachricht im WhatsApp -Web gelöscht wird (über `wkScriptMessageHandler`)IOS

Programmierung für iOS
Guest
 Messagedeleted` nicht aufgerufen, wenn eine Nachricht im WhatsApp -Web gelöscht wird (über `wkScriptMessageHandler`)

Post by Guest »

Ich entwickle eine iOS -App, die ein WKWebView verwendet, um WhatsApp Web anzuzeigen (

Code: Select all

https://web.whatsapp.com
). Ich muss erkennen, wann eine Nachricht in der WhatsApp -Weboberfläche gelöscht wird, und das Ereignis in meiner App mithilfe der WKScriptMessageHandler verarbeiten. Das Ereignis mit Messagedeleted wird jedoch nicht ausgelöst, wenn eine Nachricht in der WhatsApp -Web -UI gelöscht wird. Code>: < /p>

Code: Select all

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)
}
}
}
In der JavaScript -Injektion meiner WebView überwache ich, wenn eine Nachricht mit einem MutationObserver im WhatsApp -Web -Chat -Container gelöscht wird. Wenn eine Nachricht gelöscht wird, sende ich das Ereignis von Messagedeleted mit window.webkit.messageHandlers.MessageObserver.postmessage () .
Hier sind die JavaScript-Code, den ich in WhatsApp-Web inject eingreift: < /p>

Code: Select all

(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();
})();
In diesem JavaScript-Code:
  • Ein MutationObserver lauscht auf Änderungen im Chat-Container und prüft gezielt wenn Nachrichten entfernt werden.
  • Wenn eine Nachricht gelöscht wird, rufe ich window.webkit.messageHandlers.messageObserver.postMessage() auf, um die App mit der Nachricht „messageDeleted“ zu benachrichtigen Geben Sie den Typ und die entsprechende Meldung ein Daten.
Was ich versucht habe:

[*]Stellen Sie sicher, dass das JavaScript injiziert wird: Ich habe bestätigt, dass das JavaScript ordnungsgemäß in die WKWebView injiziert wird. Der Beobachter löst aus, wenn Elemente aus dem DOM entfernt werden, aber die messageDeleted-Nachricht erreicht nie die Methode userContentController(_:didReceive:) in der iOS-App.

Nachrichtentyp und -daten: Ich habe in der App Druckanweisungen hinzugefügt, um eingehende Nachrichten zu protokollieren, aber der Fall „messageDeleted“ wird nicht ausgelöst, obwohl die WebView führt das korrekt aus JavaScript.

[*]WebView-Konfiguration: Ich stelle sicher, dass der WKUserContentController des WebView ordnungsgemäß für die Verarbeitung von Nachrichten konfiguriert ist :

Code: Select all

let userContentController = WKUserContentController()
userContentController.add(self, name: "messageObserver")
let config = WKWebViewConfiguration()
config.userContentController = userContentController
let webView = WKWebView(frame: .zero, configuration: config)
Injizierte JavaScript : Ich habe doppelt überprüft, dass das JavaScript korrekt ausgeführt wird und dass die Postmessage Funktion wird mit den erwarteten Daten aufgerufen. Messagedeleted Fall nicht angerufen? Gibt es Probleme damit, wie das JavaScript mit der iOS -App kommuniziert oder wie ich den Nachrichtenhandler in WKWebView eingerichtet habe? Was könnte dieses Problem verursachen und wie kann ich es beheben? Alle Vorschläge wären sehr geschätzt!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post