我想使用多重连接框架连接2个设备,其中一个设备在后台运行应用程序,就像Firechat一样(我无法确认这是有效的,我已将其安装在iPhone上5S和4,但是他们无法找到对方 - 但我已经读过这个有用的地方了。)
实现这一目标的最佳方法是什么?
我使用示例代码中的以下两种方法:
-(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;
}
}
当我在前台运行应用程序时,它会完美地找到另一台设备并连接。但是,如果我将其中一个应用程序放入后台,则后台应用程序设备将不再可见。
我已经读过这个:Can I have a multipeer connectivity session run in the background? - 但如果没有任何解决方法,我无法相信这是不可能的。
仅供参考,我的应用程序也在使用后台位置更新,如果相关的话......
谢谢!
编辑: 还有其他方法吗?基本上我只想向其他设备发送消息(对于那个应用程序在后台运行的人) - 因为Multipeer连接在后台不起作用,我可以直接通过蓝牙连接吗?
答案 0 :(得分:4)
Apple已确认" Multipeer Connectivity无法在后台运行"。原因是,如果您的应用程序被暂停,那么它的套接字资源可以被回收,一切都会崩溃。
但是,可以在后台监控iBeacons。实质上,您将应用程序设置为监视与具有特定ID的信标的接近程度。然后,您在前台的应用程序将成为具有相同ID的信标。这会导致在后台应用程序上调用以下app委托方法:
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
UILocalNotification *notification = [[UILocalNotification alloc] init];
if(state == CLRegionStateInside) {
notification.alertBody = NSLocalizedString(@"A nearby app would like to connect", @"");
} else {
return;
}
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}
在这里,您发出一个本地通知,当用户点击该通知时,您的应用会进入前台,此时您可以开始为点对点连接做广告。