Swiftyinsta: WebLogin não funciona

Criado em 22 jul. 2019  ·  16Comentários  ·  Fonte: TheM4hd1/SwiftyInsta

Após atualizar o pod weblogin não compilado na versão ios 10.
Quando eu mudo para a versão 11.0 do ios, ele diz:

  • 'loginDelegate' está obsoleto: em vez disso, use InstagramLoginWebView properties.
  • 'InstagramLoginWebViewDelegate' está obsoleto: use as propriedades InstagramLoginWebViewProtocol closure.

Quando mudei InstagramLoginWebViewDelegate para InstagramLoginWebViewProtocol:

  • 'InstagramLoginWebViewProtocol' requer que 'LoginViewController' herde de 'UIView'

Meus códigos:

class LoginViewController: UIViewController {

var loginWebView: InstagramLoginWebView! = nil

override func viewDidLoad() {
    super.viewDidLoad()

    loginWebView = InstagramLoginWebView(frame: self.view.frame)
    self.view.addSubview(loginWebView!)
    loginWebView?.loginDelegate = self **-- Cannot assign value of type 'LoginViewController' to type 'InstagramLoginWebViewDelegate?'**
    self.loginWebView?.loadInstagramLogin(isNeedPreloadForCookieSync: true) **--Argument passed to call that takes no arguments**
}

}

extensão LoginViewController: InstagramLoginWebViewProtocol { - 'InstagramLoginWebViewProtocol' requer que 'LoginViewController' seja herdado de 'UIView'

func userLoggedSuccessfully() {
    print("User Logged Successfully")

    DispatchQueue.main.async {
        self.loginWebView.removeFromSuperview()
    }

}
help wanted

Todos 16 comentários

Ei @effecttwins 😊

InstagramLoginWebView mudou muito na última atualização, e o suporte para iOS 10.* teve que ser cancelado devido a incompatibilidade.
Usar loginDelegate não é mais sugerido, embora ainda seja funcional.
Tudo o que você precisa fazer para obter o comportamento com o qual está acostumado é definir as seguintes propriedades em seu loginWebView :

  • didReachEndOfLoginFlow é uma _closure_ chamada como redirected costumava.
  • didSuccessfullyLogIn é um _closure_ substituindo o userLoggedSuccessfully() do _delegate_.
  • completionHandler é um _closure_ substituindo o webViewFinishedToLoadUser(sessionChache:handler:) do _delegate_

Este é o código atualizado para 1.7.* .

class LoginViewController: UIViewController {
    var loginWebView: InstagramLoginWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        loginWebView = InstagramLoginWebView(frame: self.view.frame,
                                             didSuccessfullyLogIn: { [weak self] in DispatchQueue.main.async { self?.loginWebView.removeFromSuperview() }},
                                             completionHandler: { sessionCache, handler in /* do whaterver you need to */ })
        view.addSubview(loginWebView)
        loginWebView.loadInstagramLogin()
    }
}

então, quando eu mudo a extensão InstagramLoginWebViewDelegate para InstagramLoginWebViewProtocol e diz: 'InstagramLoginWebViewProtocol' requer que 'LoginViewController' herde de 'UIView'

Código:

extensão LoginViewController: InstagramLoginWebViewDelegate {

func userLoggedSuccessfully() {
    print("User Logged Successfully")

}

func webViewFinishedToLoadUser(sessionCache: SessionCache, handler: APIHandlerProtocol) {
    print("Loading user with sessioncache is successful")

    do{
        let encoder = JSONEncoder()
        let data = try encoder.encode(sessionCache)

        let sessionCacheString = String(data: data, encoding: .utf8)

    }catch {
        print("Whoops, an error occured: \(error)")
    }


}

Você nunca deve InstagramLoginWebViewProtocol .
Minha culpa por não marcá-lo internal . Peço desculpas.

Este é todo o código de que você precisa. Não InstagramLoginWebViewProtocol . Não InstagramLoginWebViewDelegate .

import UIKit
import SwiftyInsta

class LoginViewController: UIViewController {
    var loginWebView: InstagramLoginWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        loginWebView = InstagramLoginWebView(frame: view.frame,
                                             didReachEndOfLoginFlow: nil,
                                             didSuccessfullyLogIn: { [weak self] in
                                                // I would actually put this in `didReachEndOfLoginFlow`,
                                                // so the user never sees their timeline blinking.
                                                DispatchQueue.main.async {
                                                    self?.loginWebView.removeFromSuperview()
                                                }
            },
                                             completionHandler: { sessionCache, _ in
                                                print("Loading user with sessioncache is successful")

                                                do {
                                                    let encoder = JSONEncoder()
                                                    let data = try encoder.encode(sessionCache)

                                                    let sessionCacheString = String(data: data, encoding: .utf8)
                                                } catch {
                                                    print("Whoops, an error occured: \(error)")
                                                }
        })
        view.addSubview(loginWebView)
        loginWebView.loadInstagramLogin()
    }
}

@sbertix, obrigado por sua ajuda.
Mas a página de login do Instagram não foi carregada; há apenas uma página em branco na tela

Este é todo o código de que você precisa. Não InstagramLoginWebViewProtocol . Não InstagramLoginWebViewDelegate .

@effecttwins copie e cole o código que escrevi acima. Não se esqueça de ligar para loadInstagramLogin() .
Já está literalmente implementado para você 😊
Funciona

sim, copiei e colei todo o código e chamei loadInstagramLogin :)
Também excluiu InstagramLoginWebViewProtocol e InstagramLoginWebViewDelegate

