Skip to content

Native Facebook Login updated to latest version #79

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ These samples are supplied directly from the feature teams of Fuse and we welcom

<table>
<tr>
<td><a href="Samples/NativeFacebookLogin">Native Facebook Login</a></td>
<td><a href="Samples/AmazonS3">AmazonS3</a></td>
<td><a href="Samples/AzureADB2COAuth">Azure AD B2C login</a></td>
<td><a href="Samples/FacebookLogin">Facebook login</a></td>
Expand Down
3 changes: 3 additions & 0 deletions Samples/NativeFacebookLogin/FacebookAppId.uxl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Extensions Backend="CPlusPlus">
<Set Facebook.AppID="YOUR-FACEBOOK-APP-ID" />
</Extensions>
234 changes: 234 additions & 0 deletions Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uno
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
using Fuse;
using Fuse.Platform;
using Uno;
using Uno.Compiler.ExportTargetInterop;

[extern(iOS) Require("Xcode.FrameworkDirectory", "@('FacebookSDKs-iOS':Path)")]
[extern(iOS) Require("Xcode.Framework", "@('FacebookSDKs-iOS/FBSDKCoreKit.framework':Path)")]
[extern(iOS) Require("Xcode.Framework", "@('FacebookSDKs-iOS/FBSDKLoginKit.framework':Path)")]
[extern(iOS) ForeignInclude(Language.ObjC, "FBSDKCoreKit/FBSDKCoreKit.h")]
[extern(iOS) ForeignInclude(Language.ObjC, "FBSDKLoginKit/FBSDKLoginKit.h")]
// Reference for excludes - https://stackoverflow.com/questions/46212449/facebook-sdk-dependency-conflict
[Require("Gradle.Dependency","implementation('com.facebook.android:facebook-android-sdk:[4,5)') { exclude group: 'com.android.support', module: 'support-v4' \nexclude group: 'com.android.support', module: 'support-core-utils' }")]
[Require("Gradle.Repository","mavenCentral()")]
[ForeignInclude(Language.Java, "android.content.Intent")]
[ForeignInclude(Language.Java, "com.facebook.*")]
[ForeignInclude(Language.Java, "com.facebook.appevents.AppEventsLogger")]
[ForeignInclude(Language.Java, "org.json.JSONObject")]
[ForeignInclude(Language.Java, "org.json.JSONException")]
[ForeignInclude(Language.Java, "android.os.Bundle")]
[ForeignInclude(Language.Java, "com.facebook.login.*")]
[ForeignInclude(Language.Java, "com.fuse.Activity")]
public class FacebookLogin
{
public FacebookLogin()
{
Lifecycle.Started += Started;
Lifecycle.EnteringInteractive += OnEnteringInteractive;
Lifecycle.ExitedInteractive += OnExitedInteractive;
InterApp.ReceivedURI += OnReceivedUri;
}

[Foreign(Language.ObjC)]
extern(iOS) void Started(ApplicationState state)
@{
[[FBSDKApplicationDelegate sharedInstance]
application: [UIApplication sharedApplication]
didFinishLaunchingWithOptions: nil];
@}

extern(Android) Java.Object _callbackManager;

[Foreign(Language.Java)]
extern(Android) void Started(ApplicationState state)
@{
FacebookSdk.sdkInitialize(Activity.getRootActivity());
final CallbackManager callbackManager = CallbackManager.Factory.create();
@{FacebookLogin:Of(_this)._callbackManager:Set(callbackManager)};
Activity.subscribeToResults(new Activity.ResultListener()
{
@Override
public boolean onResult(int requestCode, int resultCode, Intent data)
{
return callbackManager.onActivityResult(requestCode, resultCode, data);
}

});
@}

extern(!iOS && !Android) void Started(ApplicationState state)
{
}

[Foreign(Language.ObjC)]
static extern(iOS) void OnEnteringInteractive(ApplicationState state)
@{
[FBSDKAppEvents activateApp];
@}

[Foreign(Language.Java)]
static extern(Android) void OnEnteringInteractive(ApplicationState state)
@{
AppEventsLogger.activateApp(Activity.getRootActivity());
@}

static extern(!iOS && !Android) void OnEnteringInteractive(ApplicationState state)
{
}

[Foreign(Language.Java)]
static extern(Android) void OnExitedInteractive(ApplicationState state)
@{
AppEventsLogger.deactivateApp(Activity.getRootActivity());
@}

static extern(!Android) void OnExitedInteractive(ApplicationState state)
{
}

static void OnReceivedUri(string uri)
{
debug_log "Received Uri: " + uri;
if (uri.StartsWith("fb"))
{
OpenFacebookURL(uri);
}
}

[Foreign(Language.ObjC)]
static extern(iOS) void OpenFacebookURL(string url)
@{
[[FBSDKApplicationDelegate sharedInstance]
application: [UIApplication sharedApplication]
openURL: [NSURL URLWithString:url]
sourceApplication: @"com.apple.mobilesafari"
annotation: nil];
@}

static extern(!iOS) void OpenFacebookURL(string url)
{
}

public class User
{
extern string _id;
extern string _name;
extern string _email;
extern string _token;

public User(String id, String name, String email, String token)
{
_id = id;
_name = name;
_email = email;
_token = token;
}

public string getId() {
return _id;
}

public string getName() {
return _name;
}

public string getEmail() {
return _email;
}

public string getTokenString() {
return _token;
}
}

[Foreign(Language.ObjC)]
public extern(iOS) void Login(Action<User> onSuccess, Action onCancelled, Action<string> onError)
@{
FBSDKLoginManager* login = [[FBSDKLoginManager alloc] init];
[login
logInWithReadPermissions: @[@"public_profile", @"email"]
fromViewController: [[[UIApplication sharedApplication] keyWindow] rootViewController]
handler: ^(FBSDKLoginManagerLoginResult* result, NSError* error)
{
if (error)
{
onError([error localizedDescription]);
return;
}
if (result.isCancelled)
{
onCancelled();
return;
}
if ([FBSDKAccessToken currentAccessToken])
{
NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
[parameters setValue:@"id,name,email" forKey:@"fields"];

[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
if (!error)
{
id<UnoObject> user = @{User(string, string, string, string):New(result[@"id"], result[@"name"], result[@"email"], [FBSDKAccessToken currentAccessToken].tokenString)};
onSuccess(user);
}
}];
}
}
];
@}

