Уведомление SFSafariViewController при получении токена

#c# #xamarin #paypal #sfsafariviewcontrollerdelegate

#c# #xamarin #paypal #sfsafariviewcontrollerdelegate

Вопрос:

Преобразование кода в следующем примере swift в C # (Xamarin) для уведомления приложения о получении токена Paypal внутри SFSafariViewController, но это не запускает метод.

https://github.com/paypal/paypal-here-sdk-ios-distribution/blob/master/SampleApp/PPHSDKSampleApp/InitializeViewController.swift

Преобразовал swift в C # следующим образом, но после входа пользователя в PayPal и получения токена Safari не закрывается для запуска SetupMerchant()

UrlSchemes также имеет значение retailsdksampleapp, чтобы соответствовать образцу приложения swift от PayPal.

 SafariDelegate safariDelegate = new SafariDelegate(this);
NSNotificationCenter.DefaultCenter.AddObserver(new NSString("kCloseSafariViewControllerNotification"), safariDelegate.SetupMerchant);
  
 void loadBrowser()
{
    var url = new NSUrl("https://paypalauth.herokuapp.com/toPayPal/"   Application.paypalEnvironment   "?returnTokenOnQueryString=true");
    var svc = new SFSafariViewController(url);
    svc.Delegate = safariDelegate;
    this.PresentViewController(svc, true, null);
}
  
 public class SafariDelegate : SFSafariViewControllerDelegate
{
    ViewController _controller = null;
    public SafariDelegate(ViewController controller)
    {
        _controller = controller;
    }

    public void SetupMerchant(NSNotification notification)
    {
        // Dismiss the SFSafariViewController when the notification of token has been received.
            this._controller.PresentedViewController?.DismissViewController(true, () => { });

        // Grab the token(s) from the notification and pass it into the merchant initialize call to set up
        // the merchant.  Upon successful initialization, the 'Connect Card Reader' button will be
        // enabled for use.
        var accessToken = notification.Object.ToString();
    }
}
  

При запуске приложения swift sample от Paypal оно закрывает браузер (SFSafariViewController) после входа в систему и запускает SetupMerchant(), но не в коде C #. Возможно, отсутствует шаг или неверное преобразование кода.

Ответ №1:

Если контроллер Safari не закрывается и у вас установлена правильная схема URLScheme (), то вам не хватает OpenUrl переопределения в вашем AppDelegate классе, который прослушивает схемы URL вашего приложения и публикует уведомление, которое прослушивает ваш контроллер просмотра.

Пример:

 [Export("application:openURL:sourceApplication:annotation:")]
public bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
    if (sourceApplication == "com.apple.SafariViewService")
    {
        var dict = HttpUtility.ParseQueryString(url.Query);
        var token = dict["access_token"];
        NSNotificationCenter.DefaultCenter.PostNotificationName("kCloseSafariViewControllerNotification", new NSString(token));
    };
    return true;
}