在 iOS 上跨多个应用程序共享数据

Posted

技术标签:

【中文标题】在 iOS 上跨多个应用程序共享数据【英文标题】:Share data across multiple apps on iOS 【发布时间】:2013-10-10 00:54:05 【问题描述】:

我知道这方面有很多线程,但似乎没有一个能满足我想要寻找的东西。这是我的限制:

不是使用私有 API/框架或未记录的 hack 可能存在应用被拒绝风险的目录访问 正因为如此 能够跨不同的共享数据 供应商/应用开发者 数据可以在生命周期之外持续存在 应用程序(即使在应用程序被删除后)

更新:我通常会尽量避免使用基于云的第 3 方服务来实现目标,因为这会引入额外的外部依赖。但如果必须的话,我希望它能满足这一限制

能够判断它正在与哪个 ios 设备进行通信。它不应该必须唯一标识设备(正如我们都经历过的那样,它将进入那个邪恶的 UDID 讨论路线)。但只要它可以区分不同的 iOS 设备就可以了。

【问题讨论】:

您是否考虑过使用通用云服务来托管数据? 你检查过ios SDK上的PasteBoard API吗?这里:developer.apple.com/library/ios/documentation/uikit/reference/… @AgungPratama 从 iOS 7 开始,如果应用来自同一开发者,应用只能共享一个通用(命名)粘贴板。 PasteBoard 不能可靠地持久化,用户可以干预和覆盖粘贴板内容 UIPasteboard 在 iOS 7 之前可以使用。您可以创建一个命名的粘贴板,任何应用程序都可以访问,以这种方式读取和写入数据。出于绝望,我打算这样做,因为我想要本地数据。在今年的 WWDC 上与一位 Apple 开发人员交谈后,我认为类似的事情会发生。但就像 rmaddy 所说,他们更改了 API,以便只有常见的供应商 ID 应用程序才能查看命名的粘贴板。 (我当然希望我没有给他们锁定这个的想法) 【参考方案1】:

我也有点需要这个。我使用 Parse.com 作为我所有应用程序的后端——它们的免费层应该可以满足您的开发需求。

Parse 提供适用于 iOS、android、Windows 8、OS X、javascript 和 .NET 的 API,您的所有数据都可以在任何平台上的云中使用(与 Core Data 和 iCloud 不同)。他们还提供“云代码”,即您可以远程执行的代码,用于远程处理信息并将数据返回到您的应用程序。

您绝对应该check Parse.com 为您的应用提供云存储。根据我的经验,它确实可以完成工作。

对于数据持久性,我想你可能想看看FMDB(尽管如果你决定在本地持久化数据,它会被你的应用程序删除,但无论如何它可能会对你有所帮助)。在许多情况下,Core Data 是多余的。

编辑: Parse.com 有一个“安装”类,其中列出了所有安装了您的应用的设备(无论它们运行的​​是 iOS 还是 Android),您无需输入任何代码。

【讨论】:

+1 用于解析。他们的文档(至少对于 iOS)非常棒,而且非常易于使用。考虑到大部分情况下它只是 JSON 对象,它可以跨平台无缝运行这一事实也是一个好处。 Parse 非常棒,而且绝对可靠且易于使用,因为它归 Facebook 所有。我最近在一些网络应用程序中使用过它,它还有不错的查询功能,可以帮助对数据进行排序,非常方便。【参考方案2】:

也许 TextExpander 作者的this blog post 会有所帮助:

Smile 已通过与 Apple 讨论该问题对此作出回应 WWDC 的工程师,提交错误 (#14168862),并检查 该错误的状态。我们还通过存储 TextExpander 数据在一个新的地方。提醒需要用户同意 存储和检索数据。已完成的提醒通常不会显示在 它的界面。过去很久的提醒出现在底部 已完成的提醒。

TextExpander touch 2.1(及更高版本)支持存储共享的 sn-p 数据在一个很久以前,完成的提醒。我们制作了更新的 SDK 并让我们的开发人员随时了解其进展情况。我们最终的 SDK 是 在苹果官方 iOS 7 结束后的几个小时内准备就绪 公告。

更新(2013 年 11 月 22 日) 这可能不是最好的方法,因为 TextExpander 的团队 recently had problems with the App Review Team。

【讨论】:

谢谢,Arkadiusz。这对我来说似乎是最好的解决方案。【参考方案3】:

编辑:这仅适用于具有相同供应商的应用。

您可以将密码保存到设备的钥匙串中,然后从任何应用程序访问该密码。

使用SSKeychain 库...

NSString *service = @"com.yourcompany.yourservice";

// read
NSString *password = [SSKeychain passwordForService:service account:@"user"];

// write
[SSKeychain setPassword:password forService:service account:@"user"];

密码字符串doesn't have a length limit,因此将所有数据编码为字符串并保存在那里。用户删除应用后,钥匙串条目将保留。

【讨论】:

谢谢尼尔。要通过钥匙串共享数据,两个应用程序必须使用相同的应用程序 ID/捆绑种子 ID 前缀,因此无法在来自不同开发者/供应商的应用程序之间共享数据。【参考方案4】:

其中一种方法是使用 THRIFT。这是一个需要后端服务器(私有)的数据通信协议,并且 THRIFT 可以编译成多种语言/平台。有一种元语言来描述数据,然后可以被编译成多种语言。一次编写数据定义,可在多个平台上使用。

更多信息请访问。

http://thrift.apache.org/

【讨论】:

【参考方案5】:

对我来说(我有 2 个应用程序和一个 widged)最好的解决方案是使用 SSKeyChain,不要忘记为您的应用程序添加 Capabilities,例如 here

或者,如果您不想使用第 3 方库,您可以使用 NSUserDefaults 并设置组标识符,例如 here,但同样不要忘记在 AppGroups 部分的 Capabilities 中添加组标识符您所有具有共享数据的应用。

【讨论】:

以上是关于在 iOS 上跨多个应用程序共享数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一台服务器上跨多个域维护 PHP 会话?

iOS应用程序间共享数据(转)

多个 ios 应用程序共享一个 facebook 应用程序

我可以从 iOS 应用共享多个图像和多个视频吗

在 Android 上跨会话从文件中写入然后读取 ArrayList<Object>?

多个socket.io进程共享同一个端口?