Swiftyinsta: 网页登录无效

创建于 2019-07-22  ·  16评论  ·  资料来源: TheM4hd1/SwiftyInsta

更新后 pod weblogin 未在 ios 10 版本中编译。
当我更改为 11.0 版本的 ios 时,它说:

  • 不推荐使用“loginDelegate”:改用InstagramLoginWebView属性。
  • 不推荐使用“InstagramLoginWebViewDelegate”:改用InstagramLoginWebViewProtocol闭包属性。

当我将 InstagramLoginWebViewDelegate 更改为 InstagramLoginWebViewProtocol 时:

  • “InstagramLoginWebViewProtocol”要求“LoginViewController”继承自“UIView”

我的代码:

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

}

扩展 LoginViewController : InstagramLoginWebViewProtocol { --'InstagramLoginWebViewProtocol' 要求 'LoginViewController' 继承自 'UIView'

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

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

}
help wanted

所有16条评论

@effecttwins 😊

InstagramLoginWebView在上次更新中发生了很大变化,由于不兼容,不得不放弃对iOS 10.*支持。
不再建议使用loginDelegate ,尽管仍然可以使用。
要获得习惯的行为,您所要做的就是在loginWebView上设置以下属性:

  • didReachEndOfLoginFlow是一个 _closure_ ,就像过去的redirected
  • didSuccessfullyLogIn是一个 _closure_ 替换了 _delegate_ 的userLoggedSuccessfully()
  • completionHandler是一个 _closure_ 替换了 _delegate_ 的webViewFinishedToLoadUser(sessionChache:handler:)

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

因此,当我将扩展名 InstagramLoginWebViewDelegate 更改为 InstagramLoginWebViewProtocol 时,它说:“InstagramLoginWebViewProtocol”要求“LoginViewController”继承自“UIView”

代码:

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


}

永远不应该遵守InstagramLoginWebViewProtocol
我没有把它标记为internal我的错。 我道歉。

这是您需要的所有代码。 没有InstagramLoginWebViewProtocol 。 没有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感谢您的所有帮助。
但是Instagram登录页面没有加载屏幕上只有白页

这是您需要的所有代码。 没有InstagramLoginWebViewProtocol 。 没有InstagramLoginWebViewDelegate

@effecttwins复制并粘贴我上面写的代码。 不要忘记调用loadInstagramLogin()
它实际上已经为您实施了😊
有用

是的,我确实复制并粘贴了所有代码并调用了 loadInstagramLogin :)
还删除了 InstagramLoginWebViewProtocol 和 InstagramLoginWebViewDelegate

在控制台中,我收到此错误,我不确定它是否与此项目有关
无法向服务 com.apple.WebKit.Networking 发出信号:113:找不到指定的服务

抱歉,我从来没有在我的代码中将loginWebViewview中哈哈哈
我已经编辑过了。 再检查一下。 现在应该可以工作了@effecttwins

你很棒@sbertix
它现在正在工作
谢谢大家的帮助

@sbertix

我遵循 MVVM 模式并且我的视图和我的 viewController 在不同的文件中会发生什么? 视图不应向视图控制器发送数据。 有没有办法在 InstagramLoginWebView 初始化后访问didSuccessfullyLogIn函数?

你不需要init InstagramLoginWebViewdidSuccessfullyLogIn (它是可选的)。
即使使用其他 _closures_:一旦拥有它,您就可以简单地分配一个不同的值。
@anonrig

如果我可以问,你能提供一个例子吗? @sbertix :)

当然。 你能发送更多关于你的代码的信息吗? 例如,您的模型和视图的设置方式。

嗯,当然咯!

在 1.7.x 之前,我使用delegates在 ViewController 级别处理登录成功事件

示例视图:

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

示例视图控制器:

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

我不完全知道LoginWebViewModel是什么......但是如果目标是将所有内容都放入completeObservable您可以简单地执行以下操作:

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

我已将InstagramLoginWebView init(frame:)更改init(frame:completionHandler:) ,然后更新completionHandler以将值推送到您的主题。

谢谢@sbertix

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

trentona picture trentona  ·  3评论

sbertix picture sbertix  ·  8评论

anonrig picture anonrig  ·  3评论

biox86 picture biox86  ·  12评论

sbertix picture sbertix  ·  27评论