Swiftyinsta: WebLoginが機能しない

作成日 2019年07月22日  ·  16コメント  ·  ソース: TheM4hd1/SwiftyInsta

更新後、iOS10バージョンでコンパイルされていないポッドweblogin。
iOSの11.0バージョンに変更すると、次のように表示されます。

  • '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は、以前のredirectedように呼ばれる_closure_です。
  • didSuccessfullyLogInは、_delegate_のuserLoggedSuccessfully()置き換える_closure_です。
  • completionHandlerは、_delegate_のwebViewFinishedToLoadUser(sessionChache:handler:)置き換える_closure_です。

これは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:指定されたサービスが見つかりませんでした

申し訳ありませんが、コードのviewloginWebViewを追加したことはありません。
編集しました。 もう一度確認してください。 @effecttwinsで動作するはず

あなたは素晴らしい@sbertixです
現在動作中です
助けてくれてありがとう

ねえ@sbertix

MVVMパターンに従っていて、ビューとviewControllerが異なるファイルにある場合はどうなりますか? ビューは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")
    }
}

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

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 評価

関連する問題

anonrig picture anonrig  ·  3コメント

sbertix picture sbertix  ·  3コメント

trentona picture trentona  ·  3コメント

reefer picture reefer  ·  18コメント

sbertix picture sbertix  ·  8コメント