์๋ก ๋ฑ๋ก๋ ์ ๊ท ์ฌ์ฉ์๋ก ๋ก๊ทธ์ธ์ ์๋ํ์ญ์์ค. ์น ๋ก๊ทธ์ธ์ด ๋๋๋ก ๋ฌด์์๋ก ์๋ฃ๋์ง ์์ต๋๋ค. Instagram์ ๋ค๋ฅธ ์ฌ์ฉ์ ์ ์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. 1๋ช ์ ์ฌ์ฉ์๋ฅผ ํ๋ก์ฐํ๋ ค๊ณ ํ๊ณ 1๋ช ์ ์ฌ์ฉ์๊ฐ ๋๋ฅผ ํ๋ก์ฐํ์ต๋๋ค(ํผ๋๋ ํ์๋์ง๋ง ์๋ํ์ง ์์). ๋๋ถ๋ถ ์ด ์ฌ์ฉ์์ ๋ํ ์น ๋ก๊ทธ์ธ์ด ์๋ฃ๋์ง ์์์ต๋๋ค. ๋ก๊ทธ์ธ์ 2~3ํ ์๋ํ๋ฉด ์ ์ ์๋ํ ์ ์์ต๋๋ค.
์ ๊ท๊ฐ์
์ด๋ผ๊ณ ํ๋ฉด ์น๋ทฐ์์ ๊ฐ์
ํ ๋ ํ๋ ๊ฑด๊ฐ์, ์๋๋ฉด ๋ฐฉ๊ธ ์์ฑํ ๊ณ์ ์ผ๋ก ๋ค๋ฅธ ๊ณณ์์ ๋ก๊ทธ์ธ ํ์ ๋ ํ๋ ๊ฑด๊ฐ์? @canaksoy
๊ทธ๊ฒ์ ์๋ํ๊ณ ๋ณต์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๊ธฐ ์ํด ๐
์ด๋ ์ชฝ์ด๋ ์ฃผ์ด์ง URL ๋์ ์ฟ ํค๋ฅผ ์ง์ ํ์ธํ๋ฉด ์์ ๋ ์ ์์ต๋๋ค(์์ ์ธ๊ธํ ์ ์ ํ์ด์ง์ ๋๋ฌํ๊ธฐ ์ ์ ์ฟ ํค๊ฐ ๋ชจ๋ ์ค์ ๋์๋ค๊ณ ๊ฐ์ ). ์ต๋ํ ๋นจ๋ฆฌ ํ ๋ฆฌํ์คํธ๋ฅผ ๋ณด๋ด๊ฒ ์ต๋๋ค.
#76, @canaksoy๋ฅผ ํ์ธํ์ธ์ ๐ช
์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ, ์ค์ ๋ก instagram.com
ํ์ธํ์ง ์๊ณ ์ ํจํ ์ฟ ํค์ ๋ํด์๋ง ๋ชจ๋ init
ํ๋ก์ธ์ค๋ฅผ async
, ๋ค์ค ๊ณ์ ์ง์( 2.0
์์ ์ด๊ฒ์ ์ ์ ํ ์ฒ๋ฆฌํ ๊ณํ์
๋๋ค. UIViewController
๋๋ LoginManager
์น ๋ณด๊ธฐ๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ๋ฐํํฉ๋๋ค.
@TheM4hd1๋ ์ ์ค์ ๋ณํฉ ์น์ธ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค ๐
ํ๋ช
LoginWebView
๋ด๊ฐ ์ ๊ฑฐ ํด์, ๊ทธ๋์ ์ฌ์ ํ, ์ฌ์ง์ด (๋ด๊ฐ ๋ชจ๋ ๊ทธ๊ฒ์ ๋ ์์ ์ ์ํํ๊ณ ์์ ์ ์คํฌ๋ฆฐ ์ท์ ํ์ธํ์ต๋๋ค) ์ด์ @canaksoy์ ์ํด ๊ธฐ์ ๋ ๊ฒฝ์ฐ ์ผ bug
A์ ๋ํ ๋ผ๋ฒจ์ help wanted
ํ๋.
๊ทธ๋๋ PR์ ๋ฏธ๋์ ์ ์ฒด๋ฅผ ์ฆ๋ช
ํ๋ ๋ฐ ์ ์ตํ๋ฏ๋ก imho ๋ณํฉํด์ผ ํฉ๋๋ค.
๋์ค์ ์ฐธ์กฐํ ์ ์๋๋กโฆ ์๋ก์ด ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(@mkeshnoda)
class LoginViewController: UIViewController {
var webView: InstagramLoginWebView? {
didSet {
oldValue?.removeFromSuperview()
guard let webView = webView else { return }
// add to view hierarchy (NECESSARY).
view.addSubview(webView)
// always request log in page when setting a new web view.
webView.loadInstagramLogin()
}
}
override func viewDidLoad() {
super.viewDidLoad()
// create a new `InstagramLoginWebView`.
InstagramLoginWebView.create(with: view.bounds,
completionHandler: { _, _ in /* deal with login and failures */ },
returnHandler: { [weak self] in self?.webView = $0 })
}
}
๋์ค์ ์ฐธ์กฐํ ์ ์๋๋กโฆ ์๋ก์ด ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(@mkeshnoda)class LoginViewController: UIViewController { var webView: InstagramLoginWebView? { didSet { oldValue?.removeFromSuperview() guard let webView = webView else { return } // add to view hierarchy (NECESSARY). view.addSubview(webView) // always request log in page when setting a new web view. webView.loadInstagramLogin() } } override func viewDidLoad() { super.viewDidLoad() // create a new `InstagramLoginWebView`. InstagramLoginWebView.create(with: view.bounds, completionHandler: { _, _ in /* deal with login and failures */ }, returnHandler: { [weak self] in self?.webView = $0 }) } }
๋๊ฐ์ด ํ๋๋ฐ ๋ก๊ทธ์ธ ํ completionHandler ๊ฐ ์๋ํ์ง ์์ต๋๋ค ๐ญ
์ฝ๊ฐ์ ๋๋ฒ๊น
์ ์ํํ๊ณ filtered.count = 1
๋๋ฌธ์ ๋ก๊ทธ์ธํ ์ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. isUserLoggedIn(instagramCookies: [HTTPCookie]?)
์ฟ ํค 2๊ฐ๋ง ๋ฐ์ต๋๋ค.
let filtered = cookies.filter {
!$0.value.isEmpty
&& $0.properties?[.init(rawValue: "Created")] as? TimeInterval ?? 0 > startedAt.timeIntervalSinceReferenceDate
&& ($0.name == "ds_user_id" || $0.name == "csrftoken" || $0.name == "sessionid") }
guard filtered.count >= 3 else { return }
์๋ก์ด ๋ฌธ์ ๋ฅผ ์ด๊ณ ํ๋ฆ์ ์ค๋ช
ํ ์ ์์ต๋๊น? @mkeshnoda
๋ถํํ๋ ์ด 3๊ฐ์ ์ฟ ํค๊ฐ ๋งค์ฐ ํ์ํ๋ฏ๋ก ์์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฌธ์ ๊ทธ๋๋ก "๋ก๊ทธ์ธ๋์์ต๋๋ค"๋ผ๋ ์๋ฏธ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ์ ์๋ํ๋ค๋ฉด ์ง๊ธ์ฒ๋ผ ์๋ํด์ผ ํ๋ ์ด์ํ ์์ธ์
๋๋ค(์ด๋ฏธ 2๊ฐ ์ด์ ํ์ธ๋จ). 4๊ฐ์ ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ํ
์คํธํ๋๋ฐ ๋ชจ๋ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.