在两个或多个iPhone应用程序之间共享数据
这是可能在同一设备上的两个应用程序之间共享数据?
或者我可以允许其他应用程序使用我的应用程序的信息/数据或以任何其他方式?
例如,第一个应用程序是用于事件pipe理的,我用它来保存一些事件。 第二个应用程序是提醒,它会从其他应用程序获取数据,以提醒我有关事件。
这只是一个简单的例子,不是一个真实的场景。
历史上,iPhone已经试图阻止应用程序之间的数据共享。 这个想法是,如果你不能得到另一个应用程序的数据,你不能做任何不好的应用程序。
在最近的IOS版本中,他们已经放松了一点。 例如,iOS编程指南现在有一个关于在应用程序之间传递数据的部分,方法是让一个应用程序声明某个URL前缀,然后让其他应用程序引用该URL。 所以,也许你设置你的事件应用程序来回答“事件:/ /”的url,就像networking服务器回答“http://”url一样。
苹果关于这种方法的文档就在这里 。
在“实现自定义URL模式”下查看。
在iOS开发的沙箱中 ,共享应用程序之间的数据可能很困难由于iOS开发人员无法直接通过文件系统共享数据,因此需要为其应用程序find备用解决scheme。 一些常见解决scheme包括
-
UIDocumentInteractionController
-
UIActivityViewController
-
共享钥匙串访问
-
自定义urlscheme
-
networking服务
-
iCloud API
UIDocumentInteractionController:
允许用户在注册为能够处理特定文件统一types标识符(UTI)的任何其他应用程序中打开文档。
过去,UIDocumentInteractionController用作在设备上的其他应用程序中打开文档的手段,例如,从邮件应用程序打开电子邮件附件。
不幸的是, UIDocumentInteractionController的UI仅显示六个应用程序 。
您不能保证您的应用程序将出现在列表中。 虽然UIDocumentInteractionController尚未被弃用,但UIActivityViewController在iOS 6.0中提供了更灵活的替代scheme。
可用性: iOS 3.2+
优点:
- 允许与各种应用程序共享通用数据types。
缺点:
-
允许控制发送到UIDocumentInteractionController的数据types,但不控制目的地。
-
需要额外的用户交互。
-
有限数量的数据目标可能导致您的应用程序不显示在列表中。
UIActivityViewController:
允许用户使用一组数据执行多个操作。
例如,他们可以打印,发送电子邮件,复制,张贴到社交媒体,或在另一个应用程序中打开。
您可以创build自己的UIActivity子类来为用户提供自定义服务。
可用性: iOS 6.0+
优点:
-
非常适合与大量应用程序和社交媒体共享常用数据types。
-
可以提供应用程序的一系列项目到一个活动。 对象应符合UIActivityItemSource协议。
-
有能力设置排除的活动types。
-
分页UI允许比UIDocumentInteractionController更多的数据目标。
缺点:
-
您必须定义一个自定义活动types来限制常用数据types的“Open In …”目标。
-
需要额外的用户交互。
共享钥匙串访问:
允许您将数据安全地存储到共享钥匙串中,作为应用程序套件一部分的其他应用程序可以访问这些钥匙串。
共享钥匙串访问的所有应用程序必须使用相同的应用程序ID前缀。
有关共享钥匙串访问的示例。 请参阅Apple的GenericKeychain示例代码 。
可用性: iOS 3.0+
优点:
- 安全访问数据。
缺点:
-
您只能在共享应用程序ID前缀的应用程序之间共享数据。
-
iOS模拟器上的Keychain API来自OS X,它具有与iOS设备不同的API。
自定义urlscheme:
允许数据在使用简单URL的应用程序之间传递。
可用性: iOS 3.0+
优点:
- 不需要networking连接。
- 非常适合less量数据,您可以轻松地将其编码到转义的合法URL中。
缺点:
-
您必须将数据编码到转义的合法URL中。
注意: base64编码已经看到了将可序列化的数据转换为string值的常见用法。 但是,base64string可能包含在URL中使用无效的字符。 你可能会考虑使用base64url。 有关更多信息, 请参阅使用URL和文件名安全字母表的Base 64 Encoding 。
iCloud API:
每个人都知道什么是iCloud,优点和缺点,所以没有更多的解释。
但是有人可能会问,如何在单个设备内部的应用程序之间共享数据,有一些解决方法可以实现。
这是可能的,因为用于iCloud的标识符与包标识符不同,因此可以共享图像,video和其他文档。
要了解更多, 请参阅关于此主题的讨论
networking服务:
通过第三方(例如Dropbox)或定制的networking服务同步数据。
可用性: iOS 2.0+
优点:
- 用于共享和分发大量数据。
缺点:
- 需要networking连接。
- Web服务实现开销。
参考
从iOS 8我已经成功访问使用“ 应用程序组function ”相同的文件夹。我扩展了@siejkowski的答案。
为此,你必须按照下面的步骤。
- 首先从您的开发者帐户启用“应用程序组”。
- 生成configuration文件。 并使用它。
现在你必须创build两个应用程序。 样品名称
- Demo_Share_One
- Demo_Share_Two
现在,我们正在将Demo_Share_One中的图像复制到启用应用程序组并运行应用程序时默认创build的共享文件夹中。 并将从Demo_Share_Two访问所有这些图像。
您必须将组名称设置为开发者帐户。小组说, group.filesharingdemo
。
在两个应用程序中添加下面的方法来获取共享文件夹url的相对path。
- (NSString *) getSharedLocationPath:(NSString *)appGroupName { NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *groupContainerURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupName]; return [groupContainerURL relativePath]; }
现在我们从Demo_Share_One复制Bundle中的图像
-(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"); } }
现在在Demo_Share_Two中访问这些图像
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];
现在,您将获得您从Demo_Share_One写入的所有图像。
所以从现在开始,如果你想共享这个文件夹两个你的第三个应用程序。 只需在你的组中添加该应用程序。 所以在多个应用程序中访问相同的元素太容易了。
如果你不能在你的AppID中启用应用程序组,那么你将得到[self getSharedLocationPath:@“group.filesharingdemo”]为null。
感谢来自您的应用程序function的苹果分享元素 。 快乐的编码。 🙂
从iOS 8开始,只要应用程序位于通用应用程序组中,您就可以轻松地在应用程序之间共享数据。
苹果文档最好在扩展上下文中解释它: https : //developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html
基本上,你需要:
- 定义应用程序组ID(位于Apple开发人员计划成员中心的 证书,标识符和configuration文件部分)。
- 启用应用程序组function,为每个需要通信的应用程序指定上述应用程序组ID(在Xcode: 目标 – >function或成员中心中完成 )。
- 使用两个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
指向的文件夹中的任何内容都将可见并可供所有应用程序访问。
在文件夹的情况下,请写/读primefaces只是为了确保没有死锁是可能的。
在应用之间共享数据可能 是的!
使用iOS 3.0提供的UIPasteBoard,文档可以在这里find 。 苹果文档说:
UIPasteboard类使应用程序可以在应用程序中共享数据,也可以与使用系统范围或特定于应用程序的粘贴板的其他应用程序共享数据。
也可以在钥匙串中的应用程序之间共享数据,尽pipe数据主要是为了密码等,可以存储任何可序列化的数据。 这是关于这个堆栈溢出问题。
您可以使用自定义URLscheme来访问从一个应用程序到另一个的数据。 按照下面提到的链接获取更多信息 –
http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
提到通过UIPasteBoard在应用程序之间共享数据仅适用于iOS7中同一应用程序组中的应用程序。 正如苹果所说:
+ [UIPasteboard pasteboardWithName:create:]和+ [UIPasteboard pasteboardWithUniqueName]现在是唯一的给定名称,只允许同一应用程序组中的应用程序访问粘贴板。 如果开发人员试图创build一个名称已经存在但不属于同一应用程序套件的粘贴板,他们将获得自己独特的私人粘贴板。 请注意,这并不影响系统提供的粘贴板,一般和查找。
您可以使用https://github.com/burczyk/Camouflage来读取和写入iOS相机胶卷的NSData作为;.bmp文件,并在应用程序之间共享它:)
全新的解决scheme!
如果您不介意触及networking,则可以实施自定义Web服务,或使用某种云服务。 iCloud本身在这里用处不大; 它只允许您在不同设备上的相同应用程序之间共享数据。 你可以在这里阅读关于iCloud的信息 。
在不使用networking的情况下,您可以利用“ 快速应用切换 ”通过URL编码在应用之间传输有限的数据。 实际可传输的数据量我不知道,但是我确定会非常有限。
JugsteR和baudot的答案在这种情况下是最好的。
不,您将不得不使用一些云解决scheme。