Статьи

Приложение для браузера с сокращением bit.ly для Windows Phone 7

Мобильная версия Internet Explorer не очень расширяема, и на это есть свои причины — безопасность, стабильность и общая надежность. Поэтому разработчики не имеют «ключей» для расширения встроенного браузера. Однако есть много обходных путей, включая возможность разработки собственного приложения для браузера, основанного на том же ядре IE, но с настраиваемой функциональностью.

Это делается с помощью элемента управления WebBrowser, который доступен в панели инструментов по умолчанию. В этой статье я собираюсь показать, как создать браузерное приложение, которое включает сокращение bit.ly и позволяет конечному пользователю поделиться ссылкой по электронной почте.

Прежде всего, я создал простое приложение для Windows Phone 7 и отредактировал содержимое основного файла XAML, чтобы представить страницу с элементом управления WebBrowser , TextBox, где пользователь вводит URL-адрес, и кнопку «Перейти».

Я также добавил панель приложения (отображается внизу, когда приложение запущено), где я разместил кнопку « Сократить» .

Общая разметка XAML для страницы выглядит следующим образом:

<phone:PhoneApplicationPage
    x:Class="WindowsPhoneTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696"
    shell:SystemTray.IsVisible="True">
    
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <TextBlock Grid.Row="0" Height="30" Margin="10,10,420,10" Text="URL:"></TextBlock>
        <TextBox x:Name="urlBox" Grid.Row="0" Margin="50,0,100,0" Text="http://"></TextBox>
        <Button Grid.Row="0" Margin="360,0,0,0" Content="GO" Click="Button_Click"></Button>

        <phone:WebBrowser Grid.Row="1"   Name="webBrowser"  />
    </Grid>
    
    <phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True">
            <shell:ApplicationBarIconButton x:Name="getBitLy" Click="getBitLy_Click" IconUri="/Images/bitly.png" Text="Shorten"></shell:ApplicationBarIconButton>
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>
</phone:PhoneApplicationPage>

Изображение, на которое я ссылаюсь для кнопки панели приложения , представляет собой образец логотипа bit.ly — вы можете либо загрузить его, либо использовать любое другое изображение. Он будет автоматически вставлен в круг и соответствующим образом изменится, когда вы назовете его как IconUri (учитывая, что он присутствует в вашем проекте).

Часть кода немного сложнее, но в то же время легко понятна.

Для кнопки Go процедура проста:

if (!string.IsNullOrEmpty(urlBox.Text.Trim()))
{
    if (Uri.IsWellFormedUriString(urlBox.Text, UriKind.Absolute))
    {
        webBrowser.Navigate(new Uri(urlBox.Text));
    }
    else
    {
        MessageBox.Show("Invalid URL string. Make sure you are using the www prefix.","Invalid URL",MessageBoxButton.OK);
    }
}

Я проверяю, правильно ли введен URL-адрес до начала навигации.

Когда пользователь нажимает кнопку « Сократить» , вам необходимо выяснить, есть ли URL-адрес для сокращения. Поскольку эта функция напрямую связана с элементом управления WebBrowser, необходимо проверить, существует ли URL-адрес, по которому уже перемещался элемент управления WebBrowser.

Это делается внутри обработчика события getBitLy_Click :

if (webBrowser.Source != null)
{
    // The validation passed - there is a correct URI present
}
else
{
    // No valid URI - nothing to shorten
    MessageBox.Show("URL cannot be shortened.\nYou need to open a web page first.", "Shorten URL", MessageBoxButton.OK);
}

Когда пользователь решает сократить несуществующий URL, ему будет предложено всплывающее сообщение:

Фактическое сокращение сделано в двух частях. Инициирующая часть и асинхронная часть, которая будет получать ответ сервера. Спусковая часть выглядит так:

enum Format
{
    XML,
    JSON,
    TXT
}

enum Domain
{
    BITLY,
    JMP
}

void ShortenUrl(string longURL,
    string username, string apiKey, Format format = Format.XML, Domain domain = Domain.BITLY)
{
    string _domain;

    // Build the domain string depending on the selected domain type
    if (domain == Domain.BITLY)
        _domain = "bit.ly";
    else
        _domain = "j.mp";

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
        string.Format(@"http://api.bit.ly/v3/shorten?login={0}&apiKey={1}&longUrl={2}&format={3}&domain={4}",
        username, apiKey, HttpUtility.UrlEncode(longURL), format.ToString().ToLower(), _domain));

    request.BeginGetResponse(new AsyncCallback(GetResponse), request);
}

Есть два перечисления, которые определяют разрешенные домены и возвращаемые форматы. Вызов API структурирован так, как вы видите, он передан в запрос. В конечном итоге вам потребуется API-ключ bit.ly, чтобы приложение сократило время, поэтому убедитесь, что у вас есть учетная запись bit.ly (ее можно создать бесплатно).

Как видите, ответ получается через AsyncCallback, который ссылается на метод GetReponse .

void GetResponse(IAsyncResult result)
{
    XDocument doc;
    HttpWebRequest request = (HttpWebRequest)result.AsyncState;
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        doc = XDocument.Load(reader.BaseStream);
    }
    
    var x = from c in doc.Root.Element("data").Elements() where c.Name == "url"
            select c;

    XElement n = ((IEnumerable<XElement>)x).ElementAt(0);

    EmailComposeTask task = new EmailComposeTask();
    task.Subject = "Shortened Link";
    task.Body = n.Value;
    task.Show();
}

Прежде всего, он читает ответ и представляет его в виде XDocument (я выбрал XML в качестве формата возврата), а затем я читаю элемент URL. Конечно, вы можете добавить обработку ошибок здесь, поскольку существует небольшая вероятность того, что телефон не будет подключен, и это может вызвать проблему. Но сейчас я просто показываю идею моего метода.

Все, что вам нужно сделать сейчас, это создать запрос к API bit.ly, вызвав ShortenUrl:

ShortenUrl(webBrowser.Source.AbsoluteUri, USER_NAME, API_KEY); 

Как только URL получен, он будет передан через встроенное почтовое приложение. Хотя вы не можете проверить это непосредственно на эмуляторе, вы можете сделать это на реальном устройстве Windows Phone 7.

Если вы хотите узнать больше о сокращении URL-адресов с помощью bit.ly в приложении .NET, ознакомьтесь с этой статьей .