2012年10月18日 星期四

使用 Facebook C# SDK

Windows Phone 實在是個被大多數廠商冷落的平台,
知名遊戲不做、知名應用軟體的團隊也不願意做,或是做半套意思意思就好,
連 Facebook 也沒有官方的 SDK 可以用,
如果在 Windows Phone 上面想要介接 Facebook 的服務,目前沒有官方 SDK 可以用,
最辛苦的方式就是自己接 Facebook API,再來偷懶一點可以選擇 Facebook C# SDK

這裡簡單的示範怎麼在 Windows Phone 的應用程式中使用 Facebook C# SDK
並且示範如何利用該 SDK 來達到登入、發佈動態消息的流程,
當然, Facebook C# SDK 不是官方的,但它也是非常多人選用的開源程式庫,
安裝程式庫套件的方法很多,這裡僅記錄最簡單的使用 NuGet 安裝,
如果 Visual Studio 還沒有安裝 NuGet 可以在 Extension Manager 裡面找到。

先看一下這次的主角,Facebook C# SDK
http://csharpsdk.org/
http://nuget.org/packages/Facebook/
原始碼可在此下載:https://github.com/facebook-csharp-sdk/facebook-csharp-sdk

有了 NuGet 後,在欲加入 C# Facebook SDK 的專案按右鍵,點選管理 NuGet 套件,
在線上搜尋 facebook 後,左側搜尋結果會列出多項結果,
安裝名為 Facebook 的套件,應該會在第一個,icon 上印著 fb C#

此時 Facebook SDK 應該就會出現在專案參考之中,
接下來就可以利用 Facebook namespace 下的類別介接 facebook api
基本上大多數的功能都集中在 FacebookClient 這個類別裡,
以下是一個簡單的登入、更新動態範例

MainPage.xaml 中我放置了兩個按鍵,一個用來顯示 facebook 網頁的 WebBrowser 元件
<phone:PhoneApplicationPage
    x:Class="FacebookEx.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"
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">
    <StackPanel x:Name="ContentPanel" Margin="12,0,12,0">
        <Button Content="Login" Click="OnLoginButtonClick"/>
        <Button Content="Post" Click="OnPostButtonClick"/>
        <controls:WebBrowser Height="500" x:Name="Browser"/>
    </StackPanel>
</phone:PhoneApplicationPage>

MainPage.xaml.cs 針對按鍵做處理,並處理 WebBrowser 的導覽過程
public partial class MainPage : PhoneApplicationPage
{
    public const String FACEBOOK_APP_ID = "1357902468";
    public readonly String[] PERMISSIONS = new String[] { "email", "publish_stream", "user_about_me", "publish_actions" };

    private String _accessToken;
    private FacebookClient _facebook = new FacebookClient();

    public MainPage()
    {
        InitializeComponent();
        Browser.Navigated += OnWebBrowserNavigated;
    }

    private void OnLoginButtonClick(object sender, RoutedEventArgs e)
    {
        Dictionary<String, Object> parameters = new Dictionary<String, Object>();
        parameters.Add("client_id", FACEBOOK_APP_ID);
        parameters.Add("response_type", "token");
        parameters.Add("display", "touch");
        parameters["redirect_uri"] = "https://www.facebook.com/connect/login_success.html";
        String scope = String.Join(",", PERMISSIONS);
        parameters["scope"] = scope;
        Uri loginUrl = _facebook.GetLoginUrl(parameters);

        Browser.Navigate(loginUrl);
    }

    private void OnWebBrowserNavigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {
        FacebookOAuthResult result;
        Boolean bSuccess = _facebook.TryParseOAuthCallbackUrl(e.Uri, out result);
        if (bSuccess)
        {
            _accessToken = result.AccessToken;
        }
    }

    private void OnPostButtonClick(object sender, RoutedEventArgs e)
    {
        FacebookClient facebook = new FacebookClient(_accessToken); // 使用 Token 建立一個 FacebookClient
        var parameters = new Dictionary<String, Object>();
        facebook.PostCompleted += OnFacebookPostCompleted;

        parameters["message"] = "Test Post (Windows Phone)";
        facebook.PostAsync("me/feed", parameters);
    }

    private void OnFacebookPostCompleted(object sender, FacebookApiEventArgs e)
    {
        // 發文成功
    }
}

沒有留言:

張貼留言