Ios8 NSInputStream从不在iOS9上提供字节(经典蓝牙)
我有一个跨平台(Xamrin)应用程序,它可以进行一些经典的蓝牙通信,并且在iOS8上运行得非常好。然而,在重新构建并在iOS9上运行它之后,我无法使NSInputStream的“HasBytesAvailable”=true。注: 我尝试将委托分配给InputStream并等待nsrunlop,但该流似乎没有可用的字节。该事件仅在输入流打开时触发(在iOS9上)(在iOS8上按预期触发) 以下是在iOS8(委托方法)上成功读取的代码片段: 其中Foo是一个类,它实现了:NSObject、INSStreamDelegateIos8 NSInputStream从不在iOS9上提供字节(经典蓝牙),ios8,bluetooth,xamarin,xamarin.ios,ios9,Ios8,Bluetooth,Xamarin,Xamarin.ios,Ios9,我有一个跨平台(Xamrin)应用程序,它可以进行一些经典的蓝牙通信,并且在iOS8上运行得非常好。然而,在重新构建并在iOS9上运行它之后,我无法使NSInputStream的“HasBytesAvailable”=true。注: 我尝试将委托分配给InputStream并等待nsrunlop,但该流似乎没有可用的字节。该事件仅在输入流打开时触发(在iOS9上)(在iOS8上按预期触发) 以下是在iOS8(委托方法)上成功读取的代码片段: 其中Foo是一个类,它实现了:NSObject、INS
public class Foo :NSObject, INSStreamDelegate
{
[Export("stream:handleEvent:")]
public void HandleEvent(Foundation.NSStream theStream, Foundation.NSStreamEvent streamEvent)
{
//Code to read bytes here
}
为了确保确实有字节发送到iPhone5,我修改了外部蓝牙设备,只回显接收到的任何字节
在iOS8上使用任何一种方法(委托或等待nsrunlop),回显都会立即到达。但是,当我将目标设备更改为iOS9时,我可以永远等待,HasBytesAvailable将始终为false
我甚至尝试过阅读,尽管HasBytesAvailable是错误的,但什么都没读(我想这没什么大不了的惊喜)
此外,我尝试使用Xcode6.4和Xcode7进行构建,结果相同
目前我没有主意,所以任何帮助都将不胜感激
提前谢谢
编辑:
我联系了Xamarin,我正在为他们编写一个测试应用程序,以测试这是苹果问题还是Xamarin问题
另外,请参阅中关于蓝牙的评论。。。也许有关系 我可以通过打开一个输入流到我无意使用的EAAccessory来解决这个问题。我的猜测是,作为新的iOS9蓝牙协议的一部分,输入和输出流都是必需的。这是我的工作代码的相关更新:
accessory.Delegate = new EAAccessoryDelegateHandler ();
if (PrinterSession == null)
{
PrinterSession = new EASession (accessory, PrintProtocol);
}
var mysession = PrinterSession;
mysession.InputStream.Open();
mysession.OutputStream.Delegate = this;
mysession.OutputStream.Schedule (NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);
mysession.OutputStream.Open ();
然后,当我关闭OutputStream时,我会立即关闭未使用的InputStream。所以我最终解决了它 我不完全确定最终的问题是什么,因为我做了几件事:
s = new EASession(device, protocol);
output_stream = s.OutputStream;
input_stream = s.InputStream;
output_stream.Delegate=this;
output_stream.Schedule(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);
output_stream.Open();
input_stream.Delegate = this;
input_stream.Schedule(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);
input_stream.Open();
目前,我并不是在计划输入和输出流,我也不确定这样做是否正确。我将尝试在我从工作转移到一个好看的代码时保持更新
与Bluecode所描述的不同,我确实需要使用输入流,而且我总是打开它;所以我不确定这是否是同一个问题。我仍然不确定这个问题的解决方案是什么,因为它可以是上述的一个或组合。当我有更多的时间来看看哪一个是唯一的解决方案时,我可能会在以后对此进行更多的实验?如果有的话
希望这对任何人都有帮助。
干杯感谢分享您的解决方案!
s = new EASession(device, protocol);
output_stream = s.OutputStream;
input_stream = s.InputStream;
output_stream.Delegate=this;
output_stream.Schedule(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);
output_stream.Open();
input_stream.Delegate = this;
input_stream.Schedule(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);
input_stream.Open();