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

Kam*_*war 76 iphone xcode ipad ios ios5

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

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

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

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

Dur*_*n.H 95

在iOS开发的沙盒世界中,应用程序之间共享数据可能会很困难由于iOS开发人员无法直接通过文件系统共享数据,因此他们需要为其应用程序找到替代解决方案.一些常见的解决方案包

  • UIDocumentInteractionController

  • UIActivityViewController

  • 共享钥匙串访问

  • 自定义URL方案

  • 网络服务

  • iCloud API


UIDocumentInteractionController:

允许用户在任何其他应用程序中打开文档,该文档注册为能够处理特定文档的统一类型标识符(UTI).

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

UIDocumentInteractionController

不幸的是,UIDocumentInteractionController的UI只显示六个应用程序.

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

可用性: iOS 3.2+

优点:

  • 允许与各种应用程序共享通用数据类型.

缺点:

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

  • 需要额外的用户交互.

  • 数量有限的目的地可能导致您的应用程序无法显示在列表中.


UIActivityViewController:

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

例如,他们可以打印,发送电子邮件,复制,发布到社交媒体或在其他应用程序中打开.

您可以创建自己的UIActivity子类,以便为用户提供自定义服务.

UIActivityController

可用性: iOS 6.0+

优点:

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

  • 可以提供一系列项目以应用于活动.对象应符合UIActivityItemSource协议.

  • 能够设置排除的活动类型.

  • 分页UI允许比UIDocumentInteractionController更多的数据目的地.

缺点:

  • 您必须定义自定义活动类型以限制常见数据类型的"打开方式..."目标.

  • 需要额外的用户交互.


共享钥匙串访问:

允许您将数据安全地存储到共享密钥链,以便属于一组应用程序的其他应用程序可以访问.

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

有关共享密钥链访问的示例.请参阅Apple的GenericKeychain示例代码.

共享密钥链

可用性: iOS 3.0+

优点:

  • 安全访问数据.

缺点:

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

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


自定义URL方案:

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

自定义URL方案

可用性: iOS 3.0+

优点:

  • 无需网络连接.
  • 非常适合您可以轻松编码为转义合法网址的少量数据.

缺点:

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

    注意:通常使用base64编码将可序列化数据转换为字符串值.但是,base64字符串可能包含在URL中使用无效的字符.您可以考虑使用base64url.有关详细信息,请参阅Base 64编码与URL和文件名安全字母.


iCloud API:

每个人都知道什么是iCloud,优点和缺点所以没有更多的解释.

但有人可能会问,如何在单个设备内的应用程序之间共享数据,有一些解决方法可以实现这一点.

iCloud的

这是可能的,因为用于iCloud的标识符与包标识符不同,因此可以共享图像,视频和其他文档.

要了解更多信息,请参阅有关此主题的讨论


网络服务:

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

网络服务

可用性: iOS 2.0+

优点:

  • 用于共享和分发大量数据.

缺点:

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

参考

  • 喜欢广泛的答案和使用图形 (3认同)

Chi*_*ani 50

iOS 8开始,我使用" App Group功能 " 成功访问了Same文件夹.我正在扩展@siejkowski的答案.

注意:它仅适用于同一个开发人员帐户.

为此,您必须按照以下步骤操作.

  1. 首先从您的开发者帐户启用"应用组".
  2. 生成供应配置文件.并使用它.

现在您必须创建两个应用程序.样品名称

  1. Demo_Share_One
  2. Demo_Share_Two

现在我们将图像从Demo_Share_One复制到共享文件夹,该文件夹在您启用应用程序组并运行应用程序时默认创建.并将从Demo_Share_Two访问所有这些图像.

您必须为您的开发者帐户设置Take Group Name.lets说group.filesharingdemo.

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

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

现在我们从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");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在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];
Run Code Online (Sandbox Code Playgroud)

现在,您将获得您从Demo_Share_One写的所有图像.

所以从现在开始如果你想分享这个文件夹两个你的第三个应用程序.只需在您的论坛中添加该应用即可.因此,在您的多个应用中访问相同的元素太容易了.

如果您不在AppID中启用应用程序组,那么您将获得[self getSharedLocationPath:@"group.filesharingdemo"]为空.

感谢Apple 从您自己的应用程序功能中获取Share Elements.快乐的编码.:)


bau*_*dot 35

从历史上看,iPhone一直试图阻止应用程序之间的数据共享.这个想法是,如果你无法获得另一个应用程序的数据,你就不会对该应用程序做任何坏事.

在最近的IOS版本中,他们放松了一点.例如,iOS编程指南现在有一个部分,通过让一个应用程序声明某个URL前缀,然后让其他应用程序引用该URL,在应用程序之间传递数据.因此,也许您将事件应用设置为回答"event://"网址的方式与网络服务器回答"http://"网址的方式相同.

苹果的这种做法的文件是在这里.

看看"实现自定义URL方案".

  • 如果你正在阅读这篇文章,请务必查看下面的@siejkowski回复,因为它是最新的. (2认同)
  • 是的,自从我写这篇回复以来,已经有很多更好的方法.老问题有旧答案! (2认同)

sie*_*ski 16

从iOS 8开始,只要它们位于通用应用程序组中,您就可以轻松地在应用程序之间共享数据.

Apple文档最好在Extensions上下文中解释:https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

基本上,你需要:

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

第一个API基于NSUserDefaults:

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

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

[myDefaults setObject:@"foo" forKey:@"bar"];
Run Code Online (Sandbox Code Playgroud)

第二个API基于NSFileManager.它只是一个共享文件夹,您可以在获取它的URL后访问它:

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

NSURL *sharedFolderURL = [[NSFileManager defaultManager] 
                           containerURLForSecurityApplicationGroupIdentifier:appGroupId];
Run Code Online (Sandbox Code Playgroud)

您放入的任何内容myDefaults或指向的文件夹sharedFolderURL都将对您的所有应用程序可见并可访问.

在文件夹的情况下,请原子地写/读只是为了确保没有死锁.


Jug*_*teR 14

可以在应用之间共享数据?是的!

使用iOS 3.0提供的UIPasteBoard,可在此处获取文档.Apple文档说:

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

也可以在钥匙串中的应用程序之间共享数据,尽管数据主要是密码等,可以存储任何可序列化的数据. 是关于它的Stack Overflow问题.