我正在嘗試使用本機訊息從瀏覽器擴展中呼叫用 Objective C 撰寫的 MacOS 應用程式。
到目前為止,我已經提出了處理使用chrome.runtime.sendNativeMessage 發出的請求的代碼。
int main(int argc, char * argv[]) {
@autoreleasepool {
NSFileHandle *stdIn = [NSFileHandle fileHandleWithStandardInput];
NSError * stdinError = nil;
NSData * rawReqLen = [stdIn readDataUpToLength:4 error:&stdinError];
if(rawReqLen == nil || stdinError != nil) return 1;
NSUInteger reqLen;
[rawReqLen getBytes:&reqLen length:4];
NSData * req = [stdIn readDataUpToLength:reqLen error:&stdinError];
if(stdinError != nil) return 1;
handleRequest(req); // this does something depending on the received request
return 0;
}
}
這是有效的。
我需要幫助弄清楚如何使用chrome.connectNative來保持連接打開。具體來說,我的問題是讓 MacOS 應用程式繼續偵聽傳入訊息,直到通過從瀏覽器擴展呼叫 port.disconnect 關閉埠。
我試過這段代碼不起作用。
int main(int argc, char * argv[]) {
@autoreleasepool {
NSFileHandle *stdIn = [NSFileHandle fileHandleWithStandardInput];
[[NSNotificationCenter defaultCenter] addObserverForName:NSFileHandleDataAvailableNotification
object:stdIn
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
NSError * stdinError = nil;
NSData * rawReqLen = [stdIn readDataUpToLength:4 error:&stdinError];
if(rawReqLen == nil || stdinError != nil) exit(1);
NSUInteger reqLen;
[rawReqLen getBytes:&reqLen length:4];
NSData * req = [stdIn readDataUpToLength:reqLen error:&stdinError];
if(stdinError != nil) exit(1);
handleRequest(req);
}];
[stdIn waitForDataInBackgroundAndNotify];
}
}
有人知道如何實作這一目標嗎?
uj5u.com熱心網友回復:
解決辦法是:
int main(int argc, char * argv[]) {
@autoreleasepool {
NSFileHandle *stdIn = [NSFileHandle fileHandleWithStandardInput];
[[NSNotificationCenter defaultCenter] addObserverForName:NSFileHandleDataAvailableNotification
object:stdIn
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
NSError * stdinError = nil;
NSData * rawReqLen = [stdIn readDataUpToLength:4 error:&stdinError];
if(rawReqLen == nil || stdinError != nil) exit(1);
uint32_t reqLen;
[rawReqLen getBytes:&reqLen length:4];
reqLen = OSSwapLittleToHostInt32(reqLen);
NSData * req = [stdIn readDataUpToLength:reqLen error:&stdinError];
if(stdinError != nil) exit(1);
handleRequest(req);
[stdIn waitForDataInBackgroundAndNotify];
}];
[stdIn waitForDataInBackgroundAndNotify];
}
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop acceptInputForMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
[loop run];
return 0;
}
呼叫exit(1)也可以通過一個新的呼叫更換[stdIn waitForDataInBackgroundAndNotify];,如果你想保留,而不是打開的埠。
這可以很好地處理傳入的請求,但會中斷回應:寫入 stdout 不再起作用,我可能需要停止每個回應的運行回圈并在完成后重新啟動它。(尚未測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362426.html
