如何在 iOS 6.1 上正确设置 GKSession(蓝牙)

2024-03-29

我在让 GKSession 工作时遇到问题。下面是我的代码,当按下特定按钮时执行。

GKSession *session;
if (connectButtonHasBeenPressed == false) {
    NSLog(@"connectToBluetoothDevice has been called");
    connectButtonHasBeenPressed = true;
    GKSession *session = [[GKSession alloc] initWithSessionID:@"Unicorn" displayName:nil sessionMode:GKSessionModePeer];
    [session setDataReceiveHandler:self withContext:nil];
    [session setDelegate:self];
    [session setAvailable:YES];
    NSLog(@"Session ID: %@", [session sessionID]);
    NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]);
    if ([session isAvailable]) {
        NSLog(@"The Session Is Available");
    }
    [connectToDeviceButton setTitle:@"Searching..." forState:UIControlStateNormal];

}
else {
    NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]);
}

第一次按下按钮后,一切似乎都工作正常。此后每次我按下按钮,它都会打印“当前可用的对等点:0”。如果我没有两个设备并排放置,并在按下按钮的情况下运行程序,这将是预期的输出。我还在此类中实现了所有 GKSessionDelegate 方法,这些方法都将消息记录到控制台。这些方法都没有运行过。所有这些都表明这些设备无法找到彼此。

但是,我已经运行了示例程序 GKRocket,它使用 GKSession 连接两个设备,并且它在这两个设备之间运行良好。我将 GKRocket 的代码与我的程序的代码进行了比较,没有发现任何我认为可能影响 GKSession 的差异。

有什么建议么?


您似乎有两个 GKSession 实例。一个在外面,另一个在里面if陈述。

这意味着如果connectButtonHasBeenPressed is false它将创建它自己保留的 GKSession 版本。但如果是true then session将等于nil.

我还建议使用nil作为会话 ID,然后使用捆绑包 ID 为您设置它。尽管这可能是个人喜好。

尝试使用这样的东西:

if (session == nil)
{
    NSLog(@"connectToBluetoothDevice has been called");
    session = [[GKSession alloc] initWithSessionID:nil displayName:nil sessionMode:GKSessionModePeer];
    [session setDataReceiveHandler:self withContext:nil];
    [session setDelegate:self];
    [session setAvailable:YES];

    NSLog(@"Session ID: %@", [session sessionID]);
    if ([session isAvailable])
    {
        NSLog(@"The Session Is Available");
    }
    [connectToDeviceButton setTitle:@"Searching..." forState:UIControlStateNormal];

    connectButtonHasBeenPressed = true;
}

NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]);

你真的不需要有一个connectButtonHasBeenPressed变量,因为您可以检查 GKSession 是否等于 nil,如果没有连接,它应该始终等于 nil。当您的会话结束时,您应该始终取消所有会话操作并设置session = nil;.

The session变量实际上应该在您的 .h 文件中声明,以便您可以在整个类中使用它。以便GKSession *session;不再需要。

Note:只是您的一张便条connectToBluetoothDevice has been called日志。根据我的经验,GKSession 将使用 WiFi 或蓝牙,具体取决于可用的情况。如此之多,以至于您可以拥有 3 台设备,其中 1 台仅开启蓝牙,1 台仅开启 WiFi,最后一台同时开启,它们都可以完美地相互连接和通话。

希望这可以帮助。

Edit:删除了不需要的connectButtonHasBeenPressed来自示例代码的变量并添加了更多解释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 iOS 6.1 上正确设置 GKSession(蓝牙) 的相关文章

