在取消分配<sfauthenticationviewcontroller>时尝试加载视图控制器的视图

时间:2018-01-03 11:44:34

标签: ios swift oauth-2.0

得到一个非常奇怪的错误,尝试使用一些非常简单的代码。

import SafariService

class ViewController: UIViewController{
    ///All my stuff

    @IBAction func connectToReddit(){
        let authURL = URL(string: "https://www.reddit.com/api/v1/authorize?client_id=myID&response_type=code&state=myState&redirect_uri=myRedirectURI&duration=permanent&scope=myscopes")

        let scheme = "redditwatch://"
        let authSession = SFAuthenticationSession(url: authURL!, callbackURLScheme: scheme, completionHandler: { (url, error) in
            print(url?.absoluteString)
            print(error?.localizedDescription)

        })

        authSession.start()

    }
}

据我了解,authSession.start()向用户显示UIAlertController,其中我的代码 ,但控制器会在之后消失,错误

[Warning] Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<SFAuthenticationViewController: 0x7fc1c201f600>)

您认为创建此身份验证流程会更简单,但显然不是。

感谢任何输入,谢谢

1 个答案:

答案 0 :(得分:3)

您需要在顶层保留对SFAuthenticationSession的引用。 这应该纠正这个问题:

import SafariService

class ViewController: UIViewController{
    var authSession: SFAuthenticationSession?

    ///All my stuff
    @IBAction func connectToReddit(){
        let authURL = URL(string: "https://www.reddit.com/api/v1/authorize?client_id=myID&response_type=code&state=myState&redirect_uri=myRedirectURI&duration=permanent&scope=myscopes")

        let scheme = "redditwatch://"
        authSession = SFAuthenticationSession(url: authURL!, callbackURLScheme: scheme, completionHandler: { (url, error) in
            print(url?.absoluteString)
            print(error?.localizedDescription)
        })

        authSession?.start()
    }
}

对此媒体帖子的此修补程序的评价:https://medium.com/the-traveled-ios-developers-guide/ios-11-privacy-and-single-sign-on-6291687a2ccc 我在官方文档中找不到对范围问题的引用。

编辑:official documentation现在声明&#34;确保在会话进行时存在对SFAuthenticationSession实例的强引用。&#34;这似乎表明需要在会议范围内推动会议。这是由于SFAuthenticationSession初始化程序显示同意对话框时发生的行为。

Edit2:SFAuthenticationSession在iOS 12中已弃用,并替换为ASWebAuthenticationSession。但是,ASWebAuthenticationSession具有相同的范围要求。 This blog对如何转换有很好的描述。