1

我正在寻找一种为 Windows Phone 8 注册自定义协议的方法。我试图注册一个自定义协议,WebRequest.RegisterPrefix("xxx://", this)但这对WebBrowser控件不起作用。由于我们的协议方案不是有效的 uri,如果应用程序尝试导航(通过 location.url='xxx://this-is-no-valid-uri'),它就会崩溃。

我希望任何人都可以将光传播到黑暗中;)

编辑:是我的测试项目。我认为这是一个主要错误,因为您可以通过简单的 JavaScript 语句强制每个应用程序崩溃。

4

2 回答 2

4

最近我不得不创建一个自定义 uri方案,这在你的 WMAppManifest 中很容易添加:

<Extensions>
  <Protocol Name="XXXX" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" />
</Extensions>

这是站在后面Tokens

比在您的 App.cs 文件中重定向到负责导航的类

RootFrame.UriMapper = new CustomUriMapper();

例如

class CustomUriMapper : UriMapperBase
{
    private string tempUri;
    public override Uri MapUri(Uri uri)
    {
        tempUri = System.Net.HttpUtility.UrlDecode(uri.ToString());

        if (tempUri.Contains("XXXX"))
        {
         return new Uri("/MainPage.xaml?parameter=XXXX", UriKind.Relative);
        }
        else
            {
                return new Uri("/MainPage.xaml", UriKind.Relative);
            }           
    }
} 

我希望我有所帮助

编辑

我创建了一个小项目,我确信它可以工作,请试试这个

            string url = "xxxx:";
            WebBrowserTask browser = new WebBrowserTask();
            browser.URL = url;
            browser.Show();
于 2013-01-28T16:25:11.223 回答
2

我终于找到了解决问题的方法,您需要注册一个自己的 UriParser。

我的 UriParser:

public class MyUriParser : UriParser
{
    public MyUriParser()
    {

    }

    protected override string GetComponents(Uri uri, UriComponents components, UriFormat format)
    {
        return "";
    }
    protected override bool IsWellFormedOriginalString(Uri uri)
    {
        return true;
    }
    protected override void InitializeAndValidate(Uri uri, out UriFormatException parsingError)
    {
        parsingError = null;
    }
    protected override bool IsBaseOf(Uri baseUri, Uri relativeUri)
    {
        return false;
    }
    protected override string Resolve(Uri baseUri, Uri relativeUri, out UriFormatException parsingError)
    {
        parsingError = null;
        return "";
    }
}

通过以下方式注册:

if (!UriParser.IsKnownScheme(SCHEMENAME_0))
    UriParser.Register(new MyUriParser(), SCHEMENAME_0, 80);
于 2013-09-04T15:20:01.827 回答