当用户关闭和打开蓝牙时,Multipeer Connectivity 停止工作
Posted
技术标签:
【中文标题】当用户关闭和打开蓝牙时,Multipeer Connectivity 停止工作【英文标题】:Multipeer Connectivity stops working when user turns off and on bluetooth 【发布时间】:2013-09-28 10:51:09 【问题描述】:我在我的应用程序的 ios7 中使用多点连接。文件发送和接收工作绝对正常,但是当用户从我的应用程序中访问控制中心(甚至设置)并关闭蓝牙或 wifi 时,文件交换停止工作。当用户将他们两个都重新打开时,它仍然不起作用。为了让它们再次工作,用户必须关闭并重新打开应用程序。
文件以这种方式发送:
MCSession *session = [[MCSession alloc]
initWithPeer:key];
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.year = 2100;
dateComponents.month = 1;
dateComponents.day = 1;
dateComponents.hour = 0;
dateComponents.minute = 0;
dateComponents.second = 0;
NSDate *referenceDate = [gregorian dateFromComponents: dateComponents];
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSinceDate:referenceDate];
NSData *Recording = [NSData dataWithContentsOfFile:myFilePath];
NSString* str = [NSString stringWithFormat:@"%@.ext", button.titleLabel.text];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:str forKey:@"fileName"];
[dict setObject:@"Recording" forKey:@"fileType"];
[dict setObject:Recording forKey:@"FileData"];
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:dict];
[browser invitePeer:key
toSession:session
withContext:myData
timeout:interval];
用户可以随时使用以下方式重新加载设备:
[browser startBrowsingForPeers];
我认为问题在于超时,但我不确定。
【问题讨论】:
您需要在- (void)applicationDidBecomeActive:(UIApplication *)application
应用委托方法中重新初始化会话。当您的应用在控制中心打开然后关闭后再次变为活动状态时,将调用该方法。
重新初始化会话是指 MCSession 甚至是 MCNearbyServiceAdvertiser 和 MCNearbyServiceBrowser?
如果可以,请重新初始化与 Multipeer Connectivity Framework 相关的所有内容。您还需要重新连接所有已连接的对等点。
好的,做到了,问题似乎解决了,但由于某种原因,不仅所有设备都重新出现,而且设备本身也重新出现。设备似乎可以向自己发送文件...
在不同的框架下也发生过这种情况。您可以尝试将对等点识别为自身,如果您列出对等点,则不显示它。
【参考方案1】:
您需要在- (void)applicationDidBecomeActive:(UIApplication *)application
应用委托方法中重新初始化所有与Multipeer Connectivity Framework 相关的实例。当您的应用在控制中心打开然后关闭后再次变为活动状态时,将调用该方法。
【讨论】:
【参考方案2】:我建议您改为监视连接状态的更改,并在您检测到更改时拆除或重新初始化。这是我使用出色的 Reachability 套件解决同样问题的方法:
- (void)monitorReachability
// Allocate a reachability object
self.reachability = [Reachability reachabilityWithHostname:@"www.google.com"];
[[NSNotificationCenter defaultCenter] addObserverForName:kReachabilityChangedNotification object:nil queue:nil usingBlock:^(NSNotification *note)
Reachability *reachability = note.object;
if ( reachability.isReachable )
self.isPhysicallyConnected = YES;
[self updateNearbyService];
else
self.isPhysicallyConnected = NO;
[self tearDownNearbyService];
];
// Start the notifier, which will cause the reachability object to retain itself!
[self.reachability startNotifier];
在teardown
和update
中,您将重建您的Multipeer 堆栈。
【讨论】:
有趣。但是如果谷歌出现故障,或者互联网连接中断怎么办?然后程序将无缘无故地重新启动会话。 OP是在谈论蓝牙,而不是wifi。 (仅供参考,我不是反对者) 感谢您的意见。是的,没有专门检测蓝牙连接状态的方法(我知道从 iOS 7 开始)。这就是目前对原始问题实际上没有完美答案的原因,因为“每次应用程序出现时都重新启动会话”也是次优的。以上是关于当用户关闭和打开蓝牙时,Multipeer Connectivity 停止工作的主要内容,如果未能解决你的问题,请参考以下文章
仅使用蓝牙时,iOS Multipeer 连接将对等点数量限制为 6 个,无论如何要绕过它?
Multipeer Connectivity Framework (iOS7) 如何在附近没有 Wi-Fi 路由器且蓝牙接口关闭的情况下使用?
iOS Multipeer 连接是不是适用于非智能手机设备?
无法通过 Multipeer Connectivity 连接蓝牙