PDFまたはその他の形式のファイルをプレビューするとき、ファイルを共有したり、組み込みのUIDocumentInteractionController
ソフトウェアを介して印刷したりできます. 写真のように:QLPreviewController
UIActivityViewController
最初の行は、AirDrop
ユーザーが iOS7 以降の Apple デバイス間でファイルを共有するためのショートカットです。これは、Android の Bluetooth ワイヤレス転送ファイルに似ています。
2 行目は、ドキュメント タイプの関連付け手法によって識別されたアプリのリストです。
3 行目はドキュメント関連付けテクノロジによって識別されるリストでAction
、コピー、印刷、保存など、ファイルに対して実行できるいくつかの操作を示します。
iOS システムの下にセキュリティ システムがあることがわかっています --沙盒机制
各 iOS アプリケーションは独立したファイル システムであり、独自のファイル システムでのみ動作するため、iOS システムは Android などの他のファイルに簡単にアクセスできません。 .
自分のアプリでファイルをプレビューするときに他のアプリとファイルを共有できるので、他のアプリが自分のアプリとファイルを共有できるようにするにはどうすればよいでしょうか?
info.plist 登録ファイルの種類
info.plist
ファイルに新しい属性CFBundleDocumentTypes
(実際に入力された) を追加する必要がありますDocument type
。これは配列型の属性です。つまり、複数の型を同時に登録できます。配列内の各要素には、指定できる多くの属性があります. 詳細な属性リストは、公式ドキュメント: Core Foundation Keys ---- CFBundleDocumentTypesから見つけることができます. iOS 開発を行う際に一般的に使用する属性は次のとおりです。
-
CFBundleTypeName
文字列型は、特定の型のエイリアス、つまり、指定した型を参照するために使用されるエイリアスを指定します. 通常、一意性を維持するために、UTI を使用して識別します.
-
CFBundleTypeIconFiles
特定のタイプを表すアイコンを指定し、指定された png アイコンのファイル名を含む配列タイプで、アイコンには特定のサイズ ID があります。
デバイス | サイズ |
---|---|
iPad | 64×64ピクセル、320×320ピクセル |
アイフォンとアイポッドタッチ | 22 x 29 ピクセル、44 x 58 ピクセル (高解像度) |
- LSItemContentTypes
アプリケーションが認識できるすべてのファイル タイプのコレクションを指定する、UTI 文字列を含む配列タイプ
- 、、、、の4つのオプション値を含むLSHandlerRank
文字列型は、特定の型の優先度レベルを指定し、表示されるアプリの順序は、この優先度レベルに従って配置されます。優先度の高い順に、、、です。このタイプが受け入れられないことを示します。Owner
Default
Alternate
None
Launcher Service
Owner
Alternate
Default
None
ファイルSource code
を開く方法を選択し、次のコードを追加します。info.plist
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>PDF</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.adobe.pdf</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Microsoft Word</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.microsoft.word.doc</string>
<string>com.microsoft.word.wordml</string>
<string>org.openxmlformats.wordprocessingml.document</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Microsoft Excel</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.microsoft.excel.xls</string>
<string>org.openxmlformats.spreadsheetml.sheet</string>
</array>
</dict>
<dict>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>Microsoft PowerPoint</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.microsoft.powerpoint.ppt</string>
<string>org.openxmlformats.presentationml.presentation</string>
<string>public.presentation</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Text</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.text</string>
<string>public.plain-text</string>
<string>public.utf8-plain-text</string>
<string>public.utf16-external-plain-text</string>
<string>public.utf16-plain-text</string>
<string>com.apple.traditional-mac-plain-text</string>
<string>public.source-code</string>
<string>public.c-source</string>
<string>public.objective-c-source</string>
<string>public.c-plus-plus-source</string>
<string>public.objective-c-plus-plus-source</string>
<string>public.c-header</string>
<string>public.c-plus-plus-header</string>
<string>com.sun.java-source</string>
<string>public.script</string>
<string>public.shell-script</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Rich Text</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.rtf</string>
<string>com.apple.rtfd</string>
<string>com.apple.flat-rtfd</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>HTML</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.html</string>
<string>public.xhtml</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Web Archive</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.apple.webarchive</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Image</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.image</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>iWork Pages</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.apple.page.pages</string>
<string>com.apple.iwork.pages.pages</string>
<string>com.apple.iwork.pages.template</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>iWork Numbers</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.apple.numbers.numbers</string>
<string>com.apple.iwork.numbers.numbers</string>
<string>com.apple.iwork.numbers.template</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>iWork Keynote</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.apple.keynote.key</string>
<string>com.apple.iwork.keynote.key</string>
<string>com.apple.iwork.keynote.kth</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Audio</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.audio</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Movie</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.movie</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Archive</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.archive</string>
</array>
</dict>
</array>
これらのコードを追加すると、アプリはほとんどのファイルの種類をサポートできます. 独自のプロジェクトのニーズに応じて、関連する種類のコードを追加できます. 私のプロジェクトでは、PDF とワード形式のファイルのみをサポートする必要があります. これらのコードを追加した後、Property list
info.plist ファイルを開くことを選択します。
または、ページのリストinfo
を開きます。Document types
この時点で、アプリでサポートされているファイルの種類を正常に登録したことを意味します. この時点で、コンパイルして実行し、他のアプリ (ここで使用する QQ) に移動して、ダウンロードしたファイルを開きます.このとき出てくるのは次のようなものです。
アプリのアイコンが 2 番目の列のリストに表示されていることがわかります. この時点で、アイコン ボタンをクリックしてファイルをアプリに共有できます.
共有ファイルをどうするか
アイコン ボタンをクリックすると、独自のアプリケーションにジャンプします。このとき、このコールバック メソッドAppDelegate.m
が使用されます。- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
ただし、コールバックは iOS9 より前な- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation
ので、デバイスのバージョンごとに変更する必要があります。
ファイルのアップロード、ファイルのプレビュー、ファイルの保存などのファイル処理操作をコールバック メソッドで実行できます。ファイルのプレビューを行うときは、対応するコントローラーにジャンプする必要があります.このとき、最初に現在のView Controllerを取得する必要があります.
//获取当前屏幕显示的viewcontroller
- (UIViewController *)getCurrentVC
{
UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
return currentVC;
}
- (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
{
UIViewController *currentVC;
if ([rootVC presentedViewController]) {
// 视图是被presented出来的
rootVC = [rootVC presentedViewController];
}
if ([rootVC isKindOfClass:[UITabBarController class]]) {
// 根视图为UITabBarController
currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];
} else if ([rootVC isKindOfClass:[UINavigationController class]]){
// 根视图为UINavigationController
currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]];
} else {
// 根视图为非导航类
currentVC = rootVC;
}
return currentVC;
}
コントローラを取得したら、コールバック メソッドに戻ってジャンプ作業を実行できます.UIDocumentInteractionController
ファイルのプレビューにはまだ使用しています.
#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation{
// 判断传过来的url是否为文件类型
if ([url.scheme isEqualToString:@"file"]) {
_docVc = [UIDocumentInteractionController interactionControllerWithURL:url];
_docVc.delegate = self;
[_docVc presentPreviewAnimated:YES];
}
}
#else
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
// 判断传过来的url是否为文件类型
if ([url.scheme isEqualToString:@"file"]) {
_docVc = [UIDocumentInteractionController interactionControllerWithURL:url];
_docVc.delegate = self;
[_docVc presentPreviewAnimated:YES];
}
return YES;
}
#endif
#pragma mark -- UIDocumentInteractionControllerDelegate
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
// 返回当前控制器
return [self getCurrentVC];
}