背景:
我們公司目前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交互數據的方式: