在iOS開發中,在很多情況下我們需要完成應用之間的文檔共享。然而,iOS為應用提供的是一個運行沙箱,一個應用程序無法直接和另一個應用程序通訊,所以應用之間如果要共享文檔的話需要通過一些系統提供的應用交互手段。
iOS應用程序之間交互的一個簡單手段是“URL Scheme”,就是通過UIApplication的openURL方法,使用“<應用名>://”這樣的URL形式指定應用,同時可以在URL中加入一些類似於http的get請求的參數,用於傳遞簡單數據,代碼樣例如下:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myapp://test_page/one?token=12345&user=ABC" ]];
以上代碼會啟動應用“myapp”,然後傳遞參數token和user給應用myapp。
不過這種應用調用無法完成應用間文檔共享,這能完成一些簡單的數據傳遞。有關“URL Scheme”的具體使用可以參考iOS官方樣例中的LaunchMe。
為了給其它應用程序共享文檔,發起共享的應用一般使用的是UIDocumentInteractionController類,通過調用該類實例的presentOpenInMenuFromRect方法顯示一個“OpenIn”菜單,該菜單中會顯示系統中聲明可以支持你所共享的文檔的應用圖標,由用戶選擇使用那個應用打開你共享的應用。
下面是一段代碼樣例,該樣例通過UIDocumentInteractionController的interactionControllerWithURL方法創建了一個UIDocumentInteractionController實例,然後調用該實例的presentOpenInMenuFromRect方法顯示“OpenIn”菜單。
NSString *filePath =
[[NSBundle mainBundle]
pathForResource:@"PDF Document" ofType:@"pdf"];
NSLog(@"file path is: %@", filePath);
self.documentController =
[UIDocumentInteractionController
interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];
self.documentController.delegate = self;
self.documentController.UTI = @"com.adobe.pdf";
[self.documentController presentOpenInMenuFromRect:CGRectZero
inView:self.view
animated:YES];
將以上代碼放置到一個控件對應的action方法中,觸發該控件就會讓系統彈出“OpenIn”菜單,有用戶選者使用什麼程序打開你所共享的應用。
注意,在“OpenIn”菜單中會出現所有聲稱支持對應文檔類型的應用,比如上例中的“OpenIn”菜單中會出現所有“聲稱”支持pdf格式的應用圖標,至於用戶選擇哪個應用,所選擇的應用是否真的可以正常處理pdf文檔是我們無法控制的。
為了使用其它應用程序共享的文檔,接受文檔的應用需要完成兩個工作。
第一個工作是在應用的Info.plist中加入聲明,聲明該程序支持什麼文檔格式。比如你需要支持pdf文檔,就可以在你的應用項目配置界面選擇“Info”頁面的“Document types”區段,在裡面加入pdf文檔類型的配置,如下圖:
第二個工作是接受其它程序共享的數據,正常做法是在應用的openURL方法中加入響應代碼,在該代碼中去訪問參數URL中紀錄的文檔,該URL指向本應用Documents目錄中的inbox目錄中的一個文件,該文件就是其它程序共享的文檔的一個拷貝。具體代碼如下:
- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSLog(@"openURL method was called");
NSLog(@"the source application is: %@", sourceApplication);
NSLog(@"url is: %@", url);
NSLog(@"handle the file in above file path for the shared doc");
return YES;
}
以上openURL方法通過控制台打印了打印了共享文檔的應用名稱和所共享的文檔在本應用中的訪問路徑,通過這個訪問路徑開發人員可以在本應用中訪問到其它應用所共享的文檔。