Après la mise à jour, le blog du pod n'est pas compilé dans la version ios 10.
Lorsque je passe à la version 11.0 d'ios, cela dit:
InstagramLoginWebView
.InstagramLoginWebViewProtocol
.Lorsque j'ai changé InstagramLoginWebViewDelegate en InstagramLoginWebViewProtocol :
Mes codes :
classe 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**
}
}
extension LoginViewController : InstagramLoginWebViewProtocol { --'InstagramLoginWebViewProtocol' nécessite que 'LoginViewController' hérite de 'UIView'
func userLoggedSuccessfully() {
print("User Logged Successfully")
DispatchQueue.main.async {
self.loginWebView.removeFromSuperview()
}
}
Hey @effecttwins 😊
InstagramLoginWebView
a beaucoup changé dans la dernière mise à jour, et la prise en charge de iOS 10.*
a dû être abandonnée en raison d'une incompatibilité.
L'utilisation de loginDelegate
n'est plus suggérée, bien que toujours fonctionnelle.
Tout ce que vous avez à faire pour obtenir le comportement auquel vous êtes habitué est de définir les propriétés suivantes sur votre loginWebView
:
didReachEndOfLoginFlow
est une _fermeture_ appelée comme redirected
auparavant.didSuccessfullyLogIn
est une _clôture_ remplaçant le userLoggedSuccessfully()
du _délégué_.completionHandler
est une _fermeture_ remplaçant les webViewFinishedToLoadUser(sessionChache:handler:)
du _délégué_Ceci est le code mis à jour pour 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()
}
}
donc quand je change l'extension InstagramLoginWebViewDelegate en InstagramLoginWebViewProtocol et qu'il dit : 'InstagramLoginWebViewProtocol' nécessite que 'LoginViewController' hérite de 'UIView'
Code:
extension LoginViewController : InstagramLoginWebViewDélégué {
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)")
}
}
Vous ne devez jamais vous conformer à InstagramLoginWebViewProtocol
.
Ma faute si je ne l'ai pas marqué internal
. Je m'excuse.
C'est tout le code dont vous avez besoin. Non InstagramLoginWebViewProtocol
. Non 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 merci pour votre aide.
Mais la page de connexion instagram n'est pas chargée, il n'y a qu'une page blanche à l'écran
C'est tout le code dont vous avez besoin. Non
InstagramLoginWebViewProtocol
. NonInstagramLoginWebViewDelegate
.
@effecttwins copie et colle le code que j'ai écrit ci-dessus. N'oubliez pas d'appeler le loadInstagramLogin()
.
C'est littéralement déjà mis en œuvre pour vous
Ça marche
oui, j'ai copié et collé tout le code et j'ai appelé loadInstagramLogin :)
Également supprimé InstagramLoginWebViewProtocol et InstagramLoginWebViewDelegate
dans la console, j'obtiens cette erreur, je ne suis pas sûr qu'elle soit liée à ce projet ou non
Impossible de signaler le service com.apple.WebKit.Networking : 113 : Impossible de trouver le service spécifié
Désolé, je n'ai jamais ajouté le loginWebView
au view
dans mon code hahaha
Je l'ai édité. Vérifiez-le à nouveau. Cela devrait fonctionner maintenant @effecttwins
Tu es génial @sbertix
Il fonctionne maintenant
Merci pour votre aide
Salut @sbertix
Que se passe-t-il, je suis le modèle MVVM et ma vue et mon viewController sont dans des fichiers différents ? La vue ne doit pas envoyer de données à View Controller. Existe-t-il un moyen d'accéder à la fonction didSuccessfullyLogIn
après l'initialisation d'InstagramLoginWebView ?
Vous n'avez pas besoin de init
InstagramLoginWebView
avec un didSuccessfullyLogIn
(c'est facultatif).
Et même avec les autres _fermetures_ : vous pouvez simplement attribuer une valeur différente une fois que vous l'avez.
@anonrig
Pouvez-vous en donner un exemple, si je puis me permettre ? @sbertix :)
Sûr. Pouvez-vous envoyer plus d'informations sur votre code? La façon dont votre modèle et votre vue sont configurés, par exemple.
Ouais, bien sûr!
Avant 1.7.x, je gérais l'événement de réussite de connexion au niveau de ViewController en utilisant le delegates
Exemple de vue :
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")
}
}
Exemple 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")
}
}
Je ne sais pas exactement ce qu'est LoginWebViewModel
... mais si l'objectif est de tout mettre dans completeObservable
vous pouvez simplement faire :
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")
}
}
J'ai changé InstagramLoginWebView
init(frame:)
en init(frame:completionHandler:)
, puis mis à jour le completionHandler
pour envoyer des valeurs à votre sujet.
Merci @sbertix