Xamarin iOS: как открыть SFSafariViewController с помощью NSUrlSessionMultipathServiceType.Handover - PullRequest
0 голосов
/ 23 октября 2019

У меня есть приложение Xamarin, которое в основном подключается к локальному WIFI-маршрутизатору (без доступа к Интернету) для связи с некоторыми локальными аппаратными устройствами. А для некоторых функций приложение использует NSUrlSessionMultipathServiceType.Handover (мобильная сотовая сеть) для подключения к интернет-API. Все это прекрасно работает, используя приведенный ниже код:

/// <summary>
        /// Downloads file from dropbox
        /// </summary>
        /// <param name="filepath"></param>
        /// <returns></returns>
        public Task<string> GetFile(string filepath)
        {
            TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
            NSUrl url = NSUrl.FromString(AppConfig.DropboxFileDownloadBaseUrl + AppConfig.DropboxFileDownloadEndpointUrl);

            try
            {
                NSUrlRequest req = new NSUrlRequest(url);
                var BearerToken = "Bearer " + AppConfig.DropboxAccessToken;
                var DropboxPathHeader = "{\"path\":\"" + filepath + "\"}";

                if (!string.IsNullOrEmpty(BearerToken))
                {
                    NSMutableUrlRequest mutableRequest = new NSMutableUrlRequest(url);

                    try
                    {
                        NSMutableDictionary dictionary = new NSMutableDictionary();
                        dictionary.Add(new NSString("Authorization"), new NSString(BearerToken));
                        dictionary.Add(new NSString("Dropbox-API-Arg"), new NSString(DropboxPathHeader));
                        mutableRequest.Headers = dictionary;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }

                    mutableRequest.HttpMethod = "POST";
                    req = (NSUrlRequest)mutableRequest.Copy();
                }



                NSUrlSession session = null;
                NSUrlSessionConfiguration myConfig = NSUrlSessionConfiguration.DefaultSessionConfiguration;
                myConfig.MultipathServiceType = NSUrlSessionMultipathServiceType.Handover;

                session = NSUrlSession.FromConfiguration(myConfig);
                NSUrlSessionTask task = session.CreateDataTask(req, (data, response, error) =>
                {
                    if (response is NSHttpUrlResponse)
                    {
                        var objNSHttpUrlResponse = response as NSHttpUrlResponse;
                        Console.WriteLine(objNSHttpUrlResponse.StatusCode);

                        if (objNSHttpUrlResponse.StatusCode == 200)
                        {
                            //Console.WriteLine(data);
                            byte[] dataBytes = new byte[data.Length];
                            Marshal.Copy(data.Bytes, dataBytes, 0, Convert.ToInt32(data.Length));

                            string enc_json = Encoding.Unicode.GetString(dataBytes);


                            //tell the TaskCompletionSource that we are done here:
                            tcs.TrySetResult(enc_json);
                        }
                        else
                        {
                            //tell the TaskCompletionSource that we are done here:
                            tcs.TrySetResult(null);
                        }
                    }
                    else
                    {
                        //tell the TaskCompletionSource that we are done here:
                        tcs.TrySetResult(null);
                    }


                });

                task.Resume();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);

                //tell the TaskCompletionSource that we are done here:
                tcs.TrySetResult(null);
            }

            return tcs.Task;
        }

Но теперь у меня есть требование для аутентификации пользователей с помощью Dropbox OAuth API с использованием SFSafariViewController. Я знаю, как использовать SFSafariViewController, когда я нахожусь в Wi-Fi WIFI или сотовой сети.

Но я не могу найти способ автоматически переключиться на сотовую сеть iPhone, когда iPhone подключен к «без интернета» WIFI роутер, когда яхотите открыть какой-нибудь URL-адрес OAuth (пример URL-адреса OAuth ниже) или любой URL-адрес (например, https://www.google.com) с использованием SFSafariViewController.

OAuth URL: https://www.dropbox.com/oauth2/authorize?client_id=DROPBOX_KEY&response_type=code&redirect_uri=REDIRECT_URL

Пожалуйста, сообщите. Спасибо.

...