Skip to content
Merged
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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions Assets/Plugins/iOS/iOSBrowser.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#import <Foundation/Foundation.h>
#import <SafariServices/SafariServices.h>
#import <UIKit/UIKit.h>

@interface iOSBrowser : NSObject <SFSafariViewControllerDelegate>
@end

@implementation iOSBrowser

static UIViewController* GetCurrentViewController() {
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIViewController *rootViewController = window.rootViewController;

UIViewController *currentController = rootViewController;
while (currentController.presentedViewController) {
currentController = currentController.presentedViewController;
}
return currentController;
}

void _OpenURL(const char* url) {
NSString *urlString = [NSString stringWithUTF8String:url];
NSURL *nsURL = [NSURL URLWithString:urlString];

SFSafariViewController *safariViewController = [[SFSafariViewController alloc] initWithURL:nsURL];
UIViewController *currentViewController = GetCurrentViewController();
[currentViewController presentViewController:safariViewController animated:YES completion:nil];
}

@end

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

65 changes: 65 additions & 0 deletions Assets/Thirdweb/Core/Scripts/Browser/AndroidBrowser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#if UNITY_ANDROID

using System;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;

namespace Thirdweb.Browser
{
public class AndroidBrowser : IThirdwebBrowser
{
private TaskCompletionSource<BrowserResult> _taskCompletionSource;

private string _customScheme;

public async Task<BrowserResult> Login(string loginUrl, string customScheme, CancellationToken cancellationToken = default)
{
_taskCompletionSource = new TaskCompletionSource<BrowserResult>();

cancellationToken.Register(() =>
{
_taskCompletionSource?.TrySetCanceled();
});

_customScheme = customScheme;

Application.deepLinkActivated += OnDeepLinkActivated;

try
{
OpenURL(loginUrl);
var completedTask = await Task.WhenAny(_taskCompletionSource.Task, Task.Delay(TimeSpan.FromSeconds(60)));
if (completedTask == _taskCompletionSource.Task)
{
return await _taskCompletionSource.Task;
}
else
{
return new BrowserResult(BrowserStatus.Timeout, null, "The operation timed out.");
}
}
finally
{
Application.deepLinkActivated -= OnDeepLinkActivated;
}
}

private void OpenURL(string url)
{
AndroidJavaClass thirdwebActivityClass = new("com.unity3d.player.UnityPlayer");
AndroidJavaObject thirdwebActivity = thirdwebActivityClass.GetStatic<AndroidJavaObject>("currentActivity");
thirdwebActivity.Call("OpenCustomTab", url);
}

private void OnDeepLinkActivated(string url)
{
if (!url.StartsWith(_customScheme))
return;

_taskCompletionSource.SetResult(new BrowserResult(BrowserStatus.Success, url));
}
}
}

#endif

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions Assets/Thirdweb/Core/Scripts/Browser/CrossPlatformBrowser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Threading;
using System.Threading.Tasks;

namespace Thirdweb.Browser
{
public class CrossPlatformBrowser : IThirdwebBrowser
{
private IThirdwebBrowser _browser;

public async Task<BrowserResult> Login(string loginUrl, string redirectUrl, CancellationToken cancellationToken = default)
{
#if UNITY_ANDROID
_browser = new AndroidBrowser();
#elif UNITY_IOS
_browser = new IOSBrowser();
#else
_browser = new StandaloneBrowser();
#endif

return await _browser.Login(loginUrl, redirectUrl, cancellationToken);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

67 changes: 67 additions & 0 deletions Assets/Thirdweb/Core/Scripts/Browser/IOSBrowser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#if UNITY_IOS

using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;

namespace Thirdweb.Browser
{
public class IOSBrowser : IThirdwebBrowser
{
private TaskCompletionSource<BrowserResult> _taskCompletionSource;

private string _customScheme;

public async Task<BrowserResult> Login(string loginUrl, string customScheme, CancellationToken cancellationToken = default)
{
_taskCompletionSource = new TaskCompletionSource<BrowserResult>();

cancellationToken.Register(() =>
{
_taskCompletionSource?.TrySetCanceled();
});

_customScheme = customScheme;

Application.deepLinkActivated += OnDeepLinkActivated;

try
{
OpenURL(loginUrl);
var completedTask = await Task.WhenAny(_taskCompletionSource.Task, Task.Delay(TimeSpan.FromSeconds(60)));
if (completedTask == _taskCompletionSource.Task)
{
return await _taskCompletionSource.Task;
}
else
{
return new BrowserResult(BrowserStatus.Timeout, null, "The operation timed out.");
}
}
finally
{
Application.deepLinkActivated -= OnDeepLinkActivated;
}
}

[DllImport("__Internal")]
private static extern void _OpenURL(string url);

public void OpenURL(string url)
{
_OpenURL(url);
}

private void OnDeepLinkActivated(string url)
{
if (!url.StartsWith(_customScheme))
return;

_taskCompletionSource.SetResult(new BrowserResult(BrowserStatus.Success, url));
}
}
}

#endif

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions Assets/Thirdweb/Core/Scripts/Browser/IThirdwebBrowser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System.Threading;
using System.Threading.Tasks;

namespace Thirdweb.Browser
{
public interface IThirdwebBrowser
{
Task<BrowserResult> Login(string loginUrl, string redirectUrl, CancellationToken cancellationToken = default);
}

public enum BrowserStatus
{
Success,
UserCanceled,
Timeout,
UnknownError,
}

public class BrowserResult
{
public BrowserStatus status { get; }

public string callbackUrl { get; }

public string error { get; }

public BrowserResult(BrowserStatus status, string callbackUrl)
{
this.status = status;
this.callbackUrl = callbackUrl;
}

public BrowserResult(BrowserStatus status, string callbackUrl, string error)
{
this.status = status;
this.callbackUrl = callbackUrl;
this.error = error;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading