Swiftyinsta: WebLogin tidak berfungsi

Dibuat pada 22 Jul 2019  ·  16Komentar  ·  Sumber: TheM4hd1/SwiftyInsta

Setelah memperbarui pod weblogin tidak dikompilasi dalam versi ios 10.
Ketika saya mengubah ke versi 11.0 ios dikatakan:

  • 'loginDelegate' tidak digunakan lagi: gunakan properti InstagramLoginWebView sebagai gantinya.
  • 'InstagramLoginWebViewDelegate' tidak digunakan lagi: gunakan properti penutupan InstagramLoginWebViewProtocol sebagai gantinya.

Ketika saya mengubah InstagramLoginWebViewDelegate menjadi InstagramLoginWebViewProtocol:

  • 'InstagramLoginWebViewProtocol' mengharuskan 'LoginViewController' mewarisi dari 'UIView'

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

}
help wanted

Semua 16 komentar

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

@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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

trentona picture trentona  ·  3Komentar

anonrig picture anonrig  ·  3Komentar

rmelnik7777 picture rmelnik7777  ·  19Komentar

sbertix picture sbertix  ·  27Komentar

canaksoy picture canaksoy  ·  6Komentar