我們知道iOS由於沙盒的存在,應用程序不能越過自己的區域去訪問別的存儲空間的內容,不過可能有許多場景我們需要在應用程序之間共享數據,比如多個應用共用用戶名密碼進行登錄等。雖然我們不能直接通過文件系統來分享數據,不過還是有些方法可以實現,為了方便說明,這里同時創建了兩個工程send和receive,實現這兩個app之間的信息共享,send負責寫數據,receive負責讀數據,具體的demo代碼可以到這里獲取
UIPasteboard
剪貼板是應用程序之間傳遞數據的簡單方式,建議不要使用全局的粘貼板,而是自己根據名字創建一個新的粘貼板,防止其它地方全局拷貝的影響。然后把需要共享的內容復制到粘貼板,粘貼板的內容可以是文本、URL、圖片和UIColor等,另一個app就可以根據粘貼板的名字去讀取相關的信息。
send設置粘貼板的內容:
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:YES];
pasteboard.string = @"myShareData";
receive讀取粘貼板的內容:
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:NO];
NSString *content = pasteboard.string;
Custom URL Scheme
利用OpenUrl共享數據請看http://www.cnblogs.com/qiaomc/p/5818445.html鏈接
Shared Keychain Access
iOS的keychain提供一種安全保存信息的方式,可以保存密碼等數據,而且keychain中的數據不會因為你刪除app而丟失,你可以在重新安裝后繼續讀取keychain中的數據。通常每個應用程序只允許訪問自己在keychain中保存的數據,不過假如你使用同一個證書的話,不同的app也可以通過keychain來實現應用間的數據共享
為了實現keychain共享數據,我們需要開啟Keychain Sharing,開啟方法如下,然后添加設置相同的Keychain Group,不過別忘記了添加Security.framework。
注意:send和receive兩個項目都需要開啟Keychain Sharing,開啟之后會生成xxxxx.entitlements文件,需要在receive項目里的xxxxx.entitlements文件添加send的bundle ID才能正常共享數據
send
receive
send保存數據到keychain(為了簡單使用SSKeychian)
[SSKeychain setPassword:@"shareData" forService:@"myservice" account:@"qmc"];
receive讀取數據
NSString *myData = [SSKeychain passwordForService:@"myservice" account:@"qmc"];
App Groups
iOS8之后蘋果加入了App Groups功能,應用程序之間可以通過同一個group來共享資源,app group可以通過NSUserDefaults進行小量數據的共享,如果需要共享較大的文件可以通過NSFileCoordinator、NSFilePresenter等方式。
開啟app groups,需要添加一個group name,app之間通過這個group共享數據:
send項目根據group name設置內容:
NSUserDefaults *myDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.cn.goldenshiel.shareData"];
[myDefaults setObject:@"shared data" forKey:@"mykey"];
receive根據group name讀取數據
NSUserDefaults *myDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.cn.goldenshiel.shareData"];
NSString *content = [myDefaults objectForKey:@"mykey"];
此外,如果數據量比較大,則需要保存到數據庫或文件中,共享數據庫或文件的通過NSFileManager來實現
代碼如下:
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSURL *url = [fileMgr containerURLForSecurityApplicationGroupIdentifier:@"group.cn.neiwang.gview"];