【问题标题】:Download path in Xamarin iOSXamarin iOS 中的下载路径
【发布时间】:2020-04-22 00:20:34
【问题描述】:

我正在使用 Xamarin.Forms 并编写代码来下载 iOS 文件 平台。它正在成功下载文件,没有任何错误。但是下载后,在我的苹果设备上找不到下载的文件。

在调试过程中我发现它正在显示

/var/mobile/Containers/Data/Application/1234567A-B8CD-9EF9-C850-9G73587DC7C/Documents/XF_Downloads/hausmann_abcd.jpg

路径。那么文件保存在哪个位置?下面是相同的图像。

我已经为此编写了以下代码

public class IosDownloader : IDownloader
{
    public event EventHandler<DownloadEventArgs> OnFileDownloaded;

    public void DownloadFile(string url, string folder)
    {
        string pathToNewFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), folder);
        Directory.CreateDirectory(pathToNewFolder);

        try
        {
            WebClient webClient = new WebClient();
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
            string pathToNewFile = Path.Combine(pathToNewFolder, Path.GetFileName(url));
            webClient.DownloadFileAsync(new Uri(url), pathToNewFile);
        }
        catch (Exception ex)
        {
            if (OnFileDownloaded != null)
                OnFileDownloaded.Invoke(this, new DownloadEventArgs(false));
        }
    }

    private void Completed(object sender, AsyncCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            if (OnFileDownloaded != null)
                OnFileDownloaded.Invoke(this, new DownloadEventArgs(false));
        }
        else
        {
            if (OnFileDownloaded != null)
                OnFileDownloaded.Invoke(this, new DownloadEventArgs(true));
        }
    }
}

【问题讨论】:

  • “我无法找到下载的文件” - 你究竟是如何做到这一点的? iOS 没有为用户提供探索设备文件系统的工具
  • 我已经编写了上面的代码来为iOS保存任何类型的文件。那么我可以从哪个路径查看这些文件?

标签: xamarin xamarin.forms xamarin.ios xamarin-studio


【解决方案1】:

当文件保存在应用程序上时,它是应用程序沙箱中的临时 URL。要通过 Apple 的 Photos 公开访问此图像文件,您必须使用本机代码请求将新的 PHImageAsset 添加到照片库。

在表单中,您需要访问本机框架并因此运行本机代码。如果你还不知道怎么做,网上有很多这样的例子。但是如果您想在共享代码框架中运行本机代码,这里有一个介绍。 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/dependency-service/introduction

这是获取该临时文件 URL 并将其保存到 Photos 框架的示例,一旦您可以使用原生 Xamarin.iOS 框架进行编码:

    public void AddImageUrlToPhotosLibrary(string urlToSaveToPhotos)
    {
        PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => {

            //This is bound to native https://developer.apple.com/documentation/photokit/phassetchangerequest/1624060-creationrequestforasset
            //Parameter is an NSURL of path to image.
            PHAssetChangeRequest.FromImage(new NSUrl(urlToSaveToPhotos));

        }, (completed, error) => {

            if (completed)
            {
                if (error != null)
                {
                    Console.WriteLine($"Failed saving image asset {error.LocalizedDescription}");
                } else
                {
                    Console.WriteLine($"Successfully saved image to photos library.");
                }
            }
        });
    }

【讨论】:

  • 感谢您的回答。它非常适合照片,但是 .pdf 或 .docx 或任何其他文件格式的其他文件呢?我应该怎么做才能存储带有任何扩展名的文件并在我的 iPhone 上检查/列出/查看它?
  • 除非您有“文件查看器”或支持打开该文件的应用程序,否则不会。我认为目前没有一个集中的地方可以在您的应用之外存储文件
【解决方案2】:

我无法在我的苹果设备中找到下载的文件。

如果你使用模拟器,可以直接在mac中找到文件夹,在

中输入路径即可

your mac --> select Finder --> 然后打开Go 菜单 --> 点击Go to Folder,正如我在这个帖子中描述的那样:

Where can I find the MyDocuments folder on iPhone Simulator?

如果您将应用安装在真实设备中。您可以在

中浏览文件

Xcode --> Devices and Simulators --> download container 如本帖所述:

Browse the files created on a device by the iOS application I'm developing,下载完容器后,可以右键选择Show Package Contents。然后你就可以看到文件夹了。

您也可以通过项目中的路径访问该文件。

【讨论】:

  • 我已经在真机上安装了应用。正如您所建议的,我可以成功浏览文件。感谢那。但问题是我的应用程序具有实时聊天和文件共享选项。所以用户想要在他的 iPhone 设备上实时查看下载的文件。他无法将他的 iPhone 连接到 Xcode 然后查看文件。我认为此选项适用于开发人员。如果实际用户想要在他们的 iPhone 中查看这些文件,我应该怎么做?
  • 看看这个thread的答案。
  • 文件有不同的类型,如 .png、.jpeg、.pdf 或任何其他文件格式,那又如何呢?我应该如何在我的 iPhone 上检查/列出/查看它?
  • 您可以将不同类型的文件保存到不同的子文件夹中。你应该先知道文件的类型,然后才能正确读取。
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2020-08-18
  • 2015-01-29
  • 2023-04-11
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多