2016-10-18 66 views
-2

我正在使用Mac OSX應用程序,它可以充當Chrome本機消息傳遞主機應用程序。按照Native Message API標準,消息只能通過標準IO(stdin,stdout)在Chrome擴展程序和Mac應用程序之間共享。從Mac應用程序中讀取stdio

我試着用readLine()函數實現這個,可以從Swift 3.0中獲得,並且也嘗試了FileHandle的經典方法。

但是這些實現會在主線程中造成一些奇怪的問題。

任何人都可以請建議任何解決方案或參考鏈接?

+2

我認爲「任何人都可以請建議在(語言)STDIO做的解決方案」是「沒有研究」問題的金標準。 – Xan

+0

@Xan請爲我提供參考鏈接,如果有的話。我已經使用Mac命令行工具完成了這一工作,但是使用OSX應用程序時,遇到了一些線程問題。 – itZme

+3

我不得不承認我沒有,因爲我從未碰過Obj-C或Swift。但是,如果您已經嘗試過並且無法正常工作,那麼您絕對應該提及,或者更好 - 顯示您嘗試做的和研究的內容。 – Xan

回答

0

NSFileHandle是文件描述符的包裝器,它是解決方案。您可以使用文件句柄對象來訪問與文件,套接字,管道和設備關聯的數據。對於文件,您可以在文件中讀取,寫入和查找。

DispatchQueue.global(qos: .background).async { 
     let input = FileHandle.standardInput 
     var aStr : String! 
     while true { 
      //Read first 4 bytes to get message length details(As per NativeMessagingAPI protocol) 
      let lengthDetails = input.readData(ofLength:4) 
      let length = lengthDetails.withUnsafeBytes { (ptr: UnsafePointer<Int32>) -> Int32 in 
       return ptr.pointee 
      } 
      let data = input.readData(ofLength:Int(length))//input.availableData 
      if (data.count > 0) { 
       var aStr = String(data:data, encoding:String.Encoding.utf8) 
       if (aStr != nil) { 
        DispatchQueue.main.async { 
         //Handle data logic here 
        } 
       } 
      } 
     } 

    } 
相關問題