不同App之间共享数据

Posted 小课桌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不同App之间共享数据相关的知识,希望对你有一定的参考价值。

我们知道ios由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等。虽然我们不能直接通过文件系统来共享数据,不过还是有些方法可以实现。

这里,我们新建两个工程,T1:负责写数据,T2:负责读数据。

 

方法一:UIPasteboard

剪贴板是应用程序之间传递数据的简单方式,建议不要使用全局的粘贴板,而是自己根据名字创建一个新的粘贴板,防止其它地方全局拷贝的影响。然后把需要共享的内容复制到粘贴板,粘贴板的内容可以是文本、URL、图片和UIColor等,另一个app就可以根据粘贴板的名字去读取相关的信息。

T1设置剪贴板内容:

UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:YES];
pasteboard.string = @"myShareData";

T2读取剪贴板内容:

UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:NO];
NSString *content = pasteboard.string;

 

方法二:共享钥匙串

iOS的keychain提供一种安全保存信息的方式,可以保存密码等数据,而且keychain中的数据不会因为你删除app而丢失,你可以在重新安装后继续读取keychain中的数据。通常每个应用程序只允许访问自己在keychain中保存的数据,不过假如你使用同一个证书的话,不同的app也可以通过keychain来实现应用间的数据共享。

为了实现keychain共享数据,我们需要开启Keychain Sharing,开启方法如下,然后添加设置相同的Keychain Group,不过别忘记了添加Security.framework。

注:钥匙串清理的时机:1、重置手机;2、使用代码手动清理。除了这两种情况,其他情况都不会被清理。

T1应用保存数据至keyChain,T2应用从keyChain读取数据:

#import "ViewController.h"
#import <SAMKeychain/SAMKeychain.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // T1应用保存数据至keyChain
    [SAMKeychain setPassword:@"qwe" forService:@"sss" account:@"qqq"];
}

@end
#import "ViewController.h"
#import <SAMKeychain/SAMKeychain.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // T2应用从keyChain读取数据
    NSString *s = [SAMKeychain passwordForService:@"sss" account:@"qqq"];
    NSLog(@"%@",s);
}

@end

 

方法三:App Groups

iOS8之后苹果加入了App Groups功能,应用程序之间可以通过同一个group来共享资源,app group可以通过NSUserDefaults进行小量数据的共享,如果需要共享较大的文件可以通过NSFileCoordinator、NSFilePresenter等方式。
开启app groups,两个应用T1和T2都需要添加一个相同的group name,app之间通过这个group共享数据。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // T1通过AppGroup的名字创建信号设置并设置数据
    NSUserDefaults *myDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.yss"];
    [myDefaults setObject:@"shared data" forKey:@"mykey"];
}

@end
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // T2根据AppGroup的名字创建偏号设置并读取数据
    NSUserDefaults *myDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.yss"];
    NSString *content = [myDefaults objectForKey:@"mykey"];
    NSLog(@"%@",content);
}

@end

 

方法四:通过Custom URL Scheme

这个主要是应用跳转方面的知识,就不在这里做过多讲解了。

以上是关于不同App之间共享数据的主要内容,如果未能解决你的问题,请参考以下文章

不同App之间共享数据

片段之间的共享数据(父列表视图和子列表视图)

在 iOS 中具有不同 App ID 前缀的应用程序之间共享数据

共享元素转换在父片段和子片段之间不起作用(嵌套片段)

使用新的架构组件 ViewModel 在片段之间共享数据

如何在两个 iOS 应用之间共享应用内购买数据?