最近在学习Windows8 Metro应用的开发, 由于是本职是iOS开发,所以很多切入点都是参照iOS平台。
iOS应用中,经常会加入Facebook 、Twitter、微博等交互相关功能,因此首先就研究了一下在Windows8 Metro平台下相对应功能的实现方法。
iOS平台上Facebook功能的实现很方便,直接使用Facebook 官方的SDK For iOS就可以了,但对于Windows8 Metro环境,目前没有官方SDK。
这里用到了第三方开发的开源包Facebook C# SDK, 能够支持.Net Framework3.5、.Net Framework4.0、.Net Framework4.5、
Windows 8 Store Apps、Silverlight 5、Windows Phone 7.1 (Mango)。
开发者提供了通俗易懂的实例程序facebook-windows8-sample。
在运行程序以前,注意需要先将FacebookLoginPage.xaml.cs文件中的AppId的值设定为你为自己的应用所申请的值。
否则,运行时会直接变成网页版的Facebook,而不会调用到应用的画面。
程序结构非常简单,HomePage只有一个按钮,点击迁移到FacebookLoginPage画面,准备用户登录Facebook。
登录完成后,会提示用户许可3操作权限:
- user_about_me
- read_stream
- publish_stream
之后,就到了FacebookInfoPage,可以向涂鸦墙上发送文字信息。
关键的实现代码:
FacebookLoginPage.xaml.cs
使用AppId并指定附加权限extendedPermissions,请求facebook认证页面。
private Uri GetFacebookLoginUrl(string appId, string extendedPermissions)
{
dynamic parameters = new ExpandoObject();
parameters.client_id = appId;
parameters.redirect_uri = "https://www.facebook.com/connect/login_success.html";
parameters.response_type = "token";
parameters.display = "popup";
// add the 'scope' parameter only if we have extendedPermissions.
if (!string.IsNullOrWhiteSpace(extendedPermissions))
{
// A comma-delimited list of permissions
parameters.scope = extendedPermissions;
}
return _fb.GetLoginUrl(parameters);
}
用户登录后,验证登录成功与否,成功的场合取得acsessToken字串,迁移到FacebookInfoPage画面。
private void WebView1_LoadCompleted(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e)
{
FacebookOAuthResult oauthResult;
if (!_fb.TryParseOAuthCallbackUrl(e.Uri, out oauthResult))
{
return;
}
if (oauthResult.IsSuccess)
{
var accessToken = oauthResult.AccessToken;
LoginSucceded(accessToken);
}
else
{
// user cancelled
}
}
private async void LoginSucceded(string accessToken)
{
dynamic parameters = new ExpandoObject();
parameters.access_token = accessToken;
parameters.fields = "id";
dynamic result = await _fb.GetTaskAsync("me", parameters);
parameters = new ExpandoObject();
parameters.id = result.id;
parameters.access_token = accessToken;
Frame.Navigate(typeof(FacebookInfoPage), (object)parameters);
}
FacebookInfoPage.xaml.cs
这份代码中主要实现取得了用户的一些信息以及发送文字信息的功能。取得信息的功能不再赘述,主要看看发送功能的实现。
如果只需要单纯发送文字信息,只需要向message项目内设定文字串就可以很简单地实现:
private async void PostToWall_Click(object sender, RoutedEventArgs e)
{
try
{
dynamic parameters = new ExpandoObject();
parameters.message = txtMessage.Text;
dynamic result = await _fb.PostTaskAsync("me/feed", parameters);
_lastMessageId = result.id;
txtMessage.Text = string.Empty;
btnDeleteLastMessage.IsEnabled = true;
}
catch (FacebookApiException ex)
{
// handle error message
}
}
当需要上传网络图片时,相似的对picture项目设定图片的URL就可以实现:
private async void PostToWall_Click(object sender, RoutedEventArgs e)
{
try
{
dynamic parameters = new ExpandoObject();
parameters.message = txtMessage.Text;
parameters.picture = "http://idea1983.com/wp-content/uploads/2011/08/clip_image0312.jpg";
dynamic result = await _fb.PostTaskAsync("me/feed", parameters);
_lastMessageId = result.id;
txtMessage.Text = string.Empty;
btnDeleteLastMessage.IsEnabled = true;
}
catch (FacebookApiException ex)
{
// handle error message
}
}
当需要上传本地图片是,稍微麻烦一点,首先将本地文件读取成为byte数组,然后通过picture或者source项目,发送到me/photos。
下面的代码演示了 从项目中的文件夹读取图片后上传:
private async void PostToWall_Click(object sender, RoutedEventArgs e)
{
try
{
dynamic parameters = new ExpandoObject();
parameters.message = txtMessage.Text;
StorageFile imageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/pcz.jpg"));
IRandomAccessStream fileStream = await imageFile.OpenAsync(FileAccessMode.Read);
var reader = new Windows.Storage.Streams.DataReader(fileStream.GetInputStreamAt(0));
await reader.LoadAsync((uint)fileStream.Size);
byte[] pixels = new byte[fileStream.Size];
reader.ReadBytes(pixels);
parameters.picture = new FacebookMediaObject
{
ContentType = "image/jpeg",
FileName = "pcz.jpg",
}.SetValue(pixels);
dynamic result = await _fb.PostTaskAsync("me/photos", parameters);
_lastMessageId = result.id;
txtMessage.Text = string.Empty;
btnDeleteLastMessage.IsEnabled = true;
}
catch (FacebookApiException ex)
{
// handle error message
}
}
在应用程序中队Facebook功能的调用,最常见的就是以上的几个功能了,其实这个SDK支持的远远不止这些,接下来在运用中,还需要好好发掘学习。