[Foreign(Language.Java)]
[Require("Entity", "User(string, string, string, string)")]
public extern(Android) void Login(Action<User> onSuccess, Action onCancelled, Action<string> onError)
@{
CallbackManager callbackManager = (CallbackManager)@{FacebookLogin:Of(_this)._callbackManager:Get()};
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>()
{
@Override
public void onSuccess(LoginResult loginResult)
{
final AccessToken accessToken = loginResult.getAccessToken();

GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(
JSONObject object,
GraphResponse response) {
try {
String fbUserId = object.getString("id");
String fbUserName = object.getString("name");
String fbEmail = object.getString("email");
String tokenString = accessToken.getToken();

UnoObject user = @{User(string, string, string, string):New(fbUserId, fbUserName, fbEmail, tokenString)};
onSuccess.run(user);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email");
request.setParameters(parameters);
request.executeAsync();
}

@Override
public void onCancel()
{
onCancelled.run();
}

@Override
public void onError(FacebookException exception)
{
onError.run(exception.toString());
}
}
);
LoginManager.getInstance().logInWithReadPermissions(Activity.getRootActivity(), java.util.Arrays.asList("public_profile", "email"));
@}
}
17 changes: 17 additions & 0 deletions Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"IsTransitive": true,
"Packages": [
"Fuse",
"Fuse.Platform",
"Fuse.Scripting",
"FuseJS",
"Uno.Permissions",
"Uno.Threading",
],
"Includes": [
"FacebookLogin.uno",
"FacebookLogin.uxl",
"FacebookLoginModule.uno",
"FacebookSDKs-iOS.stuff",
],
}
76 changes: 76 additions & 0 deletions Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uxl
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<Extensions Backend="CPlusPlus">
<Require Condition="Android" Android.ResStrings.Declaration>
<![CDATA[
<string name="facebook_app_id">@(Facebook.AppID)</string>
<string name="fb_login_protocol_scheme">fb@(Facebook.AppID)</string>
]]>
</Require>
<Require Condition="Android" AndroidManifest.Permission>
<![CDATA[
android.permission.INTERNET
]]>
</Require>
<Require Condition="Android" AndroidManifest.ApplicationElement>
<![CDATA[
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />
<activity android:name="com.facebook.FacebookActivity"
android:configChanges=
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
]]>
</Require>
<Require Condition="iOS" Xcode.Plist.Element>
<![CDATA[
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb@(Facebook.AppID)</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>@(Facebook.AppID)</string>
<key>FacebookDisplayName</key>
<string>Fuse Test App</string>

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key> <true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key> <true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/>
</dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key> <true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/>
</dict>
</dict>
</dict>

<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbauth2</string>
</array>
]]>
</Require>
</Extensions>
Loading