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

时间:2012-02-24 05:09:40

标签: iphone ios xcode ipad ios5

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

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

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

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

10 个答案:

答案 0 :(得分:93)

  

在iOS开发的沙盒世界之间共享数据   应用程序可以证明困难因为iOS开发人员无法共享数据   直接通过文件系统,他们需要找到替代品   解决方案的应用。一些常见的解决方案包括:

  • UIDocumentInteractionController

  • UIActivityViewController

  • 共享钥匙串访问

  • 自定义网址计划

  • 网络服务

  • iCloud API


UIDocumentInteractionController:

  

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

     

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

UIDocumentInteractionController

  

不幸的是, UIDocumentInteractionController的UI仅显示   六个申请

     

您不能保证您的应用程序将出现在列表中。   虽然UIDocumentInteractionController尚未弃用,但是   从iOS 6.0开始, UIActivityViewController 提供了更灵活的替换。

可用性: iOS 3.2 +

<强> 优点:

  • 允许使用各种常见数据类型进行共享 的应用程序。

<强> 缺点:

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

  • 需要额外的用户互动。

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


UIActivityViewController:

  

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

     

例如,他们可以打印,发送电子邮件,复制,发布到社交媒体或打开   在另一个申请中。

     

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

UIActivityController

可用性: iOS 6.0 +

<强> 优点:

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

  • 可以提供应用于活动的项目数组。对象应符合UIActivityItemSource协议。

  • 能否设置排除的活动类型。

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

<强> 缺点:

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

  • 需要额外的用户互动。


共享钥匙串访问:

  

允许您将数据安全地存储到另一个共享钥匙串中   属于一套应用程序的应用程序可以访问。

     

所有共享钥匙串访问权限的应用程序必须使用相同的应用程序ID   字首。

     

有关共享密钥链访问的示例。请参阅Apple’s GenericKeychain sample code

Shared Key Chain

可用性: iOS 3.0 +

<强> 优点:

  • 安全访问数据。

<强> 缺点:

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

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


自定义网址方案:

  

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

Custom URL Scheme

可用性: iOS 3.0 +

<强> 优点:

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

<强> 缺点:

  • 您必须将数据编码为转义的合法网址。

    注意: base64编码常见的用途是将可序列化数据转换为字符串值。但是,base64字符串可能包含在URL中使用无效的字符。您可以考虑使用base64url。 See Base 64 Encoding with URL and Filename Safe Alphabet了解更多信息。


iCloud API:

  

每个人都知道什么是iCloud,优点和缺点,所以不再   解释。

     

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

iCloud

  

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

     

了解更多see the discussion on this topic


网络服务:

  

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

web service

可用性: iOS 2.0 +

<强> 优点:

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

<强> 缺点:

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

Reference

答案 1 :(得分:48)

iOS 8 我使用&#34; 应用程序组功能&#34;成功访问了相同的文件夹。我正在扩展@siejkowski的答案。

注意:它仅适用于同一个开发者帐户。

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

  1. 首先启用&#34;应用程序组&#34;来自您的开发者帐户。
  2. 生成配置文件。并使用它。
  3. 现在您必须创建两个应用程序。样品名称

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

      您必须获取设置为开发者帐户的群组名称。小时说group.filesharingdemo

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

      - (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:@&#34; group.filesharingdemo&#34;]为空。

      感谢Apple从您自己的应用功能中共享元素。快乐的编码。 :)

答案 2 :(得分:31)

从历史上看,iPhone一直试图阻止应用之间的数据共享。我的想法是,如果你无法获得其他应用程序的数据,那么你就无法对该应用程序做任何坏事。

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

Apple关于该方法的文档是here

了解“实施自定义网址方案”。

答案 3 :(得分:16)

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

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

基本上,您需要:

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

    NSString *appGroupId = @"group.my.group.id";
    
    NSUserDefaults *myDefaults = [[NSUserDefaults alloc] 
                        initWithSuiteName:appGroupId];
    
    [myDefaults setObject:@"foo" forKey:@"bar"];
    

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

    NSString *appGroupId = @"group.my.group.id";
    
    NSURL *sharedFolderURL = [[NSFileManager defaultManager] 
                               containerURLForSecurityApplicationGroupIdentifier:appGroupId];
    

    您放在myDefaults内的任何内容或sharedFolderURL指向的文件夹都将显示在您的所有应用中。

    如果是文件夹,请以原子方式写/读,以确保不会发生死锁。

答案 4 :(得分:14)

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

使用iOS 3.0提供的UIPasteBoard,可以获得文档here。 Apple文档说:

  

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

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

答案 5 :(得分:4)

您可以使用自定义网址方案访问从一个应用到另一个应用的数据。请按照以下提到的链接获取更多信息 -

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

您可以使用https://github.com/burczyk/Camouflage将NSData作为.bmp文件读取和写入iOS Camera Roll,并在应用之间共享:)

全新的解决方案!

答案 8 :(得分:2)

如果您不介意点击网络,可以实现自定义Web服务来执行此操作,或使用某些云服务。 iCloud本身在这里没什么用处;它只允许您在不同设备上的同一个应用程序之间共享数据。您可以阅读有关iCloud here的信息。

在不使用网络的情况下,您可以利用“fast app switching”通过网址编码在应用之间传输有限数量的数据。可转让的实际数据量我不知道,但我确定它会非常有限。

在这种情况下,JugsteR和baudot的答案是最好的。

答案 9 :(得分:-3)

没有。您将不得不使用一些云解决方案。