更新后 pod weblogin 未在 ios 10 版本中编译。
当我更改为 11.0 版本的 ios 时,它说:
InstagramLoginWebView
属性。InstagramLoginWebViewProtocol
闭包属性。当我将 InstagramLoginWebViewDelegate 更改为 InstagramLoginWebViewProtocol 时:
我的代码:
类 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()
}
}
嘿@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:找不到指定的服务
抱歉,我从来没有在我的代码中将loginWebView
到view
中哈哈哈
我已经编辑过了。 再检查一下。 现在应该可以工作了@effecttwins
你很棒@sbertix
它现在正在工作
谢谢大家的帮助
嘿@sbertix
我遵循 MVVM 模式并且我的视图和我的 viewController 在不同的文件中会发生什么? 视图不应向视图控制器发送数据。 有没有办法在 InstagramLoginWebView 初始化后访问didSuccessfullyLogIn
函数?
你不需要init
InstagramLoginWebView
和didSuccessfullyLogIn
(它是可选的)。
即使使用其他 _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