Swiftyinsta: La connexion Web ne fonctionne pas

Créé le 22 juil. 2019  ·  16Commentaires  ·  Source: TheM4hd1/SwiftyInsta

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:

  • 'loginDelegate' est obsolète : utilisez plutôt les propriétés InstagramLoginWebView .
  • « InstagramLoginWebViewDelegate » est obsolète : utilisez plutôt les propriétés de fermeture InstagramLoginWebViewProtocol .

Lorsque j'ai changé InstagramLoginWebViewDelegate en InstagramLoginWebViewProtocol :

  • 'InstagramLoginWebViewProtocol' nécessite que 'LoginViewController' hérite de 'UIView'

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()
    }

}
help wanted

Tous les 16 commentaires

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 . Non InstagramLoginWebViewDelegate .

@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

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

trentona picture trentona  ·  3Commentaires

sbertix picture sbertix  ·  3Commentaires

canaksoy picture canaksoy  ·  6Commentaires

anonrig picture anonrig  ·  3Commentaires

reefer picture reefer  ·  18Commentaires