Подтвердить что ты не робот

Поддерживать файлы cookie UIWebView iOS Xamarin

У меня есть UIWebView, который аутентифицирует пользователя. Я хочу включить одиночный вход. Для этого я хочу сохранить файлы cookie, когда пользователь будет сначала аутентифицирован, а затем при следующем запуске приложения файлы cookie должны быть автоматически переданы в UIWebView и аутентифицировать пользователя без повторного ввода его учетных данных.

Я делаю что-то вроде ниже, чтобы использовать UIWebView

var uri = new Uri(AuthUrl);
           var nsurl = new NSUrl(uri.GetComponents(UriComponents.HttpRequestUrl, UriFormat.UriEscaped));
           wvLogin.LoadRequest(new NSUrlRequest(nsurl));

CookieManager.cs

public static void SaveCookies()
{

   var cookieData = new NSMutableArray ();
   var cookieStorage = NSHttpCookieStorage.SharedStorage;
   foreach (var nscookie in cookieStorage.Cookies) {
    var cookieDictionary = new NSMutableDictionary ();
    cookieDictionary.Add (NSHttpCookie.KeyName, new NSString (nscookie.Name));
    cookieDictionary.Add (NSHttpCookie.KeyValue,new NSString ( nscookie.Value));
    cookieDictionary.Add (NSHttpCookie.KeyDomain,new NSString ( nscookie.Domain));
    cookieDictionary.Add (NSHttpCookie.KeyPath, new NSString (nscookie.Path));
    cookieDictionary.Add (NSHttpCookie.KeySecure, new NSString ( nscookie.IsSecure.ToString()));
    cookieDictionary.Add (NSHttpCookie.KeyVersion, new NSString (nscookie.Version.ToString()));
    if (nscookie.ExpiresDate != null) {
     cookieDictionary.Add (NSHttpCookie.KeyExpires, nscookie.ExpiresDate);
    }
    cookieData.Add (cookieDictionary);
   }
   cookieData.WriteToFile (StoragePath(), true);
}
  public static string StoragePath()
  {
   //var paths = NSSearchPath.GetDirectories (NSSearchPathDirectory.LibraryDirectory, NSUserDomainMask, true);
   var paths =  NSSearchPath.GetDirectories(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomain.User, true);
   return paths [0].ToString ();
  }
public static void DeleteCookies()
{
NSHttpCookieStorage cookieStorage = NSHttpCookieStorage.SharedStorage;
foreach (var nscookie in cookieStorage.Cookies)
{
cookieStorage.DeleteCookie(nscookie);
}
   NSUserDefaults.StandardUserDefaults.Synchronize ();
}
  public static void LoadCookies()
  {
   var cookies = NSMutableArray.FromFile (StoragePath());
   var cookieStorage = NSHttpCookieStorage.SharedStorage;
   foreach (var nscookie in cookieStorage.Cookies)
   {
    cookieStorage.SetCookie(nscookie);

   }
  }

LoginScreen.cs

void wvLogin_LoadFinished(object sender, EventArgs e)
    {
    int redirectCount = 0;
    redirect = System.Net.WebUtility.UrlDecode(wvLogin.Request.Url.AbsoluteString);
     // Do some stuff
    CookieManager.SaveCookies();

    }
    }
    else
    {
    AppDelegate.Logout();
    }
    }
    } 

Как я могу это достичь? Любая помощь приветствуется как Iam, новичок в iOS и Xamarin.

4b9b3361

Ответ 1

Вы можете настроить сервер на выпуск постоянного файла cookie, установив подходящую дату истечения срока действия. UIWebview будет хранить/восстанавливать такие файлы cookie.

Вы также можете получить все куки, установленные при входе в UIWebView из NSHTTPCookieStorage, как сохранение в NSUserDefaults в цепочке ключей. Вы можете читать файлы cookie из NSUserDefaults/keychain при запуске приложения, вставлять их в NSHttpCookieStorage, и они будут доступны для использования UIWebView, а также NSURLConnection, NSURLRequest и т.д.

Ответ 2

Я бы рекомендовал использовать sfSafariViewController.

SafariViewControllers имеют доступ к хранилищу cookie Safari. Преимущество SafariViewControllers заключается в том, что вы, в основном, все для вас, и реализация очень проста.

Для обеспечения безопасности SafariViewController изолированы от остальных приложений для защиты файлов cookie и т.д.

Но если в вашем веб-сервисе вы реализуете API для перенаправления на собственный URL-адрес с прикрепленными файлами cookie, например. com.app://name/bob/age/12 и вы настроите com.app как настраиваемую схему URL в своем приложении, тогда вы можете перенаправить обратно в свое приложение с данными cookie.

Преимущество SafariViewControllers заключается в том, что пользователь по-прежнему будет зачислен в вашу службу, если бы они переходили на ваш сайт в сафари.

Здесь приведен пример того, как реализовать все это. Вы можете клонировать это репо и запускать его, чтобы попробовать его сами.

Надеюсь, это вам полезно,

Лиам