no console estou recebendo este erro, não tenho certeza se está relacionado com este projeto ou não
Não foi possível sinalizar o serviço com.apple.WebKit.Networking: 113: Não foi possível encontrar o serviço especificado

Desculpe, nunca adicionei loginWebView a view em meu código hahaha
Eu editei. Verifique novamente. Deve funcionar agora @effecttwins

Você é incrível @sbertix
Está funcionando agora
Obrigado por toda a ajuda de vocês

Ei @sbertix

O que acontece? Estou seguindo o padrão MVVM e minha visão e meu viewController estão em arquivos diferentes? A visualização não deve enviar dados para o View Controller. Existe como ter acesso à função didSuccessfullyLogIn após a inicialização do InstagramLoginWebView?

Você não precisa init InstagramLoginWebView com um didSuccessfullyLogIn (é opcional).
E mesmo com os outros _closures_: você pode simplesmente atribuir um valor diferente assim que o tiver.
@anonrig

Você pode dar um exemplo disso, se posso perguntar? @sbertix :)

Certo. Você pode enviar mais informações sobre o seu código? A forma como seu modelo e vista são configurados, por exemplo.

Sim claro!

Antes de 1.7.x, eu estava lidando com o evento de sucesso de login no nível ViewController usando o delegates

Visualização de exemplo:

final class LoginWebView: UIView {
    // MARK: - Properties
    var bag = DisposeBag()

    private(set) lazy var webView: InstagramLoginWebView = InstagramLoginWebView(frame: UIScreen.main.bounds)

    private(set) lazy var closeButtonLabel: UILabel = {
        let label: UILabel = .create(text: "Close".localized(), numberOfLines: 1, textAlignment: .center, textColor: .white, font: .light(size: 16))
        label.isUserInteractionEnabled = true
        return label
    }()

    private(set) lazy var closeButtonBarItem: UIBarButtonItem = UIBarButtonItem(customView: closeButtonLabel)

    // MARK: - Initialization
    init() {
        super.init(frame: .zero)

        [webView].forEach(addSubview(_:))

        webView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Exemplo de ViewController:

final class LoginWebViewController: UIViewController, View, ErrorDisplayer {
    // MARK: - Properties
    private lazy var viewSource = LoginWebView()

    private(set) var bag: DisposeBag
    private(set) var viewModel: LoginWebViewModel
    private(set) var completionObservable = PublishSubject<(SessionCache?, APIHandlerProtocol?)?>()

    // MARK: - Initialization
    init() {
        bag = DisposeBag()
        viewModel = LoginWebViewModel()

        super.init(nibName: nil, bundle: nil)

        bindErrorHandling()
        observeDatasource()
    }

    // MARK: - Life cycle
    override func loadView() {
        view = viewSource
        view.backgroundColor = .white
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        viewSource.webView.loginDelegate = self
        viewSource.webView.loadInstagramLogin(isNeedPreloadForCookieSync: true)

        // viewSource.webView.didSuccessfullyLogIn
        configureNavBar(with: "Login".localized(), prefersLargeTitle: false)

        navigationItem.rightBarButtonItem = viewSource.closeButtonBarItem
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Não sei exatamente o que LoginWebViewModel é ... mas se o objetivo é colocar tudo em completeObservable você pode simplesmente fazer:

final class LoginWebView: UIView {
    // MARK: - Properties
    var bag = DisposeBag()

    private(set) lazy var webView: InstagramLoginWebView = InstagramLoginWebView(frame: UIScreen.main.bounds, completionHandler: nil)

    private(set) lazy var closeButtonLabel: UILabel = {
        let label: UILabel = .create(text: "Close".localized(), numberOfLines: 1, textAlignment: .center, textColor: .white, font: .light(size: 16))
        label.isUserInteractionEnabled = true
        return label
    }()

    private(set) lazy var closeButtonBarItem: UIBarButtonItem = UIBarButtonItem(customView: closeButtonLabel)

    // MARK: - Initialization
    init() {
        super.init(frame: .zero)

        [webView].forEach(addSubview(_:))

        webView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
final class LoginWebViewController: UIViewController, View, ErrorDisplayer {
    // MARK: - Properties
    private lazy var viewSource = LoginWebView()

    private(set) var bag: DisposeBag
    private(set) var viewModel: LoginWebViewModel
    private(set) var completionObservable = PublishSubject<(SessionCache?, APIHandlerProtocol?)?>()

    // MARK: - Initialization
    init() {
        bag = DisposeBag()
        viewModel = LoginWebViewModel()

        super.init(nibName: nil, bundle: nil)

        bindErrorHandling()
        observeDatasource()
    }

    // MARK: - Life cycle
    override func loadView() {
        view = viewSource
        view.backgroundColor = .white
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        viewSource.webView.completionHandler = { [weak self] cache, handler in
            self?.completionObservable.accept((cache, handler))
        }
        viewSource.webView.loadInstagramLogin()

        // viewSource.webView.didSuccessfullyLogIn
        configureNavBar(with: "Login".localized(), prefersLargeTitle: false)

        navigationItem.rightBarButtonItem = viewSource.closeButtonBarItem
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Eu mudei InstagramLoginWebView init(frame:) para init(frame:completionHandler:) e então atualizei completionHandler para enviar valores para o seu assunto.

Obrigado @sbertix

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

rmelnik7777 picture rmelnik7777  ·  19Comentários

reefer picture reefer  ·  18Comentários

canaksoy picture canaksoy  ·  6Comentários

trentona picture trentona  ·  3Comentários

sbertix picture sbertix  ·  3Comentários