Como o iOS obtém os dados do documento compartilhados pelo aplicativo

Ao visualizar arquivos em PDF ou outros formatos, podemos compartilhar o arquivo ou imprimi-lo através do UIDocumentInteractionControllersoftware QLPreviewControllerintegrado UIActivityViewController. como a imagem mostra:


A primeira linha AirDropé um atalho para os usuários compartilharem arquivos entre dispositivos Apple após o iOS7, que é semelhante aos arquivos de transferência sem fio Bluetooth no Android.

A segunda linha é uma lista de aplicativos identificados pela técnica de associação de tipo de documento.

A terceira linha é uma lista identificada pela tecnologia de associação de documentos Action, indicando algumas operações que podem ser realizadas no arquivo, como copiar, imprimir, salvar, etc.

Sabemos que existe um sistema de segurança no sistema iOS -- 沙盒机制cada aplicativo iOS é um sistema de arquivos independente e só pode ser operado em seu próprio sistema de arquivos, então o sistema iOS não pode acessar facilmente outros arquivos como Android. .

Como podemos compartilhar arquivos com outros aplicativos ao visualizar arquivos em nossos próprios aplicativos, como podemos permitir que outros aplicativos compartilhem arquivos com nosso aplicativo?

tipo de arquivo de registro info.plist

Precisamos info.plistadicionar um novo atributo CFBundleDocumentTypes(na verdade inserido Document type) no arquivo, que é um atributo do tipo array, o que significa que podemos registrar vários tipos ao mesmo tempo. Para cada elemento na matriz, há muitos atributos que podem ser especificados. Podemos encontrar a lista detalhada de atributos no documento oficial:  Core Foundation Keys ---- CFBundleDocumentTypes . Aqui estão os atributos que geralmente usamos ao fazer o desenvolvimento do iOS:

  • CFBundleTypeName

    O tipo string especifica um alias de um determinado tipo, ou seja, um alias usado para se referir ao tipo que especificamos. Geralmente, para manter a exclusividade, usamos a UTI para identificá-lo.

  • CFBundleTypeIconFiles

Tipo de matriz, contendo o nome do arquivo do ícone png especificado, especificando um ícone que representa um determinado tipo e o ícone possui uma identificação de tamanho específica:

Dispositivo Tamanhos
iPad 64 x 64 pixels, 320 x 320 pixels
iPhone e iPod touch 22 x 29 pixels, 44 x 58 pixels (alta resolução)
  • LSItemContentTypes

Tipo de matriz, contendo strings UTI, especificando uma coleção de todos os tipos de arquivo que nosso aplicativo pode reconhecer

  • O tipo de string LSHandlerRank
    , incluindo Owner, Default, Alternate, Nonequatro valores opcionais, especifica o nível de prioridade para um determinado tipo, e Launcher Servicea ordem do aplicativo exibido será organizada de acordo com esse nível de prioridade. A ordem de prioridade de alta para baixa é Owner, Alternate, Default. NoneIndica que este tipo não é aceito.

Escolhemos Source codea forma de abrir info.plisto arquivo e adicionamos o seguinte código:

<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>

Adicione esses códigos e seu aplicativo será compatível com a maioria dos tipos de arquivo. Você pode adicionar tipos de códigos relacionados de acordo com as necessidades do seu projeto. Meu próprio projeto só precisa oferecer suporte a arquivos em formato PDF e Word. Depois de adicionar esses códigos, optamos Property listpor abrir o arquivo info.plist:

Ou infoabra Document typesa lista na página:

Neste momento, significa que registramos com sucesso os tipos de arquivo suportados pelo aplicativo. Neste momento, estamos compilando e executando e, em seguida, vamos para outros aplicativos (QQ que uso aqui) para abrir o arquivo baixado. A página que sai neste momento é assim de:

Podemos ver que o ícone do nosso App apareceu na lista da segunda coluna. Neste momento, podemos clicar no botão do ícone para compartilhar o arquivo com o nosso App.

O que fazer com arquivos compartilhados

Quando o botão ícone é clicado, ele irá para nosso próprio aplicativo, e este método de retorno de chamada AppDelegate.mserá usado neste momento.- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options

Mas o retorno de chamada é anterior ao iOS9 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation, então precisamos fazer alterações para diferentes versões de dispositivos.

Podemos executar operações de processamento de arquivo no método de retorno de chamada, como upload de arquivos, visualização de arquivos e salvamento de arquivos. Ao fazer a visualização do arquivo, devemos pular para o controlador correspondente. Neste momento, devemos primeiro obter o controlador de visualização atual

//获取当前屏幕显示的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;
}

Depois de obter o controlador, podemos voltar ao método de retorno de chamada para executar o trabalho de salto. Ainda o uso UIDocumentInteractionControllerpara visualização de arquivo

#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];
}



 

Acho que você gosta

Origin blog.csdn.net/ForeverMyheart/article/details/119933472
Recomendado
Clasificación