我們知道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
這個主要是應用跳轉方面的知識,就不在這里做過多講解了。