在两个或多个 iPhone 应用程序之间共享数据

是否可以在同一设备上的两个应用程序之间共享数据?

或者我可以允许其他应用程序使用我的应用程序的信息/数据或以其他方式使用我的应用程序的信息/数据吗?

例如,第一个应用程序用于事件管理,我使用它来保存一些事件。第二个应用程序用于提醒,它将从另一个应用程序获取数据,以提醒我有关事件的信息。

这只是一个简单的例子,不是一个真实的场景。

82234 次浏览

不,你必须使用一些云解决方案。

历史上,iPhone 一直试图阻止应用程序之间的数据共享。这个想法是,如果你不能得到另一个应用程序的数据,你不能做任何坏的应用程序。

在最近的 IOS 版本中,他们稍微放松了一些。例如,iOS 编程指南现在有一个关于在应用程序之间传递数据的部分,让一个应用程序声明一个特定的 URL 前缀,然后让其他应用程序引用该 URL。因此,您可能将事件应用程序设置为回答“ event://”URL,就像 Web 服务器回答“ http://”URL 一样。

苹果关于这种方法的文档是 给你

在“实现自定义 URL 方案”下看一看。

如果你不介意访问网络,你可以实现一个自定义的 Web 服务来做这件事,或者使用一些云服务。ICloud 本身在这里用处不大; 它只允许你在不同设备上的同一个应用程序之间共享数据。你可以阅读关于 iCloud 给你的文章。

在不使用网络的情况下,您可以利用“ 快速应用程序切换”通过 URL 编码在应用程序之间传输有限数量的数据。我不知道可转移的数据的实际数量,但我肯定是非常有限的。

JugsteR 和 Baudot 的回答在这种情况下是最好的。

可以使用自定义 URL 方案从一个应用程序访问另一个应用程序的数据。跟随下面提到的链接获取更多信息-

Http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html

应用程序之间共享数据可能吗? 是的,它是!

使用可从 iOS 3.0获得的 UIPasteBoard,文档可从 给你获得。 苹果公司的文件显示:

UIPasteboard 类使应用程序能够在应用程序内部共享数据,或者使用系统范围的或特定于应用程序的粘贴板与其他应用程序共享数据。

也可以在密钥链中的应用程序之间共享数据,尽管数据主要是用来作为密码之类的,任何可序列化的东西都可以存储。 这里有一个关于这个问题的 Stack Overflow 问题。

提到通过 UIPasteBoard 在应用程序之间共享数据只适用于 iOS7中同一应用程序组中的应用程序。正如苹果所言:

+ [ UIPasteboard pasteboardWithName: create: ]和 + [ UIPasteboard pasteboardWithUniqueName ]现在唯一的给定名称,只允许同一应用程序组中的应用程序访问粘贴板。如果开发人员试图创建一个名称已经存在的纸板,他们不是同一个应用程序套件的一部分,他们将得到自己独特的和私有的纸板。请注意,这并不影响系统提供的纸板、一般和查找。

沙箱世界的 iOS 开发之间共享数据 由于 iOS 开发人员不能共享数据,应用程序可能被证明是困难的 直接通过 文件系统他们需要找到替代品 一些常用的解决方案包括:

  • 交互控制器

  • UIActivityViewController

  • 共享钥匙链访问

  • 自订网址方案

  • 网上服务

  • ICloud API


交互控制器:

允许用户在任何其他应用程序中打开文档 注册为能够处理特定的文档 < em > Uniform Type 标识符(UTI) .

UIDocumentInteractionController 过去曾用作 在设备上的其他应用程序中打开文档的方法,用于 例如,从邮件应用程序打开电子邮件附件。

UIDocumentInteractionController

不幸的是,< em > UIDocumentInteractionController 的 UI 仅显示 六个应用程序

您不能保证您的应用程序将出现在列表中。 虽然 UIDocumentInteractionController 没有被弃用,但是 UIActivityViewController 提供了更灵活的 iOS 6.0替代品。

可用性: iOS 3.2 +

优点:

  • 允许共享具有广泛数组的公共数据类型 申请。

缺点:

  • 允许控制发送到 UIDocumentInteractionController 的数据类型,但不能控制目标。

  • 需要额外的用户交互。

  • 数量有限的数据目的地可能导致应用程序不显示在列表中。


UIActivityViewController:

允许用户使用数据数组执行许多操作。

例如,他们可能打印,电子邮件,复制,张贴到社会媒体,或打开 在另一份申请中。

您可以创建自己的 UIActivity 子类来提供自定义 服务。

UIActivityController

可用性: iOS 6.0 +

优点:

  • 非常适合与各种应用程序和社交媒体共享公共数据类型。

  • 可以为活动提供应用程序的项数组。对象应该符合 UIActivityItemSource 协议。

  • 具有设置排除活动类型的能力。

  • 分页 UI 比 UIDocumentInteractionController 允许更多的数据目标。

缺点:

  • 必须定义自定义活动类型以限制公共数据类型的“ Open In...”目标。

  • 需要额外的用户交互。


共享钥匙链接入:

允许您将数据安全地存储到共享密钥链 作为应用程序套件的一部分的应用程序可以访问。

所有共享密钥链访问的应用程序都必须使用相同的应用程序 ID 前缀。

有关共享钥匙链访问的实际例子,请参见: GenericKeychain 示例代码 .

Shared Key Chain

可用性: iOS 3.0 +

优点:

  • 安全访问数据。

缺点:

  • 您只能在共享公共应用程序 ID 前缀的应用程序之间共享数据。

  • IOS 模拟器上的 Keychain API 来自 OS X,它的 API 与 iOS 设备的 API 不同。


自订网址计划:

允许使用简单 URL 在应用程序之间传递数据。

Custom URL Scheme

可用性: iOS 3.0 +

优点:

  • 不需要网络连接。
  • 对于少量的数据,您可以很容易地编码成一个转义,合法的 URL 大。

缺点:

  • 必须将数据编码为转义的合法 URL。

注意: base64编码的常用方法是将可序列化的数据转换为字符串值。但是,base64字符串可能包含无法在 URL 中使用的字符。您可以考虑使用 base64url。请参阅使用 URL 和文件名安全字母表进行基本64编码了解更多信息。


ICloud API:

每个人都知道什么是 iCloud,正面和反面,所以没有更多的 对此的解释。

但是有人可能会问,如何才能在两者之间共享数据 单个设备中的应用程序有一些解决方案 做到这一点。

iCloud

这是可能的,因为用于 iCloud 的标识符是 不同于捆绑包标识符,因此可以共享 图像、视频和其他文件。

了解更多 参见关于这个话题的讨论


网上服务:

通过第三方(例如 Dropbox)或自定义构建的 web 同步数据 服务。

web service

可用性: iOS 2.0 +

优点:

  • 有助于共享和以其他方式分发大量数据。

缺点:

  • 需要网络连接。
  • Web 服务实现开销。

参考文献

您可以使用 https://github.com/burczyk/Camouflage将 NSData 读写到 iOS 摄像机滚动中,如下所示。Bmp 文件并在应用程序之间共享:)

全新的解决方案!

由于 iOS8,你可以很容易地在应用程序之间共享数据,只要他们在共同的应用程序组。

苹果的文档最好地解释了它在扩展上下文: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

基本上,你需要:

  1. 为你的苹果开发者程序定义 App Group ID (在 会员中心证书、标识符和配置文件部分)。
  2. 启用应用程序组功能,为每个需要通信的应用程序指定上述应用程序组 ID (cen 可以在 Xcode: 目标-> 能力或在 会员中心完成)。
  3. 使用两个 API 之一进行共享容器访问。

第一个 API 基于 NSUserDefaults:

NSString *appGroupId = @"group.my.group.id";


NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
initWithSuiteName:appGroupId];


[myDefaults setObject:@"foo" forKey:@"bar"];

第二个 API 是基于 NSFileManager的。它只是一个共享文件夹,你可以在获得它的 URL 之后访问它:

NSString *appGroupId = @"group.my.group.id";


NSURL *sharedFolderURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:appGroupId];

你放在 myDefaults或者 sharedFolderURL所指向的文件夹中的任何东西对于你所有的应用程序都是可见的和可访问的。

对于文件夹,请自动进行写/读操作,以确保不会出现死锁。

IOS8我已经成功访问相同的文件夹在使用“ App Group 的功能。”我扩展的答案@siejkowski。

注意: 只能在同一个开发者账号下工作。

为此,你必须遵循以下步骤。

  1. 首先从您的开发人员帐户启用“应用程序组”。
  2. 生成供应配置文件,并使用它。

现在您必须创建两个 Apps.SampleName

  1. 演示 _ 分享 _ 一
  2. 演示 _ 分享 _ 二

现在我们正在将图像从 演示 _ 分享 _ 一复制到“共享”文件夹,该文件夹是在启用应用程序组并运行应用程序时默认创建的。并将访问所有这些图像从 演示 _ 分享 _ 二

您必须采用组名,它被设置为您的开发人员帐户。

在两个应用程序中添加以下方法以获取共享文件夹 URL 的相对路径。

- (NSString *) getSharedLocationPath:(NSString *)appGroupName {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *groupContainerURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupName];
return [groupContainerURL relativePath];
}

现在我们从 演示 _ 分享 _ 一复制图像

-(IBAction)writeImage:(id)sender
{
for (int i = 0; i<15; i++)
{
NSString *strSourcePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"hd%d",i+1] ofType:@"jpg"];
NSString *strDestinationPath = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d",i+1]] ;


BOOL filewrite = [[NSFileManager defaultManager]copyItemAtPath:strSourcePath toPath:strDestinationPath error:nil];
if (filewrite)
NSLog(@"File write");
else
NSLog(@"can not write file");
}
}

现在在 演示 _ 分享 _ 二中访问这些图像

NSString *pathShared = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d.jpg",number]];
NSLog(@"%@",pathShared);
//BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:pathShared];
imgView.image = [UIImage imageWithContentsOfFile:pathShared];

现在你会得到所有的图像,你写从 演示 _ 分享 _ 一

所以从现在开始,如果你想共享这个文件夹两你的第三个应用程序。把这个应用加到你的小组里。因此,在您的多个应用程序中访问相同的元素太容易了。

如果您不在 AppID 中启用应用程序组,那么您将得到[ self getSharedLocationPath:@“ groupp.filesharingdemo”]为 null。

感谢苹果 从您自己的应用程序功能共享元素。编码愉快:)