コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
using System.Threading.Tasks;
using Xamarin.Forms;
namespace AppName.Views
{
public partial class FacebookTestPage : ContentPage
{
public FacebookTestPage()
{
InitializeComponent();
}
private const string AppId = "999999999999999";
private const string FacebookLoginUrl = "http://www.facebook.com/connect/login_success.html";
/// <summary>
/// Facebookログイン画面を表示する
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
async void OnLoginClick(object sender, EventArgs e)
{
try
{
//パーミッションの結合文字列(カンマをURLエンコード)
const string and = "%2C";
//ログインURL(アクセストークン要求)
var apiRequest =
"http://www.facebook.com/v2.9/dialog/oauth" +
"?client_id=" + AppId +
"&display=popup" +
"&response_type=token" +
"&redirect_uri=" + System.Net.WebUtility.UrlEncode(FacebookLoginUrl) +
//パーミッション
"&scope=email" + and + //デフォルトで使用が許可されている
"user_friends" + and + //デフォルトで使用が許可されている
"user_birthday" //使用にはFacebookに申請が必要
;
var webView = new WebView
{
Source = apiRequest,
HeightRequest = 1
};
webView.Navigated += OnWebViewNavigated;
Content = webView;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
}
}
/// <summary>
/// WebViewの遷移イベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void OnWebViewNavigated(object sender, WebNavigatedEventArgs e)
{
var accessToken = ExtractAccessTokenFromUrl(e.Url);
if (!String.IsNullOrEmpty(accessToken))
{
await GetFacebookProfileAsync(accessToken);
}
}
/// <summary>
/// Url文字列からアクセストークンを取得する
/// </summary>
/// <param name="url">URL文字列</param>
/// <returns></returns>
private string ExtractAccessTokenFromUrl(string url)
{
if (url.Contains("access_token") && url.Contains("&expires_in="))
{
var at = url.Replace(FacebookLoginUrl + "#access_token=", "");
var token = at.Remove(at.IndexOf("&expires_in="));
return token;
}
return String.Empty;
}
/// <summary>
/// Facebookプロフィール情報を取得する
/// </summary>
/// <param name="accessToken">アクセストークン</param>
/// <returns></returns>
private async Task GetFacebookProfileAsync(string accessToken)
{
var requestUrl =
"https://graph.facebook.com/me?" +
"fields=id,name,first_name,last_name,email,gender,birthday,age_range,picture,cover,devices,is_verified&" +
"access_token=" + accessToken;
var httpClient = new System.Net.Http.HttpClient();
var json = await httpClient.GetStringAsync(requestUrl);
var profile = Newtonsoft.Json.JsonConvert.DeserializeObject<FacebookProfile>(json);
//情報を取得する
string id = profile.Id;
string firstName = profile.First_Name;
string lastName = profile.Last_Name;
string email = profile.Email;
string gender = profile.Gender;
}
}
}
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。