Xamarin формы: открыть локально сохраненный файл в программе просмотра по умолчанию в native IOS - PullRequest
0 голосов
/ 05 марта 2020

Я занимаюсь разработкой проекта форм Xamarin только с родным IOS. Использование веб-клиента для загрузки файла с указанного c URL-адреса и сохранения его в локальной папке устройства конечного пользователя.

       public string DownloadFile(WebClient client,string downloadFileAddress, string fileName, string header, DownloadProgressChangedEventHandler downloadFileProgressHandler, AsyncCompletedEventHandler downloadCompletedEventHandler)
    {
        client.DownloadProgressChanged += downloadFileProgressHandler;
        client.DownloadFileCompleted += downloadCompletedEventHandler;

        string pathToNewFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        Directory.CreateDirectory(pathToNewFolder);
        string pathToNewFile = Path.Combine(pathToNewFolder, fileName);

         client.DownloadFileAsync(uri, pathToNewFile);
         return pathToNewFile;
    }

    private void downloadCompletedEventHandler(object sender, AsyncCompletedEventArgs e)
    {
        try
        {
            if (e.Cancelled)
            {
                if (client != null)
                    client.Dispose();
                return;
            }

        }            
        finally
        {
            if (client != null)
                client.Dispose();
        }
    }

    private void downloadProgressEventHandler(object sender, DownloadProgressChangedEventArgs e)
    {
       double MainReleaseRecivedBytes = double.Parse(e.BytesReceived.ToString());
            double percentage = (MainReleaseRecivedBytes) / e.TotalBytesToReceive * 100;
            var DownloadProgressValue = int.Parse(Math.Truncate(percentage).ToString());
    }

Я получаю локальный путь, например

/ Users / Syncfusion / Library / Developer / CoreSimulator / Devices / AF1C6C04-09CF-4503-B93 C -F96D603A5F1B / данные / Контейнеры / Data / Application / 8DACC52E-E183-412F-B4D3-E93B68C961C5 / Документы / природа. html

Необходимо открыть этот файл по умолчанию для просмотра устройства с помощью кода позади.

Я следовал этим ниже три типа методов

Метод 1 и 3 не является открытие любого средства просмотра.

Способ 2 открывается как изображение, Не открывая файл

https://i.stack.imgur.com/kV1cp.png

Можете ли вы предложить любое другое решение ?

Метод 1:

Browser.OpenAsync(DownaloadedFilePath, new BrowserLaunchOptions{
    LaunchMode = BrowserLaunchMode.SystemPreferred,
    TitleMode = BrowserTitleMode.Show,
    PreferredToolbarColor = Color.AliceBlue,
    PreferredControlColor = Color.Violet });

Метод 2:

 Launcher.OpenAsync(new OpenFileRequest {
     File = new ReadOnlyFile(DownaloadedFilePath)});

Метод 3:

DepencyService:

 IDataViewer dataViewer = DependencyService.Get<IDataViewer>();
                dataViewer.OpenFile(DownaloadedFilePath);

Интерфейс IDataViewer:

void OpenFile(string AttachmentName);

DataViewer:

[assembly: Dependency(typeof(DataViewer))]
namespace PlanViewer.iOS
{
    public class DataViewer :UIViewController, IDataViewer
    {
        public void OpenFile(string filename)
        {            
            FileInfo fileInfo = new FileInfo(filename);

            QLPreviewController previewController = new QLPreviewController();
            previewController.DataSource = new PDFPreviewControllerDataSource(fileInfo.FullName, fileInfo.Name);
            UINavigationController controller = FindNavigationController();
            if (controller != null)
            {
                controller.PresentViewController(previewController, true, null);
            }
            else
            {
                UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(
                    previewController, true, null);
            }
        }

        private UINavigationController FindNavigationController()
        {
            foreach (var window in UIApplication.SharedApplication.Windows)
            {
                if (window.RootViewController.NavigationController != null)
                    return window.RootViewController.NavigationController;
                else
                {
                    UINavigationController val = CheckSubs(window.RootViewController.ChildViewControllers);
                    if (val != null)
                        return val;
                }
            }
            return null;
        }

        private UINavigationController CheckSubs(UIViewController[] controllers)
        {
            foreach (var controller in controllers)
            {
                if (controller.NavigationController != null)
                    return controller.NavigationController;
                else
                {
                    UINavigationController val = CheckSubs(controller.ChildViewControllers);
                    if (val != null)
                        return val;
                }
            }
            return null;
        }
    }

    public  class NavBarButton : UIBarButtonItem
    {
        private string v;
        private Action<object, object> p;

        public NavBarButton(string v, Action<object, object> p)
        {
            this.v = v;
            this.p = p;
        }
    }

    public class PDFPreviewControllerDataSource : QLPreviewControllerDataSource
    {
        string url = "";
        string filename = "";

        public PDFPreviewControllerDataSource(string url, string filename)
        {
            this.url = url;
            this.filename = filename;
        }

        public override IQLPreviewItem GetPreviewItem(QLPreviewController controller, nint index)
        {
            return (IQLPreviewItem)new QLPreviewItemBundle(filename, url);
        }

        public override nint PreviewItemCount(QLPreviewController controller)
        {
            return 1;
        }
    }

    public class QLPreviewItemBundle : QLPreviewItem
    {
        private string _fileName;
        private string _filePath;

        public QLPreviewItemBundle(string fullName, string name)
        {
            this._fileName = fullName;
            this._filePath = name;
        }
        public override string ItemTitle
        {
            get
            {
                return _fileName;
            }
        }
        public override NSUrl ItemUrl
        {
            get
            {
                var documents = NSBundle.MainBundle.BundlePath;
                var lib = Path.Combine(documents, _filePath);
                var url = NSUrl.FromFilename(lib);
                return url;
            }
        }
    }
}`


  [1]: https://i.stack.imgur.com/kV1cp.png
...