iOS應用程序間共享數據

我們知道iOS由於沙盒的存在,應用程序不能越過自己的區域去訪問別的存儲空間的內容,不過可能有許多場景我們需要在應用程序之間共享數據,比如多個應用共用用戶名密碼進行登錄等。雖然我們不能直接通過文件系統來分享數據,不過還是有些方法可以實現,爲了方便說明,這裏同時創建了兩個工程Example1和Example2,實現這兩個app之間的信息共享,Example1負責寫數據,Example2負責讀數據,具體的demo代碼可以到這裏獲取

UIPasteboard

剪貼板是應用程序之間傳遞數據的簡單方式,建議不要使用全局的粘貼板,而是自己根據名字創建一個新的粘貼板,防止其它地方全局拷貝的影響。然後把需要共享的內容複製到粘貼板,粘貼板的內容可以是文本、URL、圖片和UIColor等,另一個app就可以根據粘貼板的名字去讀取相關的信息。

Example1設置粘貼板的內容:

    UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:YES];
    pasteboard.string = @"myShareData";

Example2讀取粘貼板的內容:

    UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:NO];
    NSString *content = pasteboard.string;

Custom URL Scheme

URL Scheme能夠讓我們通過自定義的協議在應用程序間傳遞信息,當你想要發送數據給一個實現了自定義URL Scheme的應用時,只需要創建好合適格式的URL,然後調用openURL:方法,系統就會載入註冊了該scheme的應用然後將你的URL傳遞給他,比如如下的代碼,todolist是一個其它應用註冊的scheme,通過openURL便可以將服務請求發送到該應用(自定義的URL Scheme要能夠唯一標示該APP,如果你的URL Scheme跟別人衝突了,那麼你的app就不一定會被調起,iOS並不保證調用哪個應用)。

NSURL *myURL = [NSURL URLWithString:@"todolist://newid=20"];
[[UIApplication sharedApplication] openURL:myURL];
  • 註冊URL Scheme
    爲了能夠處理URL請求,我們需要先註冊自定義的URL Scheme,只需要在Info tab下的URL Types添加即可,比如我們這裏註冊Example2的URL Scheme。
註冊URL scheme

Identifier用於標示名稱,爲了唯一性可以採用反轉域名的形式,另外我們設置URL Scheme爲Example2,以及role爲Viewer(Viewer表示只能讀取改URL但不能修改,Editor可以對URL進行讀寫),這樣Example2就能夠接受類似"Example2:\"的URL請求了,可以在瀏覽器中輸入"Example2:\"鏈接打開app。

  • 處理URL請求

當有URL請求到來時,所有的URL都會傳遞給你的app delegate,我們需要實現application:openURL:sourceApplication:annotation:方法來接收處理對應的URL,所以假如你想通過URL方式來傳遞數據,只需要將數據添加到URL中即可,另外的通過解析該URL來獲取對應的數據。

Eaxmple1發送攜帶參數的URL到Example2:

NSString *string = @"Example2://name=jiangbin#age=1";
NSURL *url = [NSURL URLWithString:string];
[[UIApplication sharedApplication] openURL:url];

Example2處理URL請求並解析:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([[url scheme] isEqualToString:@"Example2"]) {
        NSString *content = [url resourceSpecifier];
        //解析content獲取數據
        //...
        return YES;
    }
    return NO;
}

Shared Keychain Access

iOS的keychain提供一種安全保存信息的方式,可以保存密碼等數據,而且keychain中的數據不會因爲你刪除app而丟失,你可以在重新安裝後繼續讀取keychain中的數據。通常每個應用程序只允許訪問自己在keychain中保存的數據,不過假如你使用同一個證書的話,不同的app也可以通過keychain來實現應用間的數據共享,之前下載百度貼吧應用的時候發現首次打開它就自動登錄了,可能百度的應用之間就是通過這種方式共享用戶名密碼進行登錄的,之前登錄過百度雲。

爲了實現keychain共享數據,我們需要開啓Keychain Sharing,開啓方法如下,然後添加設置相同的Keychain Group,不過別忘記了添加Security.framework。

Example1
Example2

Example1保存數據到keychain(爲了簡單使用SSKeychian)

- (void)setKeyChain
{
    [SSKeychain setPassword:@"shareData" forService:@"myservice" account:@"jiangbin"];
}

Example2讀取數據

- (IBAction)getByKeychain:(id)sender
{
    NSString *myData = [SSKeychain passwordForService:@"myservice" account:@"jiangbin"];
}

App Groups

iOS8之後蘋果加入了App Groups功能,應用程序之間可以通過同一個group來共享資源,app group可以通過NSUserDefaults進行小量數據的共享,如果需要共享較大的文件可以通過NSFileCoordinator、NSFilePresenter等方式。
開啓app groups,需要添加一個group name,app之間通過這個group共享數據:

App Groups

Example1根據group name設置內容:

- (void)setAppGroup
{
    NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
                                  initWithSuiteName:@"group.com.jiangbin.SharedData"];
    [myDefaults setObject:@"shared data" forKey:@"mykey"];
}

Example2根據group name讀取數據

- (void)getByAppGroup
 {
    NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
                                  initWithSuiteName:@"group.com.jiangbin.SharedData"];
    NSString *content = [myDefaults objectForKey:@"mykey"];
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章