Xamarin Forms - 如何处理 iOS 包含的 PCL 部分

Xamarin Forms - How to deal against iOS includes of the PCL part

很难为我的问题找到一个标题,但很容易理解!

我有以下代码,它是一个控件 (gif)

public class Gif : WebView
{
    public string GifSource
    {
        set
        {
            var html = new HtmlWebViewSource();

            string GifAssetURL;
            switch (Device.OS)
            {
                case TargetPlatform.Android:
                    GifAssetURL = "file:///android_asset/";
                    break;
                case TargetPlatform.iOS:
                    //GifAssetURL = NSBundle.MainBundle.BundlePath;
                    GifAssetURL = "";
                    break;
                case TargetPlatform.Windows:
                    GifAssetURL = "ms-appx-web:///Assets/";
                    break;
                default:
                    GifAssetURL = "";
                    break;
            }

            html.Html = String.Format(@"<html><body style='background: #000000;'><img src='{0}' style='width:100%;height:100%;'/></body></html>", GifAssetURL + value);
            SetValue(SourceProperty, html);
            this.Margin = -10;
        }
    }
}

它适用于所有平台,但是,当需要生成 release 时,它会抛出有关包含 (Android & UWP)[=36 的错误=]:

using Foundation;

但是,我需要这个包含在 iOS 部分,因为我的 GIF 图片 位于 Project.iOS 的文件夹中 部分..

首先,我使用 NSBundle.MainBundle.BundlePath 但也许,它可能是一个简单的字符串?

其次,是否也可以从 ImageSource.FromResources(""); 中获取有效的字符串路径?那样的话,我觉得问题就解决了..

感谢帮助!

然后,我终于找到了解决方案!

所以最后,使用 Fondation link 会导致我的发布编译崩溃,而利用它的想法是拥有一个 BaseUrl 界面,让我解释一下!

首先,收回我的gif对象:

public class Gif : WebView
{
    public string GifSource
    {
        set
        {
            var html = new HtmlWebViewSource();

            // Take a look on this line !
            string GifAssetURL = DependencyService.Get<IBaseUrl>().Get();

            html.Html = String.Format(@"<html><body style='background: #000000;'><img src='{0}' style='width:100%;height:100%;'/></body></html>", GifAssetURL + value);
            SetValue(SourceProperty, html);
            this.Margin = -10;
        }
    }
}

根据当前使用的OS,然后给出好的路径。

因此,要使其正常工作,您必须在 PCL 部分创建一个接口,如下所示:

namespace Project
{
    public interface IBaseUrl { string Get(); }
}

然后,对于您关注的每个平台,创建一个继承自 IBaseUrl 的 class。往下看:Android, iOS & UWP

Android

using Project;
using Project.Android.DependencyService;
using Xamarin.Forms;

[assembly: Dependency(typeof(BaseUrl_Android))]
namespace Project.Android.DependencyService
{
    public class BaseUrl_Android : IBaseUrl
    {
        public string Get()
        {
            return "file:///android_asset/";
        }
    }
}

iOS

using Foundation;
using MapPinsProject.Interface;
using MapPinsProject.iOS.DependencyService;
using Xamarin.Forms;

[assembly: Dependency(typeof(BaseUrl_iOS))]
namespace MapPinsProject.iOS.DependencyService
{
    public class BaseUrl_iOS : IBaseUrl
    {
        public string Get()
        {
            return NSBundle.MainBundle.BundlePath;
        }
    }
}

UWP

using Project;
using Project.UWP.DependencyService;
using Xamarin.Forms;

[assembly: Dependency(typeof(BaseUrl_UWP))]
namespace Project.UWP.DependencyService
{
    public class BaseUrl_UWP : IBaseUrl
    {
        public string Get()
        {
            return "ms-appx-web:///";
        }
    }
}

希望对您有所帮助!玩得开心!