Ios8 NSInputStream从不在iOS9上提供字节(经典蓝牙)

Ios8 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

我有一个跨平台(Xamrin)应用程序,它可以进行一些经典的蓝牙通信,并且在iOS8上运行得非常好。然而,在重新构建并在iOS9上运行它之后,我无法使NSInputStream的“HasBytesAvailable”=true。注:

我尝试将委托分配给InputStream并等待nsrunlop,但该流似乎没有可用的字节。该事件仅在输入流打开时触发(在iOS9上)(在iOS8上按预期触发)

以下是在iOS8(委托方法)上成功读取的代码片段:

其中Foo是一个类,它实现了:NSObject、INSStreamDelegate

    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。

所以我最终解决了它

我不完全确定最终的问题是什么,因为我做了几件事:

  • 更新至Xamarin测试流(5.9.7版本12)
  • 更新至最新的iOS(9.0.2)
  • 使用Xcode 7.0
  • 更改我调用代理的位置,打开流和时间表 对代码的更改是,我没有在接收和发送方法中分别处理打开、调度和委托分配,而是在同一个位置执行。也就是说,在创建地役权时,我分配了上述所有内容,如下所示:

            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();