Swiftyinsta: WebLogin funktioniert nicht

Erstellt am 22. Juli 2019  ·  16Kommentare  ·  Quelle: TheM4hd1/SwiftyInsta

Nach dem Update wird das Pod-Weblogin nicht in der iOS 10-Version kompiliert.
Wenn ich auf die Version 11.0 von iOS wechsle, heißt es:

  • 'loginDelegate' ist veraltet: Verwenden Sie stattdessen InstagramLoginWebView Eigenschaften.
  • 'InstagramLoginWebViewDelegate' ist veraltet: Verwenden Sie stattdessen InstagramLoginWebViewProtocol Closure-Eigenschaften.

Als ich InstagramLoginWebViewDelegate in InstagramLoginWebViewProtocol geändert habe:

  • 'InstagramLoginWebViewProtocol' erfordert, dass 'LoginViewController' von 'UIView' erbt

Meine Codes:

Klasse 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**
}

}

Erweiterung LoginViewController : InstagramLoginWebViewProtocol { --'InstagramLoginWebViewProtocol' erfordert, dass 'LoginViewController' von 'UIView' erbt

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

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

}
help wanted

Alle 16 Kommentare

Hey @effecttwins 😊

InstagramLoginWebView hat sich im letzten Update stark verändert und die Unterstützung für iOS 10.* musste wegen Inkompatibilität eingestellt werden.
Die Verwendung von loginDelegate wird nicht mehr empfohlen, ist aber immer noch funktionsfähig.
Alles, was Sie tun müssen, um das gewohnte Verhalten zu erreichen, ist, die folgenden Eigenschaften für Ihr loginWebView :

  • didReachEndOfLoginFlow ist eine _Schließung_, die wie redirected aufgerufen wird.
  • didSuccessfullyLogIn ist eine _Schließung_, die die userLoggedSuccessfully() _Delegierten_ ersetzt.
  • completionHandler ist eine _Schließung_, die die webViewFinishedToLoadUser(sessionChache:handler:) _Delegierten_ ersetzt

Dies ist der aktualisierte Code für 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()
    }
}

Wenn ich also die Erweiterung InstagramLoginWebViewDelegate in InstagramLoginWebViewProtocol ändere und es sagt: 'InstagramLoginWebViewProtocol' erfordert, dass 'LoginViewController' von 'UIView' erbt

Code:

Erweiterung 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)")
    }


}

Sie sollten sich niemals an InstagramLoginWebViewProtocol .
Meine Schuld, dass ich es nicht markiert habe internal . Ich entschuldige mich.

Dies ist der gesamte Code, den Sie benötigen. Nein InstagramLoginWebViewProtocol . Nein 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 danke für deine Hilfe.
Aber die Instagram-Anmeldeseite ist nicht geladen, es gibt nur eine weiße Seite auf dem Bildschirm

Dies ist der gesamte Code, den Sie benötigen. Nein InstagramLoginWebViewProtocol . Nein InstagramLoginWebViewDelegate .

@effecttwins Kopieren Sie den Code, den ich oben geschrieben habe, und fügen Sie ihn ein. Vergessen Sie nicht, die loadInstagramLogin() anzurufen.
Es ist buchstäblich schon für euch umgesetzt 😊
Es klappt

Ja, ich habe den gesamten Code kopiert und eingefügt und loadInstagramLogin aufgerufen :)
Auch InstagramLoginWebViewProtocol und InstagramLoginWebViewDelegate gelöscht

In der Konsole erhalte ich diesen Fehler, ich bin mir nicht sicher, ob er mit diesem Projekt zusammenhängt oder nicht
Der Dienst com.apple.WebKit.Networking konnte nicht signalisiert werden: 113: Konnte den angegebenen Dienst nicht finden

Tut mir leid, ich habe in meinem Code nie loginWebView zu view hinzugefügt, hahaha
Ich habe es bearbeitet. Überprüfen Sie es erneut. Es sollte jetzt funktionieren @effecttwins

Du bist großartig @sbertix
Es funktioniert jetzt
Danke für euch alle hilfe

Hey @sbertix

Was passiert, wenn ich dem MVVM-Muster folge und meine Ansicht und mein viewController in verschiedenen Dateien sind? Die Ansicht sollte keine Daten an den Ansichtscontroller senden. Gibt es eine Möglichkeit, nach der Initialisierung des InstagramLoginWebView didSuccessfullyLogIn Funktion

Sie müssen nicht init InstagramLoginWebView mit einem didSuccessfullyLogIn (es ist optional).
Und auch bei den anderen _Verschlüssen_: Sie können einfach einen anderen Wert zuweisen, sobald Sie ihn haben.
@anonrig

Können Sie dafür ein Beispiel nennen, wenn ich fragen darf? @sbertix :)

Sicher. Können Sie weitere Informationen zu Ihrem Code senden? Zum Beispiel die Art und Weise, wie Ihr Modell und Ihre Ansicht eingerichtet sind.

Ja natürlich!

Vor 1.7.x behandelte ich das Login-Erfolgsereignis auf ViewController-Ebene mit dem delegates

Beispielansicht:

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

Beispiel 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")
    }
}

Ich weiß nicht genau, was LoginWebViewModel ist ... aber wenn das Ziel darin besteht, alles in completeObservable , können Sie einfach Folgendes tun:

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

Ich habe InstagramLoginWebView init(frame:) in init(frame:completionHandler:) geändert und dann completionHandler aktualisiert, um Werte an Ihren Betreff zu übertragen.

Danke @sbertix

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

canaksoy picture canaksoy  ·  6Kommentare

sbertix picture sbertix  ·  8Kommentare

reefer picture reefer  ·  18Kommentare

biox86 picture biox86  ·  12Kommentare

rmelnik7777 picture rmelnik7777  ·  19Kommentare