diff --git a/samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp b/samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp
index 2c48e00..71395e1 100644
--- a/samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp
+++ b/samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp
@@ -468,7 +468,7 @@ Object^ ObjectSerializeHelper::ReadObject(DataReader^ reader)
case StreamTypes::BooleanType:
return reader->ReadBoolean();
case StreamTypes::Char16Type:
- return (char16_t) reader->ReadUInt16();
+ return (wchar_t) reader->ReadUInt16();
case StreamTypes::GuidType:
return reader->ReadGuid();
case StreamTypes::StringType:
diff --git a/samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj b/samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj
index 4573f19..beb9db6 100644
--- a/samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj
+++ b/samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj
@@ -8,8 +8,8 @@
true
Windows Store
8.2
- 10.0.10240.0
- 10.0.10240.0
+ 10.0
+ 10.0.19041.0
@@ -41,35 +41,35 @@
Application
true
- v140
+ v142
Application
true
- v140
+ v142
Application
true
- v140
+ v142
Application
false
true
- v140
+ v142
Application
false
true
- v140
+ v142
Application
false
true
- v140
+ v142
diff --git a/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp b/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp
index 239fb1d..fca3f3d 100644
--- a/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp
+++ b/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp
@@ -52,12 +52,19 @@ using namespace Windows::Globalization::DateTimeFormatting;
#define FBStoreAppIDName L"FBWindowsAppId"
#define PermissionGranted L"granted"
+///
+/// This array is used to ask for this specific permissions
+/// public_profile permission works for graph and gaming graph api, but
+/// Facebook suggest the use of gaming_profile if you call to gaming graph
+/// specifically.
+/// user_friends retrive friends and require an special request to Facebook team
+/// if you enable gaming graph
+///
const wchar_t* requested_permissions[] =
{
L"public_profile",
+ L"email",
L"user_friends",
- L"user_likes",
- L"user_location"
};
MainPage::MainPage()
@@ -105,7 +112,7 @@ BOOL MainPage::DidGetAllRequestedPermissions(
BOOL success = FALSE;
FBAccessTokenData^ data = FBSession::ActiveSession->AccessTokenData;
- if (data)
+ if (data && data->DeclinedPermissions)
{
success = !data->DeclinedPermissions->Values->Size;
}
diff --git a/samples/LoginCpp-UWP/LoginCpp/Resources.resw b/samples/LoginCpp-UWP/LoginCpp/Resources.resw
index 83ee551..f851f8c 100644
--- a/samples/LoginCpp-UWP/LoginCpp/Resources.resw
+++ b/samples/LoginCpp-UWP/LoginCpp/Resources.resw
@@ -118,11 +118,11 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- 1606735379540755
+ 1025365401567256
Facebook Application ID
- s-1-15-2-908073630-820309149-3659463426-2390003274-961246107-3746849113-484503760
+ s-1-15-2-3089487911-215249050-3399914704-2991134715-266043697-3786854407-3873117276
Facebook "Windows Store ID" - the SID for the app (from a call to WebAuthenticationBroker::GetCurrentApplicationCallbackUri
diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FBConstants.h b/winsdkfb/winsdkfb/winsdkfb.Shared/FBConstants.h
index 63d1105..e84edf4 100644
--- a/winsdkfb/winsdkfb/winsdkfb.Shared/FBConstants.h
+++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FBConstants.h
@@ -19,6 +19,8 @@
#define FACEBOOK_DESKTOP_SERVER_NAME L"https://www.facebook.com"
#define FACEBOOK_MOBILE_SERVER_NAME L"https://m.facebook.com"
#define FACEBOOK_LOGIN_SUCCESS_PATH L"/connect/login_success.html"
+#define FACEBOOK_API_8_OR_ABOVE 1
+
// Define the base version of the SDK.
// Keep in sync with winsdkfb\build\nuget\VERSION
diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp
index dc2cfef..b099130 100644
--- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp
+++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp
@@ -47,6 +47,9 @@ FBAccessTokenData::FBAccessTokenData(
#ifdef _DEBUG
DebugPrintExpirationTime();
#endif
+
+ std::wstring wsAccessToken(AccessToken->Data());
+ _graphDomain = (wsAccessToken.substr(0, 2) == L"GG") ? L"gaming" : L"facebook";
}
FBAccessTokenData::FBAccessTokenData(
@@ -64,6 +67,8 @@ FBAccessTokenData::FBAccessTokenData(
Vector^ v = ref new Vector(0);
_grantedPermissions = ref new FBPermissions(v->GetView());
_declinedPermissions = ref new FBPermissions(v->GetView());
+ std::wstring wsAccessToken(AccessToken->Data());
+ _graphDomain = (wsAccessToken.substr(0, 2) == L"GG") ? L"gaming" : L"facebook";
}
String^ FBAccessTokenData::AccessToken::get()
@@ -71,6 +76,11 @@ String^ FBAccessTokenData::AccessToken::get()
return _accessToken;
}
+String^ FBAccessTokenData::GraphDomain::get()
+{
+ return _graphDomain;
+}
+
DateTime FBAccessTokenData::ExpirationDate::get()
{
return _expirationDate;
diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h
index 3df957d..adeb5a9 100644
--- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h
+++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h
@@ -50,6 +50,14 @@ namespace winsdkfb
Platform::String^ get();
}
+ /**
+ * Graph domain should be used for current access token.
+ */
+ property Platform::String^ GraphDomain
+ {
+ Platform::String^ get();
+ }
+
/**
* Expiration date of the access token.
*/
@@ -119,6 +127,7 @@ namespace winsdkfb
#endif
Platform::String^ _accessToken;
+ Platform::String^ _graphDomain;
Windows::Foundation::DateTime _expirationDate;
FBPermissions^ _grantedPermissions;
FBPermissions^ _declinedPermissions;
diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp
index 8d12db0..83a06af 100644
--- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp
+++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp
@@ -398,8 +398,8 @@ Uri^ FBClient::PrepareRequestUri(
PropertySet^ parameters
)
{
+ String^ graphDomain = L"facebook";
FBSession^ sess = FBSession::ActiveSession;
- GraphUriBuilder^ uriBuilder = ref new GraphUriBuilder(path);
if (parameters == nullptr)
{
@@ -427,11 +427,24 @@ Uri^ FBClient::PrepareRequestUri(
sess->AccessTokenData->AccessToken);
}
+ // For applications using Facebook Login for Gaming, graph API requests
+ // should be sent to different graph domain: graph.fb.gg
+ if (parametersWithoutMediaObjects->HasKey("access_token"))
+ {
+ String^ accessToken = safe_cast(parametersWithoutMediaObjects->Lookup("access_token"));
+ std::wstring wsAccessToken(accessToken->Data());
+ if ((wsAccessToken.substr(0, 2) == L"GG"))
+ {
+ graphDomain = L"gaming";
+ }
+ }
+
if (parametersWithoutMediaObjects->HasKey("format"))
{
parametersWithoutMediaObjects->Insert("format", "json-strings");
}
+ GraphUriBuilder^ uriBuilder = ref new GraphUriBuilder(path, graphDomain);
SerializeParameters(parametersWithoutMediaObjects);
// Add remaining parameters to query string. Note that parameters that
diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp
index fe30e62..ec5ea0d 100644
--- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp
+++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp
@@ -98,8 +98,8 @@ FBSession::FBSession() :
{
login_evt = CreateEventEx(NULL, NULL, 0, DELETE | SYNCHRONIZE);
}
- _APIMajorVersion = 2;
- _APIMinorVersion = 6;
+ _APIMajorVersion = 11;
+ _APIMinorVersion = 0;
#if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
_webViewRedirectDomain = FACEBOOK_MOBILE_SERVER_NAME;
#else
@@ -209,8 +209,15 @@ task FBSession::GetUserInfo(
)
{
PropertySet^ parameters = ref new PropertySet();
- parameters->Insert(L"fields",
- L"gender,link,first_name,last_name,locale,timezone,email,updated_time,verified,name,id,picture");
+ if (TokenData->GraphDomain == L"gaming")
+ {
+ parameters->Insert(L"fields", L"link,email,name,id,picture");
+ }
+ else
+ {
+ parameters->Insert(L"fields",
+ L"gender,link,first_name,last_name,locale,timezone,email,updated_time,verified,name,id,picture");
+ }
FBSingleValue^ value = ref new FBSingleValue(
"/me",
parameters,
@@ -1326,7 +1333,9 @@ int FBSession::APIMinorVersion::get()
void FBSession::SaveGrantedPermissions()
{
auto values =FBSession::DataContainer->Values;
- values->Insert(GRANTED_PERMISSIONS_KEY, AccessTokenData->GrantedPermissions->ToString());
+ if (AccessTokenData->GrantedPermissions != nullptr) {
+ values->Insert(GRANTED_PERMISSIONS_KEY, this->_AccessTokenData->GrantedPermissions->ToString());
+ }
}
String^ FBSession::GetGrantedPermissions()
diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp
index 0b17f0b..95fad53 100644
--- a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp
+++ b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp
@@ -27,11 +27,13 @@ using namespace Windows::Foundation::Collections;
using namespace winsdkfb;
-GraphUriBuilder::GraphUriBuilder(String^ path)
+GraphUriBuilder::GraphUriBuilder(String^ path, String^ graphDomain)
:
_queryParams { ref new PropertySet() }
{
Uri^ testUri;
+ // New api returns partial URL, and needs to be builded after this block
+#if !FACEBOOK_API_8_OR_ABOVE
bool buildDomain = false;
try
{
@@ -41,10 +43,17 @@ GraphUriBuilder::GraphUriBuilder(String^ path)
{
buildDomain = true;
}
+#else
+ bool buildDomain = true;
+#endif
if (buildDomain)
{
String^ domain = L"https://graph.facebook.com/";
+ if (graphDomain == L"gaming")
+ {
+ domain = L"https://graph.fb.gg/";
+ }
testUri = ref new Uri(domain + path);
}
_host = testUri->Host;
diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h
index 18971c5..7904f3e 100644
--- a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h
+++ b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h
@@ -23,7 +23,7 @@ namespace winsdkfb
public ref class GraphUriBuilder sealed
{
public:
- GraphUriBuilder(Platform::String^ path);
+ GraphUriBuilder(Platform::String^ path, Platform::String^ graphDomain);
Windows::Foundation::Uri^ MakeUri();
void AddQueryParam(Platform::String^ query, Platform::String^ param);
diff --git a/winsdkfb/winsdkfb_uwp/FBWinStoreCppTests/FBWinStoreCppTests.vcxproj b/winsdkfb/winsdkfb_uwp/FBWinStoreCppTests/FBWinStoreCppTests.vcxproj
index 40948e7..0854acc 100644
--- a/winsdkfb/winsdkfb_uwp/FBWinStoreCppTests/FBWinStoreCppTests.vcxproj
+++ b/winsdkfb/winsdkfb_uwp/FBWinStoreCppTests/FBWinStoreCppTests.vcxproj
@@ -7,8 +7,8 @@
14.0
true
Windows Store
- 10.0.10240.0
- 10.0.10240.0
+ 10.0
+ 10.0.19041.0
10.0
14.0
true
@@ -43,37 +43,37 @@
Application
true
- v140
+ v142
Application
true
- v140
+ v142
Application
true
- v140
+ v142
Application
false
true
- v140
+ v142
true
Application
false
true
- v140
+ v142
true
Application
false
true
- v140
+ v142
true
diff --git a/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/FBWinStoreCsTests.csproj b/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/FBWinStoreCsTests.csproj
index 14aef32..7c9d638 100644
--- a/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/FBWinStoreCsTests.csproj
+++ b/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/FBWinStoreCsTests.csproj
@@ -11,8 +11,8 @@
FBWinStoreCsTests
en-US
UAP
- 10.0.10240.0
- 10.0.10240.0
+ 10.0.17763.0
+ 10.0.17763.0
14
512
{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
@@ -23,6 +23,7 @@
x86|x64|arm
Never
F4E6BFEE8265BFC1A3B4A18D7F46397C6891526C
+ win10-arm;win10-arm-aot;win10-x86;win10-x86-aot;win10-x64;win10-x64-aot
true
@@ -104,7 +105,6 @@
winsdkfb_testing_key.pfx
-
@@ -222,6 +222,14 @@
winsdkfb
+
+
+ 5.0.0
+
+
+ 7.0.1
+
+
14.0
diff --git a/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/project.json b/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/project.json
deleted file mode 100644
index f93afb3..0000000
--- a/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0",
- "Newtonsoft.Json": "7.0.1"
- },
- "frameworks": {
- "uap10.0": {}
- },
- "runtimes": {
- "win10-arm": {},
- "win10-arm-aot": {},
- "win10-x86": {},
- "win10-x86-aot": {},
- "win10-x64": {},
- "win10-x64-aot": {}
- }
-}
\ No newline at end of file
diff --git a/winsdkfb/winsdkfb_uwp/winsdkfb_uwp/winsdkfb_uwp.vcxproj b/winsdkfb/winsdkfb_uwp/winsdkfb_uwp/winsdkfb_uwp.vcxproj
index 6ee2d9f..55ac3df 100644
--- a/winsdkfb/winsdkfb_uwp/winsdkfb_uwp/winsdkfb_uwp.vcxproj
+++ b/winsdkfb/winsdkfb_uwp/winsdkfb_uwp/winsdkfb_uwp.vcxproj
@@ -42,42 +42,42 @@
true
Windows Store
8.2
- 10.0.14393.0
- 10.0.10240.0
+ 10.0
+ 10.0.19041.0
DynamicLibrary
true
- v140
+ v142
DynamicLibrary
true
- v140
+ v142
DynamicLibrary
true
- v140
+ v142
DynamicLibrary
false
true
- v140
+ v142
DynamicLibrary
false
true
- v140
+ v142
DynamicLibrary
false
true
- v140
+ v142