代码之家  ›  专栏  ›  技术社区  ›  Ash

蓝牙不可用-请稍后再试

  •  4
  • Ash  · 技术社区  · 14 年前

    昨天,我为我的iPhone应用程序编程了一个简单的蓝牙网络。今天早上,当我试图继续开发时,它突然对我的ipodtouch2g根本不起作用。不过,它在iPAD上运行正常。当我在iPod上创建了一个服务器会话,尝试将GKSession对象的可用性设置为YES时,问题就出现了。控制台接收以下信息:

    2010-10-05 14:28:55.762 Clusters[67:307] BTM: attaching to BTServer
    2010-10-05 14:28:55.786 Clusters[67:307] <<< Session >>> +[GKBluetoothSupport _determineBluetoothStatus]: BT not available - try again later.
    2010-10-05 14:28:55.862 Clusters[67:307] BTM: posting notification BluetoothAvailabilityChangedNotification
    

    现在,我知道蓝牙已经打开了,而且我知道它正在工作,因为我下载了一个免费的蓝牙传输应用程序来测试它。我重置了iPod,清理了目标,戳了戳代码的各个部分,但我就是不明白为什么这个应用程序不能创建一个蓝牙服务器。它可以创建蓝牙 很好,因为这个应用程序可以很好地接收iPad发送的数据。

    有人能对这里可能发生的事情提出什么建议吗?我束手无策。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Ash    14 年前

    是的,在花了一整天的时间研究这件事之后,我终于找到了罪魁祸首。我的“ping”程序。我想大多数人都知道,网络会话需要接收常规数据,否则就会超时并自行关闭。为了防止这种情况发生,我设置了一个简单的例程,每10秒向所有对等方发送一个小数据包(4字节)。有什么问题吗?使用[GKSession SendDataToAllPeers:withDataMode:error:]方法将导致服务器在没有连接对等机的情况下出现错误。出于某种原因,关键的检查,看看是否有人在所有连接被省略。我通过在ping例程中放置一个简单的谓词来解决这个问题,如下所示:

    if ([[network peersWithConnectionState:GKPeerStateConnected] count] > 0) {ping code here}
    

    它又一次起作用了。我一辈子都记不清这个问题以前发生过,也记不清为什么它不应该发生在运行早期操作系统的iPad上。我只能猜测是后来的更新导致了这个问题。不管怎么说,现在都修好了,虽然我的程序还远没有完善,但至少现在我可以集中精力让它的其余部分正常工作了。

        2
  •  1
  •   Pedro Andrade    13 年前

    您还应该做另一件事:在应用程序终止之前关闭GKSession。您的代码可以是这样的:

    // YourAppDelegate.m
    - (void)applicationWillTerminate:(UIApplication *)application
    {
      [[Business sharedInstance] shutdownBluetooth];
    }
    
    // Business.m
    // considering that you have a GKSession instance on 'session' variable
    - (void)shutdownBluetooth {
      [self.session disconnectFromAllPeers];
      self.session.available = NO;
      [self.session setDataReceiveHandler:nil withContext:nil];
      self.session.delegate = nil;
      self.session = nil;
    }
    

    以我的经验,这足以解决这个问题。

        3
  •  0
  •   Curmudgeonlybumbly    13 年前

    我也有同样的问题。

    所以基本上这个日志信息是一个巨大的干扰,应该被忽略。