昨天,我为我的iPhone应用程序编写了一个简单的蓝牙网络。今天早上,当我试图继续开发时,它根本没有在我的iPod Touch 2G上工作。然而,它在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发送的数据。
有人可以就这里可能发生的事情提出任何建议吗?我的智慧结束了。
答案 0 :(得分:3)
是的,在完成了这个该死的一天,有一百万个死胡同之后,我终于发现了罪魁祸首。我的'ping'例程。我猜大多数人都知道,网络会话需要接收常规数据,否则会超时并自行关闭。为了防止这种情况发生,我设置了一个简单的例程,每10秒向所有对等体发送一小段数据(4个字节)。问题?如果没有连接对等体,使用[GKSession SendDataToAllPeers:withDataMode:error:]方法将导致您的服务器正确地进行操作。由于某种原因,省略了检查是否有人连接的重要检查。我通过在我的ping例程中放置一个简单的谓词来解决这个问题,如下所示:
if ([[network peersWithConnectionState:GKPeerStateConnected] count] > 0) {ping code here}
再一次它正在发挥作用。我不能为我的生活记住之前发生的这个问题,或者为什么它不应该发生在运行在早期操作系统上的iPad上。我只能猜测一些后来的更新导致了这个问题。无论如何,现在一切都已修复,虽然我的程序远非防水,但我至少可以集中精力让其余的工作。
-Ash
答案 1 :(得分:1)
您应该做的另一件事是:在应用程序终止之前关闭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;
}
根据我的经验,这足以解决这个问题。
答案 2 :(得分:0)
我遇到了同样的问题。
前两行表示蓝牙不可用,但第三行表示可用性发生变化。虽然没有记录,但这实际上是说蓝牙正在变为可用。
所以基本上这个日志消息是一个巨大的分心,应该被忽略。