iOS はアプリが共有するドキュメント データをどのように取得しますか

PDFまたはその他の形式のファイルをプレビューするとき、ファイルを共有したり、組み込みのUIDocumentInteractionControllerソフトウェアを介して印刷したりできます. 写真のように:QLPreviewControllerUIActivityViewController


最初の行は、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
    文字列型は、特定の型の優先度レベルを指定し、表示されるアプリの順序は、この優先度レベルに従って配置されます。優先度の高い順に、、、ですこのタイプが受け入れられないことを示します。OwnerDefaultAlternateNoneLauncher ServiceOwnerAlternateDefaultNone

ファイル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 listinfo.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];
}



 

おすすめ

転載: blog.csdn.net/ForeverMyheart/article/details/119933472