iOS开发技术分享iOS学习开发iOS猛码计划

iOS 不同 App 数据共享

2019-03-13  本文已影响20人  uniapp

我们都知道,iOS 的 App 采用沙盒机制,使得不同的 App 在 iPhone 设备上保存的位置相互独立,从而保证 App 数据安全。沙盒机制只允许 App 访问自身数据,但是有时候,同样公司生产的 App 数据间有需要共享的需求:比如抖音 App 想要访问头条中的账号信息。苹果考虑到这种实际需求,通过 groups 和 keychain sharing 来具体实现。

同一开发者、不同 App 共享数据的 groups 通过 NSUserDefaults 来创建。[NSUserDefaults standardUserDefaults] 创建的 Group 只能访问本 App 沙数据。通过方法[[NSUserDefaults alloc] initWithSuiteName:@"xx"]可以创建用于 App 共享的容器。

下面介绍一下具体使用方式。
1 在 Xcode 中打开本工程 App Group 功能:


App Group.png

添加具体 group 名称, 保持以 group 开头。
2 添加具体使用代码:

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextField *pwdTF;

@property (nonatomic, strong) NSUserDefaults *groupDefault;

@property (nonatomic, copy) NSString *keyString;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.groupDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.zhudong10.AppSuite"];
    self.keyString = @"group.com.zhudong10.pwd";
}

- (IBAction)saveAction:(id)sender {
    
    NSString *pwdString = self.pwdTF.text;
    if (!pwdString.length) {
        [self showTipString:@"pwd can't be empty"];
        return;
    }
    
    [self.groupDefault setObject:pwdString forKey:self.keyString];
    [self showTipString:@"pwd save success"];
    
}

- (void)showTipString:(NSString *)tips{
    
    UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"Tips" message:tips preferredStyle:(UIAlertControllerStyleAlert)];
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"ok" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
        [alertC popoverPresentationController];
    }];
    [alertC addAction:action];
    [self presentViewController:alertC animated:true completion:nil];
    
}

- (IBAction)clearAction:(id)sender {
    
       self.pwdTF.text = nil;
    
}
- (IBAction)readAction:(id)sender {
    NSString *pwdString = [self.groupDefault objectForKey:self.keyString];
    self.pwdTF.text = pwdString;
    
}

3 另外一个项目中采用同样的上述设置。

最后当在 AppOne 中通过 key group.com.zhudong10.pwd存储了数据后,在 AppTwo 中就可以通过相同的 key 值进行访问。

具体代码可以参考 github

通过 group 存储的数据,会随着 App 的全部删除而丢失。只要设备上存在一个账号下某一个 App ,那么共享 Group 中的数据就不会丢失。

如果想要在 App 删除后,仍然在设备上保存数据,可以使用 Keychain Sharing. 它的使用和上面 group 的使用方式类似,通过 SAMKeyChain 可以方便地进行数据的存储和读取。

底层的实现机理是 iOS 会将 group 和 keychain 展开成如下具体 ID:

[$(teamID).com.example.SharedItems,
 $(teamID).com.example.AppOne,
 $(teamID).group.com.example.AppSuite]

最终会通过 teamID 来区分是否是同一开发者。这样每一个 App 存储的数据就有以上三种形式。第一种数据一般指账号、密码等用户敏感信息,由于加密和解密,存储和读取速度较慢。另外两个用来存储用户偏好设置,记录 App 普通数据。关于三者的更详细信息,可以参考官方文档:Sharing Access

喜欢和关注,都是对我的鼓励和支持~
上一篇 下一篇

猜你喜欢

热点阅读