2016-10-18 38 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 
        } 
       } 
      } 
     } 

    } 
相关问题