Setelah memperbarui pod weblogin tidak dikompilasi dalam versi ios 10.
Ketika saya mengubah ke versi 11.0 ios dikatakan:
InstagramLoginWebView
sebagai gantinya.InstagramLoginWebViewProtocol
sebagai gantinya.Ketika saya mengubah InstagramLoginWebViewDelegate menjadi InstagramLoginWebViewProtocol:
Kode saya:
kelas 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**
}
}
ekstensi LoginViewController : InstagramLoginWebViewProtocol { --'InstagramLoginWebViewProtocol' mengharuskan 'LoginViewController' mewarisi dari 'UIView'
func userLoggedSuccessfully() {
print("User Logged Successfully")
DispatchQueue.main.async {
self.loginWebView.removeFromSuperview()
}
}
Hai @effecttwins 😊
InstagramLoginWebView
telah banyak berubah pada pembaruan terakhir, dan dukungan untuk iOS 10.*
harus dihentikan karena ketidakcocokan.
Menggunakan loginDelegate
tidak lagi disarankan, meskipun masih berfungsi.
Yang harus Anda lakukan untuk mendapatkan perilaku yang biasa Anda lakukan adalah mengatur properti berikut pada loginWebView
:
didReachEndOfLoginFlow
adalah _closure_ yang disebut seperti redirected
dulu.didSuccessfullyLogIn
adalah _closure_ menggantikan _delegate_ userLoggedSuccessfully()
.completionHandler
adalah _closure_ menggantikan webViewFinishedToLoadUser(sessionChache:handler:)
_delegate_Ini adalah kode yang diperbarui untuk 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()
}
}
jadi ketika saya mengubah ekstensi InstagramLoginWebViewDelegate ke InstagramLoginWebViewProtocol dan dikatakan: 'InstagramLoginWebViewProtocol' mengharuskan 'LoginViewController' mewarisi dari 'UIView'
Kode:
ekstensi 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)")
}
}
Anda tidak boleh menyesuaikan diri dengan InstagramLoginWebViewProtocol
.
Salahku karena tidak menandainya internal
. Saya minta maaf.
Ini semua kode yang Anda butuhkan. Tidak InstagramLoginWebViewProtocol
. Tidak 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 terima kasih atas semua bantuan Anda.
Tapi halaman login instagram tidak dimuat hanya ada halaman putih di layar
Ini semua kode yang Anda butuhkan. Tidak
InstagramLoginWebViewProtocol
. TidakInstagramLoginWebViewDelegate
.
@effecttwins salin dan tempel kode yang saya tulis di atas. Jangan lupa hubungi loadInstagramLogin()
.
Ini benar-benar sudah diterapkan untuk Anda 😊
Berhasil
ya saya menyalin dan menempelkan semua kode dan memanggil loadInstagramLogin :)
Juga menghapus InstagramLoginWebViewProtocol dan InstagramLoginWebViewDelegate
di konsol saya mendapatkan kesalahan ini, saya tidak yakin ini terkait dengan proyek ini atau tidak
Tidak dapat memberi sinyal layanan com.apple.WebKit.Networking: 113: Tidak dapat menemukan layanan yang ditentukan
Maaf, saya tidak pernah menambahkan loginWebView
ke view
di kode saya hahaha
Saya sudah mengeditnya. Periksa lagi. Seharusnya berfungsi sekarang @effecttwins
Kamu luar biasa @sbertix
Ini bekerja sekarang
Terima kasih atas bantuan kalian semua
Hai @sbertix
Apa yang terjadi Saya mengikuti pola MVVM dan tampilan saya dan viewController saya ada di file yang berbeda? Tampilan seharusnya tidak mengirim data ke View Controller. Apakah ada cara untuk mengakses fungsi didSuccessfullyLogIn
setelah inisialisasi InstagramLoginWebView?
Anda tidak perlu init
InstagramLoginWebView
dengan didSuccessfullyLogIn
(ini opsional).
Dan bahkan dengan _closures_ lainnya: Anda dapat menetapkan nilai yang berbeda begitu Anda memilikinya.
@anonrig
Bisakah Anda memberikan contoh ini, jika saya boleh bertanya? @sbertix :)
Tentu. Bisakah Anda mengirim info lebih lanjut tentang kode Anda? Cara model dan tampilan Anda diatur, misalnya.
Ya tentu saja!
Sebelum 1.7.x saya menangani event sukses login di level ViewController menggunakan delegates
Contoh tampilan:
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")
}
}
Contoh 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")
}
}
Saya tidak tahu persis apa itu LoginWebViewModel
... tetapi jika tujuannya adalah untuk memasukkan semuanya ke dalam completeObservable
Anda cukup melakukan:
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")
}
}
Saya telah mengubah InstagramLoginWebView
init(frame:)
menjadi init(frame:completionHandler:)
dan kemudian memperbarui completionHandler
untuk mendorong nilai ke subjek Anda.
Terima kasih @sbertix