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:
InstagramLoginWebView
properties.InstagramLoginWebViewProtocol
closure.Quando mudei InstagramLoginWebViewDelegate para InstagramLoginWebViewProtocol:
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()
}
}
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ãoInstagramLoginWebViewDelegate
.
@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