Ao visualizar arquivos em PDF ou outros formatos, podemos compartilhar o arquivo ou imprimi-lo através do UIDocumentInteractionController
software QLPreviewController
integrado 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.plist
adicionar 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
, incluindoOwner
,Default
,Alternate
,None
quatro valores opcionais, especifica o nível de prioridade para um determinado tipo, eLauncher Service
a 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
.None
Indica que este tipo não é aceito.
Escolhemos Source code
a forma de abrir info.plist
o 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 list
por abrir o arquivo info.plist:
Ou info
abra Document types
a 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.m
será 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 UIDocumentInteractionController
para 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];
}