我使用MCNearbyServiceBrowser和MCNearbyServiceAdvertiser将两个对等体连接到MCSession.我可以使用MCSession的sendData方法在它们之间发送数据.所有似乎都按预期工作,直到我随机(并且不是由于我控制的任何事件)通过会话的MCSessionDelegate didChangeState处理程序接收MCSessionStateNotConnected.此外,MCSession的connectedPeers数组不再拥有我的同行.
两个问题:为什么?以及如何防止MCSession断开连接?
我一直在关注iOS 7的新P2P网络框架,MultipeerConnectivity,从描述中,我觉得它使用了某种Wi-Fi Direct技术和蓝牙PAN的组合.
此框架中的Wi-Fi Direct技术是否与Android的Wi-Fi Direct兼容?这个框架实际上可以用于跨平台的P2P网络吗?
我在我的应用程序中使用iOS 7 Multipeer框架,但我遇到设备断开连接的问题.如果我在两个设备中打开应用程序:设备A和设备B,这两个设备会自动相互连接.但是,几秒钟后,设备A断开与设备B的连接.即,首先连接是这样的:
A ---> B
A <--- B
Run Code Online (Sandbox Code Playgroud)
几秒钟后:
A ---> B
A B
Run Code Online (Sandbox Code Playgroud)
设备A维护它的连接,但设备B得到一个MCSessionStateNotConnected.
这意味着A可以向B发送数据但B无法回复.我试图通过检查设备是否已连接来解决这个问题,如果不是,请使用以下命令重新启动连接:
[browser invitePeer:peerID toSession:_session withContext:Nil timeout:10];
Run Code Online (Sandbox Code Playgroud)
但是,使用MCSessionStateNotConnected调用didChangeState回调.
奇怪的是,如果我将应用程序A发送到后台,然后重新打开它,B重新连接到它并保持连接.
Multipeer API(和文档)看起来有点稀疏,所以我假设它会起作用.在这种情况下,我应该如何重新连接设备?
好吧,我正在研究这个应用程序在Android和iOS之间发送数据,我让它在iOS设备与Apple的Multipeer Connectivity框架之间工作,但我目前想知道你是如何在两个平台之间实现它的?即使你愿意从头开始写它.
为什么Firechat能够做到这一点?我记得,您可以使用他们的应用程序在两个平台之间交换数据.
编辑:https://www.opengarden.com/meshkit.html似乎Firechat中使用的MeshKit SDK现在可用(适用于大型组织).
在Apple TV宣布期间,Crossy Road的开发人员使用iPhone作为Apple电视游戏的第二控制器:
http://www.macrumors.com/2015/09/09/cooperative-play-for-crossy-road/
我的第一个想法是使用Multipeer Connectivity Framework实现这一点.但是,它不支持tvOS.有没有一种很好的方法可以在没有Multipeer Connectivity的情况下将iPhone连接到Apple TV?
更新:似乎我不能使用GameKit,因为GKPeerPickerController已从tvOS上的GameKit中删除.
我已经在这几天了,似乎无法找到解决方案.我想在iOS上通过wifi创建点对点网络.所有开源代码似乎都支持运行服务器或作为客户端,但是没有构建代码来支持两者兼作 - 一个对等体.有人知道我可以这样做吗?
我正在开发一个使用MC框架作为沟通渠道的项目,经过一些测试后,我认为这个渠道在某种程度上不稳定而无法依赖.
我一直在关注Apple的文档和视频,以便正确使用框架,但碰巧:
是否有任何建议与框架一起使用?即:
我发现这个链接提到了一些关于框架在压力下表现不佳的事情.那是我正在寻找的那种建议:).
作为记录:
我想知道这个Multipeer Connectivity框架是否可以在现实世界中使用,考虑到社区遇到的所有错误.我认为我的设置正确,但我尝试过的所有其他示例项目都遇到了类似的问题.
我遇到的问题可能与Bonjour固有的某些问题有关,我无法弄清楚,但基本上问题如下:
MCSession
和很多同行都很活跃.browser:lostPeer:
为该对等方调用该方法并且不再在浏览器中显示为"附近" ,我也无法强制该用户离开.session:peer:didChangeState:
不为该对等方调用该方法.browser:foundPeer:withDiscoveryInfo:
但仍然存在于session.connectedPeers
NSArray中.显然,他们仍然没有收到有关会话的任何数据或更新,实际上并没有连接.MCSessionStateNotConnected
到会话的方法是将该对等体重新连接到原始会话.然后session:peer:didChangeState:
对peerID的新实例所在的位置进行重复调用,并且在peerID MCSessionStateConnected
的旧实例调用之后不久MCSessionStateNotConnected
.示例聊天应用程序很好地演示了这个问题:https://developer.apple.com/library/ios/samplecode/MultipeerGroupChat/Introduction/Intro.html
由于似乎没有任何方法可以手动强制从会话中删除对等体,我该怎么办?我应该尝试以某种方式重建会话吗?
这个框架看起来有点混乱,但我试图保留判断力!
该Multipeer连接框架文件是有点欠缺.下面我有几个关于连接和中继的问题.
为了方便起见,我为每个问题创建了一个图像.传说如下:
对于每个问题,请记住以下几点:
假设1和2连接到会话.
如果1和3连接,2和3连接?
假设1和2连接到会话,3和4连接到不同的会话.
如果1和3连接,那么所有对等体是否相互连接?(例如,2和4连接?)
假设1,2和3全部连接并且在彼此的范围内.
如果3超出1的范围(但仍然在2的范围内),1和3是否断开连接?
注意:对于这个问题,假设他们使用设备到设备通信,而不是集中式Wi-Fi.
3B.如果不是,这是否意味着1发送到3的每条消息都通过2传递,或者3只是没有得到任何消息?
假设1和2是在彼此的范围内,2和3是在彼此的范围内,但图1和3超出彼此的范围内.假设1和2连接到会话,但3不连接.
如果3连接到2,它也会连接到1吗?
同样,1和2在范围内,2和3在范围内,但1和3在范围之外.
如果1广告其服务,将3看到它(例如通过它通过对等2中继)?
5B.如果2也是广告,这会改变上述问题的答案吗?即3将看到1的广告?
同样,1和2在范围内,2和3在范围内,但1和3在范围之外.
如果3广告其服务,将1看到它(例如通过它通过对等2中继)?
6B.如果2也在浏览,这会改变上述问题的答案吗?即1将看到3的广告?
使用此代码在TViOS 10.0下设置Multipeer连接.
import UIKit
import MultipeerConnectivity
class MPCHandler: NSObject, MCSessionDelegate {
var peerID: MCPeerID!
var session: MCSession!
var browser: MCBrowserViewController!
var advertiser: MCAdvertiserAssistant? = nil
func setupPeerWithDisplayName (displayName: String) {
peerID = MCPeerID(displayName: UIDevice.current.name)
}
func setupSession() {
session = MCSession(peer: peerID)
session.delegate = self
}
func setupBrowser() {
browser = MCBrowserViewController(serviceType: "my-game", session: session)
}
func advertiseSelf(advertise:Bool) {
if advertise {
advertiser = MCAdvertiserAssistant(serviceType: "my-game", discoveryInfo: nil, session: session)
advertiser!.start()
} else {
advertiser!.stop()
advertiser = nil
}
} …
Run Code Online (Sandbox Code Playgroud) ios ×8
android ×2
bluetooth ×2
iphone ×2
objective-c ×2
apple-tv ×1
ios7 ×1
mcsession ×1
networking ×1
peer ×1
session ×1
swift3 ×1
television ×1
tvos ×1
wifi-direct ×1