Swiftyinsta: WebLogin لا يعمل

تم إنشاؤها على ٢٢ يوليو ٢٠١٩  ·  16تعليقات  ·  مصدر: TheM4hd1/SwiftyInsta

بعد التحديث ، لم يتم تجميع مدونة الويب pod في إصدار 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 عبارة عن _ إغلاق_ تسمى مثل redirected تستخدم ل.
  • didSuccessfullyLogIn هو _ إغلاق_ يحل محل _delegate_'s userLoggedSuccessfully() .
  • completionHandler هو _ إغلاق_ يحل محل _المندوب_ 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 ويكون العرض الخاص بي ومراقب العرض الخاص بي في ملفات مختلفة؟ يجب ألا يرسل العرض البيانات إلى "عرض المراقب". هل هناك طريقة للوصول إلى الوظيفة didSuccessfullyLogIn بعد تهيئة InstagramLoginWebView؟

لست بحاجة إلى init InstagramLoginWebView مع didSuccessfullyLogIn (إنه اختياري).
وحتى مع _closures_ الأخرى: يمكنك ببساطة تعيين قيمة مختلفة بمجرد الحصول عليها.
تضمين التغريدة

هل يمكنك تقديم مثال على ذلك ، إذا جاز لي أن أسأل؟ تضمين التغريدة

بالتأكيد. هل يمكنك إرسال المزيد من المعلومات حول الرمز الخاص بك؟ طريقة إعداد النموذج والعرض ، على سبيل المثال.

نعم بالطبع!

قبل 1.7.x ، كنت أتعامل مع حدث نجاح تسجيل الدخول على مستوى ViewController باستخدام delegates

عرض المثال:

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 التقييمات

القضايا ذات الصلة

sbertix picture sbertix  ·  27تعليقات

biox86 picture biox86  ·  12تعليقات

canaksoy picture canaksoy  ·  6تعليقات

sbertix picture sbertix  ·  3تعليقات

anonrig picture anonrig  ·  3تعليقات