【发布时间】:2017-10-03 06:00:24
【问题描述】:
我们正在 Xamarin 中开发移动应用程序。接下来如何在 iOS 中完成:
- 用户从 url 下载文件(向 REST API 发出 http 请求,使用 Authentication Basic 用户名:secretKey 进行保护)
- 文件已保存到 iOS
- 用户打开文件(允许使用 jpg、png、pdf、doc、docx、png)
- 文件在默认应用程序中打开(例如用于图像图像查看器)
由于文件操作是平台特定的,这里是接口定义:
public interface IFileHelper
{
void DownloadFileAndSave(Models.DocumentModel document);
}
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);
}
在 Android 中,文件只是存储在文件系统中,并且使用默认安装在任何 Android 上的文件资源管理器(即我的文件 -> 设备存储 -> 下载),文件在默认应用程序中打开文件的 mime 类型。在 Android 上一切正常。
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);
};
}
}
有没有其他方法可以在默认应用程序中打开下载的文件。如果我打开网址,例如http://example.com/files/file1.png 它在 safari 中打开文件,但我无法将 Authorization: Basic 标头放入 Device.OpenUri。
我读到了Load Non-Web Documents with WebView,但您必须将每个文件构建为BundleResource。
【问题讨论】:
-
在你的iOS代码中,你评论说没有抛出异常,你能看到路径中的文件吗?
-
另外,不确定你是否看过这个但看看这里 forums.xamarin.com/discussion/68919/… 它与你所拥有的类似的问题,我相信 OP 也解决了这里的问题
-
@CodeWarrior 谢谢你的链接,我错过了。该解决方案几乎可以工作。请参阅下面的答案。
-
@CodeWarrior 我没有在路径中看到文件,我只用
System.IO.File.Exists(path);进行了测试 -
您的答案在下面,您可以使用吗?
标签: c# android ios xamarin xamarin.ios