Nous développons l'application mobile dans Xamarin. Comment peut ensuite être accompli dans iOS:Comment ouvrir le fichier téléchargé sur iOS
- utilisateur télécharge un fichier depuis url (demande http est faite à l'API REST, sécurisé avec nom d'utilisateur d'authentification de base: secretKey) fichier
- est enregistré dans iOS
- utilisateur ouvre un fichier (permis sont jpg, png, pdf, doc, docx, .png) fichier
- est ouvert en application par défaut (par exemple pour des images visionneuse d'images)
Comme les opérations de fichiers sont plate-forme spécifique, voici la définition de l'interface:
public interface IFileHelper
{
void DownloadFileAndSave(Models.DocumentModel document);
}
application Android:
public class FileHelper : IFileHelper
{
// download file and view status in download manager
public void DownloadFileAndSave(Models.DocumentModel document)
{
DownloadManager dm = (DownloadManager)Android.App.Application.Context.GetSystemService(Context.DownloadService);
string url = WebApiUtils.GetBaseUrl() + string.Format("Api/v1/Dms/{0}", document.UniqueId);
DownloadManager.Request request = new Android.App.DownloadManager.Request(Android.Net.Uri.Parse(url)));
request.AddRequestHeader("Authorization", "Basic " + WebApiUtils.GetEncodedCredentials(Auth.Users.Current));
var downloadFile = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);
string path = Path.Combine(downloadFile.AbsolutePath, document.FileName);
request.SetDestinationUri(Android.Net.Uri.FromFile(new Java.IO.File(path)));
request.SetMimeType(document.ContentType);
request.SetNotificationVisibility(DownloadVisibility.VisibleNotifyCompleted);
dm.Enqueue(request);
}
Dans le fichier Android est simplement stocké sur le système de fichiers et avec l'Explorateur de fichiers qui est installé par défaut sur un Android (à savoir Mes fichiers -> stockage de périphériques -> Téléchargement), le fichier est ouvert dans l'application par défaut pour le type mime du fichier. Tout va bien sur Android.
application Apple iOS:
public class FileHelper : IFileHelper
{
public void DownloadFileAndSave(Models.DocumentModel document)
{
WebClient webClient = new WebClient();
webClient.Headers.Add(HttpRequestHeader.Authorization, "Basic " + WebApiUtils.GetEncodedCredentials(Auth.Users.Current));
webClient.DownloadDataAsync(new System.Uri(WebApiUtils.GetBaseUrl() + string.Format(Consts.ApiUrls.GetDocument, document.UniqueId)));
webClient.DownloadDataCompleted += (sender, e) =>
{
byte[] content = e.Result;
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), document.FileName);
// doesn't throw exception therefore saved ok
File.WriteAllBytes(path, content);
Uri uri = new Uri(String.Format("file://{0}", path));
// doesn't work.
Device.OpenUri(uri);
};
}
}
est-il un autre moyen d'ouvrir le fichier téléchargé à l'application par défaut. Si j'ouvre l'url par exemple http://example.com/files/file1.png il ouvre le fichier en safari, mais je ne peux pas mettre Authorization: Basic
en-têtes dans Device.OpenUri
. J'ai lu environ Load Non-Web Documents with WebView mais vous devez construire chaque fichier comme BundleResource
.
Dans votre code iOS, vous commentez pour dire qu'il n'y a aucune exception levée, êtes-vous en mesure de voir le fichier dans le chemin? –
Aussi, pas sûr si vous avez vu cela, mais jetez un oeil ici https: //forums.xamarin.com/discussion/68919/device-openuri-avec-un-pdf-on-ios c'est un problème similaire à ce que vous avez, et je crois que le PO résout le problème ici aussi –
@CodeWarrior merci pour le lien, j'ai manqué il. La solution fonctionne presque. Voir ma réponse ci-dessous. – broadband