zoukankan      html  css  js  c++  java
  • 不同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

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

  • 相关阅读:
    s-100与s-57电子海图的区别二 电子海开发一百篇第五十二篇
    s-100系列电子海图与s57电子海图的区别,电子海图开发一百篇第五十一篇
    S-100电子海图标准简述 电子海图开发一百篇第五十篇
    电子海图开发第四十九篇 船舶综合导航系统的设计(共一百篇)
    公有云成本节省神器!京东云共享带宽包正式上线
    1小时800箱,动力机器人真·搬砖16小时不续航;苹果官宣 WWDC 全球开发者大会召开时间;基于图神经网络的分级相关性匹配
    京东云智臻链开源两周年,JD Chain领跑国内自研区块链技术
    1800 美金?Apache ShardingSphere 带薪远程实习招募啦!| 2021 Google 编程之夏
    一体化智能安全防御 京东云星盾安全加速正式发布
    【技术面对面】单目多人3D人体网格恢复算法介绍
  • 原文地址:https://www.cnblogs.com/panda1024/p/6388019.html
Copyright © 2011-2022 走看看