随机推荐

  • 使导航控制器中的自定义后退按钮可点击区域更小

    我使用下面的代码创建了一个自定义后退按钮 但是可点击区域非常大 远远超出了图标本身 有谁知道如何设置可点击区域 或使其与图像大小相同 Thanks UIImage buttonImage UIImage imageNamed prefs U
  • Less 和 Bootstrap:如何使用 span3 (或 spanX [任意数字])类作为 mixin?

    是否可以添加span3类中的 mixin 以避免将其放入 HTML 中的每个元素中 就像是 myclass span3 other rules EDIT 抱歉 我忘记指定一个重要细节 span3是 Bootstrap 的标准类 我在Boot
  • HttpUrlConnection.getInputStream 在 Android 中返回空流

    我使用 HttpUrlConnection 向服务器发出 GET 请求 连接后 我收到响应代码 200 我收到回复消息 好的 我得到输入流 没有抛出异常 但是 在一个独立的程序中 我得到了响应的正文 如预期的那样 姓名 我的名字 生日 01
  • 将“observeEvent”输出传递给操作按钮

    我正在使用 R Shiny 会话中显示动态地图leaflet 我允许用户在一个区域周围绘制一个边界框 这会生成一个范围对象 我想将用户定义的边界框的结果传递给raster这将裁剪适当的区域 如边界框中所定义 并绘制输出 简而言之 结果是ob
  • 带有锚点 (#) 参数的 Django 重定向()

    我目前正在使用 Django 的 redirect 方法来构造要重定向到的 URL 我不想对 URL 进行硬编码 所以我一直这样做 return redirect main views home home slug slug 这让我想到了类
  • MATLAB 的“SIGMA 必须是对称且正定”错误有时没有意义

    我不确定这是一个编程问题还是统计问题 但我 99 确定应该存在一个数字问题 因此也许可以提出一个程序化的解决方案 我正在使用 MATLAB mvnpdf 函数来计算一些观测值的多元高斯 PDF 我经常收到 SIGMA 必须是对称且正定的 错
  • $_SERVER['QUERY_STRING'] 不按原样打印 unicode 值

    http localhost fw api fw api php rule unicode action create phrase 我访问上面的网址 在fw api php 当我回显 SERVER QUERY STRING 它没有给出 U
  • 使用 TensorFlow .pb 图作为 Keras 模型

    我使用内置 TensorFlow 工具来微调 InceptionV3 模型的最后一层 以便对自定义数据集上的项目进行分类本教程 https www tensorflow org tutorials image retraining 这会生成
  • 如何在不使用 API 的情况下向 Drupal 6.x 注册用户?

    我们必须有一个通过用 java 编写的 Web 服务可用的 注册 方法 因此从今往后我们无法访问 Drupal API 但我们需要能够成功注册用户 简单地将用户添加到用户表中是行不通的 因为新创建的用户永远无法成功登录 我再次喜欢 Drup
  • Apache 设置 000-default.conf 文件

    我确信这是一个简单的问题 我已经流浪了一台机器并设置了 LAMP IP 配置为 10 0 0 10 在我的 Windows 计算机中 我修改了主机文件并添加了一个名为 rsywx remote 的条目 从我的 Windows 机器到我的 v
  • R中的标准评估和非标准评估

    我对 dplyr 函数的参数感到困惑 并且不太清楚标准评估 SE 或非标准评估 NSE 我只想将变量传递给 dplyr arrange 但失败了 但是 传递给 dplyr select 是有效的 gt library dplyr gt li
  • width=device-width 在移动 IE 中不起作用

    我正在尝试制作一个在手机上运行良好的网站 到目前为止 我测试过的每部手机都运行良好 但装有 Windows Mobile IE 的手机除外 看来 Mobile IE 只是读取了并且没有将宽度设置为设备宽度 有人有这方面的经验或任何让网站在移
  • 使用 Django Rest Framework,如何上传文件并发送 JSON 有效负载?

    我正在尝试编写一个 Django Rest Framework API 处理程序 它可以接收文件以及 JSON 有效负载 我已将 MultiPartParser 设置为处理程序解析器 然而 我似乎无法两者兼得 如果我将有效负载与文件一起作为
  • Doxygen 注释的“使用命名空间”

    我的库的所有类都是在命名空间内定义的 当我为 Doxygen 创建主页时 我必须在注释中显式使用此命名空间以使 Doxygen 生成链接 我想对整个评论块使用类似 使用命名空间 的内容 一个例子 mainpage My Library Us
  • java.lang.IllegalStateException:getWritableDatabase 递归调用

    请帮我解决该错误 D AndroidRuntime 836 Shutting down VM W dalvikvm 836 threadid 1 thread exiting with uncaught exception group 0x
  • Vite - 静态文件不复制

    我有一个 Vue js 应用程序依赖于Vite https vitejs dev 在此应用程序中 我有两个静态文件需要复制到我的dist目录 favicon ico and manifest json My vite config js文件
  • Python MySQLdb 迭代表

    我有一个 SQL 数据库 我需要迭代表并在满足 WHERE 子句后执行操作 然后 一旦到达表的末尾 就返回到顶部并重新开始 目前我有 cursor database cursor cursor execute SELECT user id
  • 如何从特权容器访问docker主机文件系统

    不使用卷 v 我可以添加 privileged to docker run但我无法安装任意卷 因为我依赖另一个工具来创建 docker 容器 所以我的问题是如何完全访问 docker 主机文件系统 privileged true 够了吗 特
  • jQuery:如何检测元素是否未被单击?

    我想知道是否可以检测某个元素是否未被单击 这是我的代码 mpElement myFeature afterDo function This if else statement has to go inside when not clicke
  • 如何在 iOS 6.1 上正确设置 GKSession(蓝牙)

    我在让 GKSession 工作时遇到问题 下面是我的代码 当按下特定按钮时执行 GKSession session if connectButtonHasBeenPressed false NSLog connectToBluetooth