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:
InstagramLoginWebView
Eigenschaften.InstagramLoginWebViewProtocol
Closure-Eigenschaften.Als ich InstagramLoginWebViewDelegate in InstagramLoginWebViewProtocol geändert habe:
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()
}
}
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_ ersetztDies 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
. NeinInstagramLoginWebViewDelegate
.
@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