app之间使用UIPasteboard读取数据的坑

背景:

我们公司目前3个App,假设称之为A、B、C,后台用户系统是一套,当然,这3个应用的appid都是在我们公司的一个苹果开发账号下。

遇到的问题

A和B是上线了好久的应用,并且A登录了之后会将登录信息写在A创建的粘贴板上,B应用可以直接读取粘贴板中的登录信息,一键登录。反之亦然。
现在我们新开发了C,也想只要安装了A或者B,C就可以一键登录。使用之前AB之间的方式如法炮制,结果,到了C里却不行了。怎么样都读取不到A或者B的粘贴板。

问题的原因

研究了很久才发现,原来苹果开发账号创建Appid的时候。需要选择一个prefix

但是其实我们往往到这步,都不会注意该选择哪个prefix,或者选项里就一个prefix。但是我们这里有3个。。。。。原因可能是和cer开头的那个开发证书有3个有关系。
而这个prefix的选择其实是很重要的,因为如果appid生成之后,想再改的话就只能联系苹果客服了。
而选择了相同prefix的appid,才可以相互读取UIPasteboard,以及keychain。所以A、B两个app当时都用了同一个prefix,所以相互读取

解决

找到原因后,如何解决问题呢?
方法1:和苹果客服联系,看能否更改prefix。这个还么有尝试是否可以。
方法2: 将两个app,都加入相同的appGroups,然后将数据存入userdefault就可以相互读取了。
但是读或者写UserDefault的方式和平时使用都不太一样

+ (NSString *)widgetStringForKey:(NSString *)defaultName {
    NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxx.xxx"];
    return [shared stringForKey:defaultName];
}

+ (void)widgetSetObject:(id)value forKey:(NSString *)defaultName {
    NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxx.xxx"];
    [shared setObject:value forKey:defaultName];
    [shared synchronize];
}

另外这篇文章总结了两个app交互数据的方式:

http://freemind-lj.github.io/2016/02/02/iOS应用程序间共享数据/

posted @ 2017-05-19 21:53  张驰小方块  阅读(1797)  评论(0编辑  收藏  举报