Swift URL с настраиваемой схемой в строке запроса не работает - Redirect_URI - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь вызвать URL-адрес с помощью URLSession для быстрого выхода из сеанса oauth2 в приложении iOS.

URL-адрес выглядит примерно так: Обратите внимание, что некоторые параметры закодированы в URL-адресе

https://xxxxxx.auth.us-east-1.amazoncognito.com/logout?client_id=49jaf4a848hakh&logout_uri=myapp%3A%2F%2F&redirect_uri=myapp%3A%2F%2F&response_type=token

Я получаю сообщение об ошибке времени выполнения, используя этот URL-адрес в задаче с данными, которая говорит:

Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" 
UserInfo={NSUnderlyingError=0x60000202ccf0 
{Error Domain=kCFErrorDomainCFNetwork Code=-1002 "(null)"}, 

NSErrorFailingURLStringKey=myapp://, NSErrorFailingURLKey=myapp://,

NSLocalizedDescription=unsupported URL}

У меня уже есть "myapp" в моем info.plist.

    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLName</key>
            <string>com.xxx.yyy</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>myapp</string>
            </array>
        </dict>
    </array>

Ниже приведен код для выполнения этой простой задачи данных URLSession

        let s = URLSession.shared
        let u = URL(string: "https://xxx.yyy.auth.us-east-1.amazoncognito.com/logout?client_id=49jaf4a848hakh&logout_uri=myapp%3A%2F%2F&redirect_uri=myapp%3A%2F%2F&response_type=token")!        
        
        let t = s.dataTask(with: u) { (d: Data?, r: URLResponse?, e:Error?) in
            if e != nil {
                print("error: \(e)")
            }
            let decoded = String(data: d!, encoding: .utf8)
            print("Data: \(decoded)")
            print("url Response: \(r)")
            print("Breakpoint")
        }.resume()

Я пробовал использовать обе строки URL, указанные ниже, и все равно получаю ту же ошибку

let u = URL(string: "https://xxx.yyy.auth.us-east-1.amazoncognito.com/logout?client_id=49jaf4a848hakh&logout_uri=myapp%3A%2F%2F&redirect_uri=myapp%3A%2F%2F&response_type=token")!        

let u = URL(string: "https://xxx.yyy.auth.us-east-1.amazoncognito.com/logout?client_id=49jaf4a848hakh&logout_uri=myapp://&redirect_uri=myapp://&response_type=token")!        

Почему swift, как "myapp: //" или (myapp% 3A% 2F% 2F) не является параметром строки запроса?

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

1 Ответ

0 голосов
/ 03 августа 2020

Это похоже на проблему с кодировкой. Вы пробовали такую ​​кодировку:

let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
...