首页 > 代码库 > 不同App之间共享数据

不同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之间共享数据