gpt4 book ai didi

ios - Multipeer Connectivity 终止 session

转载 作者:行者123 更新时间:2023-11-29 12:25:59 24 4
gpt4 key购买 nike

我正在使用主机/客户端方法来使用 MultiPeer 连接。

所以,当用户按下断开连接按钮时

-(IBAction)disconnect:(id)sender {

[_appDelegate.mcManager.session disconnect];

[_arrConnectedDevices removeAllObjects];



ConnectionsViewController *game = [self.storyboard instantiateViewControllerWithIdentifier:@"ConnectionsViewController"];

[self presentViewController:game animated:YES completion:nil];

}

现在,这工作正常。从主机的角度来看,它在日志中收到一条断开连接消息。并且客户端移动到新的 View Controller 。并且表格已更新。有了这个。

-(void)peerDidChangeStateWithNotification:(NSNotification *)notification{
MCPeerID *peerID = [[notification userInfo] objectForKey:@"peerID"];
NSString *peerDisplayName = peerID.displayName;
MCSessionState state = [[[notification userInfo] objectForKey:@"state"] intValue];

if (state != MCSessionStateConnecting) {
if (state == MCSessionStateConnected) {
if (_makeSureImHost) {
[_arrConnectedDevices addObject:peerDisplayName];

[_tblConnectedDevices performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}

else {
[self sendMessageToHostWithMessage:@"deviceInfo"];
}
}
else if (state == MCSessionStateNotConnected){
if ([_arrConnectedDevices count] > 0) {
int indexOfPeer = (int)[_arrConnectedDevices indexOfObject:peerDisplayName];
[_arrConnectedDevices removeObjectAtIndex:indexOfPeer];

NSLog(@"%@ Disconnected", peerDisplayName);

[_tblConnectedDevices performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

_tblConnectedDevices.frame = CGRectMake(_backgroundImage.frame.size.width / 2 - 150, self.backgroundImage.frame.size.height / 3, 300, 150);


}
}
}
}

大厅 View Controller 结束

开始连接 View Controller

当客户端按下浏览本地设备时运行

- (IBAction)browseForDevices:(id)sender {
[UIView animateWithDuration:0.5f
animations:^{
_searchButton.frame = CGRectMake(-100, self.backgroundImage.frame.size.height/2 + 60, 100, 35.0);
_hostButton.alpha = 0;
_modeLabel.alpha = 0;
}];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[_appDelegate mcManager] setupPeerAndSessionWithDisplayName:[UIDevice currentDevice].name];
[[_appDelegate mcManager] advertiseSelf:false];

[[_appDelegate mcManager] setupMCBrowser];
[[[_appDelegate mcManager] browser] setDelegate:self];
_appDelegate.mcManager.browser.maximumNumberOfPeers = 1;

_appDelegate.mcManager.browser.modalTransitionStyle=UIModalTransitionStyleCrossDissolve;
[self presentViewController:[[_appDelegate mcManager] browser] animated:YES completion:nil];
});

}

建立连接时

-(void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController {
[_appDelegate.mcManager.browser dismissViewControllerAnimated:NO completion:^{
[self launchViewController];
}];
}

-(void)launchViewController {
LobbyViewController *lobby = [self.storyboard instantiateViewControllerWithIdentifier:@"LobbyViewController"];
[self presentViewController:lobby animated:NO completion:nil];
}

由此

-(void)peerDidChangeStateWithNotification:(NSNotification *)notification {
MCPeerID *peerID = [[notification userInfo] objectForKey:@"peerID"];
NSString *peerDisplayName = peerID.displayName;
MCSessionState state = [[[notification userInfo] objectForKey:@"state"] intValue];

if (state != MCSessionStateConnecting) {
if (state == MCSessionStateConnected) {
[self browserViewControllerDidFinish:[[_appDelegate mcManager] browser]];

}
}
else if (state == MCSessionStateNotConnected){
if ([_arrConnectedDevices count] > 0) {
int indexOfPeer = (int)[_arrConnectedDevices indexOfObject:peerDisplayName];
[_arrConnectedDevices removeObjectAtIndex:indexOfPeer];


}
}
}

现在。首次建立连接时。这一切都完美无缺。它连接,加载 View ,主机启动游戏,游戏运行正常,数据传输完美。

但是,如果您断开与大厅的连接。移动到连接 View Controller ,然后再次浏览设备。它将连接,但是大厅 View Controller 将在 View 层次结构中,并将关闭浏览器并留在连接 View Controller 中。

然后,最重要的是,连接已经建立。然而,当它收到来自主机的消息时,它会发送响应,两次......或三次,或四次,将我引向死胡同。我唯一可以假设的是,从“客户”的角度来看,以某种方式记住了之前的 session 。

现在,我可以采取哪些步骤来避免这种困惑。如果我终止应用程序并重新启动它,我现在可以从客户端的角度再次连接。这让我相信,问题出在客户端。

我的问题是我必须彻底解决这个问题。因此断开连接将完全删除 session 中的所有内容。这样他们就可以重新连接了。并且不能依靠消息来告诉用户重新启动他们的应用程序。这是不可能的。

这是我的整个 MCManager.m 文件。

@implementation MCManager

-(id)init{
self = [super init];

if (self) {
_peerID = nil;
_session = nil;
_browser = nil;
_advertiser = nil;
}

return self;
}

-(void)setupPeerAndSessionWithDisplayName:(NSString *)displayName{
_peerID = [[MCPeerID alloc] initWithDisplayName:displayName];

_session = [[MCSession alloc] initWithPeer:_peerID];
_session.delegate = self;
}

-(void)setupMCBrowser{
_browser = [[MCBrowserViewController alloc] initWithServiceType:@"chat-files" session:_session];
}

-(void)advertiseSelf:(BOOL)shouldAdvertise{
if (shouldAdvertise) {
_advertiser = [[MCAdvertiserAssistant alloc] initWithServiceType:@"chat-files"
discoveryInfo:nil
session:_session];
[_advertiser start];
}
else{
[_advertiser stop];
_advertiser = nil;
}
}

-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{
NSDictionary *dict = @{@"peerID": peerID,
@"state" : [NSNumber numberWithInt:state]
};

[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidChangeStateNotification"
object:nil
userInfo:dict];
}


-(void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{
NSDictionary *dict = @{@"data": data,
@"peerID": peerID
};

[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidReceiveDataNotification"
object:nil
userInfo:dict];
}


-(void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress{

}


-(void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error{

}


-(void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID{

}

@end

#import <MultipeerConnectivity/MultipeerConnectivity.h>

@interface MCManager : NSObject <MCSessionDelegate>

@property (nonatomic, strong) MCPeerID *peerID;
@property (nonatomic, strong) MCSession *session;
@property (nonatomic, strong) MCBrowserViewController *browser;
@property (nonatomic, strong) MCAdvertiserAssistant *advertiser;

-(void)setupPeerAndSessionWithDisplayName:(NSString *)displayName;
-(void)setupMCBrowser;
-(void)advertiseSelf:(BOOL)shouldAdvertise;
@end

如果有人知道我做错了什么,我将不胜感激。这让我抓狂。

最佳答案

[[NSNotificationCenter defaultCenter] removeObserver:name:object:];

解决了我所有的问题。希望也能帮助其他人。

关于ios - Multipeer Connectivity 终止 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29112242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com