可以在两个 iOS 设备之间发送数据吗?

Posted

技术标签:

【中文标题】可以在两个 iOS 设备之间发送数据吗?【英文标题】:Possible to send data between two iOS devices? 【发布时间】:2012-07-09 15:57:45 【问题描述】:

我在网上阅读了大量关于此的问题,但似乎无法找到可靠的答案。如果我的 iPhone 在蜂窝数据上运行,而另一个 ios 设备在 wifi 上运行(在两个不同的位置),它们是否可以直接相互发送数据而不先将其发送到 Web 服务器,然后再检索它?是从服务器/Apple 的 iCloud 发送和接收的唯一选项吗?如果我知道设备的 IP 地址怎么办?请注意,iPhone 已禁用 WiFi。

我不打算把它放在应用商店里,它是供个人使用的。我知道NSNotificationCenter 不是一个选择。

【问题讨论】:

只需使用 Apple 的 iCloud,连接到 3G/4G 连接的手机不会以典型方式获取其 IP 地址。任何解决方案都会涉及黑客攻击,不会是无缝的,并且性能会很糟糕。 只有几种方法可以将数据直接从一台设备发送到另一台设备 - 3G 和 wifi 是常规方法。您需要两台设备使用相同的数据服务 - 如果您无法访问 wifi 网络,知道 IP 地址并不重要。 ECEsurfer 的方法可能是最好的,具体取决于您需要的具体用途。 嗯。所以如果他们没有连接到同一个网络,那是不可能的(因为除了 iCloud/Web 服务器之外,蓝牙似乎是唯一的选择)? 如果两台设备都是同一个 iCloud 用户,这可能是迄今为止最容易设置的解决方案。您的另一个选择是创建一些处理连接和数据封送处理的可寻址代理(它不必是 Web 服务器,只需可从所有网络寻址)。这实际上是 GameKit 所做的事情,因此您也可以实际使用它(仅用于数据连接方面)。 【参考方案1】:

使用 gamekit 框架,您可以在两个 iOS 设备之间发送数据。它很容易实现。除此之外,我认为没有其他方式可以在两台 iOS 设备之间发送数据。

【讨论】:

是的,我刚刚发现了这一点,并打算将其添加为我的答案,但你打败了我! ; ) 让我知道您在 gamekit 中需要更多帮助..:) 当它们不在同一个网络上/在一定范围内使用 GameKit 时,似乎不可能将数据从一台设备发送到另一台设备。真的吗?在两个完全不同位置的设备之间发送数据怎么样?【参考方案2】:

其实是可以的。您可能想在谷歌上搜索称为“UDP 打孔”或“TCP 打孔”的内容。

简而言之,主要方法是:假设您有类似中继服务器的东西,它是互联网中的某个服务器,可以从连接到 www 的每个私有 LAN 公开寻址。不,您的两个客户端 A 和 B 在(不同的)私有 LAN 中,并且正在进行一些网络地址转换 (NAT),它们想要建立对等连接。

首先,两者都会告诉服务器他们的 IP 地址和他们在自己 LAN 中的端口。在 UDP 或 TCP 数据包中,服务器会找到设备(或 NAT(路由器))的公共地址和端口。所以服务器知道私有和公共 IP 地址以及端口。

如果现在 A 想与 B 通信,它会向服务器寻求帮助。服务器将向 B 发送一条消息,表明 A 想与她通信,告诉她 A 的公共和私有 IP 和端口。 A 取回 B 的公私信息和端口。

现在魔法发生了。两个客户端现在都发送数据包以同时建立与另一方的私有和公共地址的连接,从而在他们的 NAT 中打入一个整体,这样传入的连接就不会被阻塞。即使一方的连接建立数据包会在整个创建之前到达,另一方的数据包也会通过,以便可以创建连接。

请注意某些 NAT 会扫描数据以查找 IP 地址并对其进行转换,但如果您加密数据或更改地址的外观(补码,...),您会没事的。

现在的主要问题是,服务器如何在没有活动连接的情况下与其中一个客户端进行通信。那么在这种情况下,您可以使用“连接反转”和苹果的“推送通知”。使用“推送通知”(pn) 告诉 NAT 后面的客户端有一些有趣的事情正在发生,它应该联系服务器。一旦完成,连接就处于活动状态,并且可以按照前面描述的方式使用。

我希望这可以帮助一些解决这个问题的人,尽管帖子已经很老了!

【讨论】:

【参考方案3】:

如果 IP 地址是可通过 Internet 访问的可公开访问的 IP 地址,并且它们是静态的(足够),那么您只能使用直接 IP 地址通信,这样当设备被动态分配到地址时,它们不会定期更改。在许多(大多数)情况下,情况并非如此,因为您的设备将被动态分配其 IP 地址,而这些地址通常是不可公开寻址的自分配 IP 地址。

正如其他人评论的那样,使用 iCloud 等 Apple 提供的机制可能是最简单的选择。如果这不是您想要娱乐的东西,可能有一些方法可以利用动态 DNS 服务(如 DynDNS)来管理您设备的实际 IP 地址。有了类似的东西,您也许可以基于命名 DNS 查找在设备之间使用直接 IP 连接。不过,您可能必须跳过一些障碍才能做到这一点,但我不确定您是否想达到那个程度。

【讨论】:

嗯。好的,我将使用 Apple 提供的 GameKit。它有据可查,看起来很容易实现。感谢您的信息!【参考方案4】:

我认为Bluetooth 对你来说是个不错的选择

【讨论】:

我认为,当提问者告诉我们这两个设备在不同的网络上时,它们不在蓝牙范围内是安全的。 是的@Jacob Oscarson 是对的。我将无法使用蓝牙。 @JacobOscarson 如果 OP 这么说,那么它一定是;但如果将来出现反对票(就像我刚刚收到的那样)。仅仅因为两部手机使用 2 个不同的运营商并不意味着它们超出了蓝牙范围。 FYI GameKit(这是正确答案)也使用蓝牙。

以上是关于可以在两个 iOS 设备之间发送数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在两个不同 iOS 设备的应用程序之间传输数据?

如何在android中使用NFC在两个设备之间发送数据?

核心蓝牙 CBAdvertisementDataServiceDataKey 可以有一些自定义数据吗?

如何在两个应用程序之间发送通知

可以在iOS中使用RFCOMM吗?

如何将字符串从 iPhone 发送到其他蓝牙设备