使用app在后台运行的一台设备实现多种连接

时间:2014-08-26 20:37:30

标签: ios multipeer-connectivity

我想使用多重连接框架连接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连接在后台不起作用,我可以直接通过蓝牙连接吗?

1 个答案:

答案 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];
}

在这里,您发出一个本地通知,当用户点击该通知时,您的应用会进入前台,此时您可以开始为点对点连接做广告。