- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序使用 GKSession 和 GKSessionModePeer。它必须处理任意连接和断开连接的点,因为这是一个长时间运行的应用程序,用户应该能够进入后台并稍后返回。这在大多数情况下都很好用。但有时,当对等点断开连接时,其他设备会收到 didChangeState:GKPeerStateDisconnected 通知,不仅是真正断开连接的设备,还有其他实际上仍处于连接状态的设备。
我可以使用下面的代码和 4 台设备(全部在 iOS 5 上)重现此行为。当一切按预期进行时,当设备 A 退出应用程序时,所有其他设备都会收到通知,并且这些设备上的日志输出为:
服务:didChangeState:peer A 断开连接 (12345)
但过了一段时间,当一个设备断开连接时(再说一次 A),其他设备将获得未断开连接的设备的额外回调。例如,设备 C 将获得:
Service: didChangeState: peer A disconnected (...)//expected
Service: didChangeState: peer B disconnected (...)//never disconnected
大约在同一时间,我有时会在断开连接的设备的日志中看到此类消息,不清楚它们是否真的相关:
dnssd_clientstub 使用 NULL DNSServiceRef 调用 DNSServiceRefDeallocate
和/或
dnssd_clientstub 使用没有 ProcessReply 函数的 DNSServiceRef 调用 DNSServiceProcessResult
一旦发生这种情况,GKSession 似乎处于不良状态并且不再正确处理连接和断开连接。为了恢复到良好状态,我必须在所有设备上强行终止该应用程序,稍等片刻,然后重新开始。
在进入后台时,我尝试了多种处理 GKSession 的方法(仅设置 available=NO 并且不断开连接,根本不做任何事情),但没有一种方法效果更好。
有没有其他人遇到过这种行为(并解决了)?
AppDelegate 中的简单重现案例(使用 arc):
- (void)startGKSession
{
self.gkSession = [[GKSession alloc] initWithSessionID:nil displayName:nil sessionMode:GKSessionModePeer];
gkSession.disconnectTimeout = 10;
gkSession.delegate = self;
gkSession.available = YES;
}
- (void)shutdownGKSession
{
gkSession.available = NO;
[gkSession disconnectFromAllPeers];
gkSession.delegate = nil;
gkSession = nil;
[self.connectedDevices removeAllObjects];
}
- (void)connectToPeer:(NSString *)peerId
{
[gkSession connectToPeer:peerId withTimeout:10];
}
- (void)session:(GKSession *)session peer:(NSString *)peerId didChangeState:(GKPeerConnectionState)state
{
switch (state) {
case GKPeerStateAvailable:
NSLog(@"Service: didChangeState: peer %@ available, connecting (%@)", [session displayNameForPeer:peerId], peerId);
[self performSelector:@selector(connectToPeer:) withObject:peerId afterDelay:.5];
break;
case GKPeerStateUnavailable:
NSLog(@"Service: didChangeState: peer %@ unavailable (%@)", [session displayNameForPeer:peerId], peerId);
break;
case GKPeerStateConnected:
NSLog(@"Service: didChangeState: peer %@ connected (%@)", [session displayNameForPeer:peerId], peerId);
break;
case GKPeerStateDisconnected:
NSLog(@"Service: didChangeState: peer %@ disconnected (%@)", [session displayNameForPeer:peerId], peerId);
break;
case GKPeerStateConnecting:
NSLog(@"Service: didChangeState: peer %@ connecting (%@)", [session displayNameForPeer:peerId], peerId);
break;
}
}
- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID
{
[session acceptConnectionFromPeer:peerID error:nil];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.connectedDevices = [[NSMutableArray alloc] init];
[self startGKSession];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self shutdownGKSession];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[self startGKSession];
}
@end
最佳答案
我从 Apple 支持人员那里听说,这种断开连接行为的发生是因为设备“通过”彼此连接。例如,设备 A 通过设备 B 连接到设备 C。如果设备 B 掉线,设备 A 会看到设备 C 断开并立即重新连接。我还没有听说这个问题是否/何时会得到解决。
关于iphone - GKSession peer disconnect 导致其他 peers 看起来断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8378169/
来历及功能 peer.exe进程程序文件是由北京光芒时代国际传媒网络技术有限公司为其在飞速网发布的PC客户端:RaySource程序的一个组成部分。被描述为“Grid Service”,其功能主要
希望你们一切都好 我是 webRTC 的初学者,如果我的问题感觉像菜鸟,我很抱歉,但我想知道是否有任何正确的方法来关闭对等点之间的连接,尤其是使用 simple-peer.js,期待您的精彩回复 这是
我在使用 Windows 8 商店应用程序时遇到了一些问题。我的问题很简单: 我在一台电脑上有一个 Windows 8 商店应用程序,在另一台电脑上有相同的应用程序。个人电脑不在同一个网络中,但有互联
我正在从事一个尝试设置 PayPal 点对点支付的项目。然而,自适应支付 API 似乎是当前 PayPal API 的一个非常旧的版本,最近没有更新。 我是否遗漏了什么,或者 API 的这一部分是否仍
我的应用程序使用 GKSession 和 GKSessionModePeer。它必须处理任意连接和断开连接的点,因为这是一个长时间运行的应用程序,用户应该能够进入后台并稍后返回。这在大多数情况下都很好
我在 Google Meet 上开会,看到你可以打开实时字幕。他们实际上有一个演示 here关于如何进行实时语音到文本,所以这一点不会让我感到困惑。 我也一直想尝试使用 WebRTC(我相信 Goog
我正在尝试在聊天模块中共享图像/视频。我已经提到了Sample代码,但找不到任何帮助。 我已经提到过http://quickblox.com/modules/chat/它说通过插入我们全功能的聊天模块
我想让 WiFi peer-2-peer 中的一组连接过程对用户来说是无缝的。有办法吗? 蓝牙是怎么做到的? 最佳答案 基本上有两种方法可以做到这一点,我在 WIFI DIRECT, CONNECTI
这是我原来问题的后续:Qt Server+Client App: encryption fails (updated with code)还将此发布到 Qt 论坛:http://qt-project.
我有两个位于同一子网上的 debian 服务器。它们通过开关连接。我知道 UDP 不可靠。 Question 1: I assume the link layer is ethernet. And M
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我正在创建一个应用程序 (C#),它将通过网络发送一些消息。传出消息将由私钥签名,传入消息将使用私钥解密。 如果有人窃取私钥,我希望能够撤销它(向所有其他客户端发送撤销消息)。由于我是被盗私钥的所有者
我仍在学习 SIP 及其所有协议(protocol),特别是尝试将 PJSIP 集成到 iPhone 应用程序中以进行 p2p 调用。我对使用 PJSUA 的对等 2 对等连接有疑问。我能够通过使用
我想用 Webrtc 创建应用程序,它可以在网站、移动 ios 应用程序和 android 应用程序上运行。 我找到了这个链接:- http://xsockets.net/api/net-c/cust
我使用 Spark Streaming 从 Twitter 接收推文。我收到很多警告说: replicated to only 0 peer(s) instead of 1 peers 这个警告有什么
我有一个需要大量数据的模拟程序。我将数据加载到 GPU 中进行计算,数据中存在很多依赖性。由于 1 个 GPU 不足以处理数据,所以我将其升级为 2 个 GPU。但限制是,如果我需要其他 GPU 上的
我在调试我的代码时遇到问题,因为我无法理解引发的套接字错误。这是回溯。 Traceback (most recent call last): File "clickpression.py", lin
我试图将Fabric配置为可以在Kubernetes集群中使用,并且在一切正常的同时,我很难将链码(使用composer-cli)部署到网络上。看来,chaincode容器看不到创建它们的对等方。 2
在Java中,您可以使用Socket和ServerSocket来获取两个进程之间通信的双向 channel 。但其中只有一个必须拥有 ServerSocket 并被视为“服务器”,另一个则被视为“客户
我用不同的名称和不同的字段名称创建了自己的用户表,我想让 kamailio 将它用作对等用户的“acc”表,我该怎么做? 最佳答案 kamailio 中的 acc 表用于会计记录(即账单数据)。 我知
我是一名优秀的程序员,十分优秀!