بعد التحديث ، لم يتم تجميع مدونة الويب pod في إصدار 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
عبارة عن _ إغلاق_ تسمى مثل 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