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

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

  • 相关阅读:
    Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》
    Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》
    Android Studio突然不显示logcat日志
    Xcode 调试技巧 --常用命令和断点
    (译)Objective-C 类属性
    Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》
    Android Studio 中设置代码块自动补齐
    RunLoop总结:RunLoop的应用场景(三)
    Android Studio精彩案例(三)《模仿微信ViewPage+Fragment实现方式二》
    .net学习视屏
  • 原文地址:https://www.cnblogs.com/panda1024/p/6388019.html
Copyright © 2011-2022 走看看