@TheM4hd1 π μ΄ νλ₯ν λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§λ€μ΄ μ£Όμ
μ κ°μ¬ν©λλ€(κ·Έλ¦¬κ³ Siwa
, λ μΈμμ μ
λλ€). μ§κΈκΉμ§ λλΌμ΄ μΌμ ν΄λμ΅λλ€. κ·Έλ¦¬κ³ ν¨κ» νκ·Ένκ³ λμμ μ£Όμ
μ κ°μ¬ν©λλ€.
2.0
λ€κ°μ΄μ λ°λΌ κ³νλ μ΄μ νλ ꡬννλ €λ νΉμ κΈ°λ₯μ΄ μλ€λ©΄ νλ₯ν κ³νμ΄ λ¬΄μμΈμ§ κΆκΈνμ΅λλ€. μ μ λμ μ΄κ²μ μ¬μ©ν νμ λ ν° μ
λ°μ΄νΈμμ λ§λ€ μ μλ λͺ κ°μ§ μ μμ΄ μμ΅λλ€.
1) μ½λ λ΄ λ¬Έμ
μ±κΈ ν€ λͺ¨λΈκ³Ό λͺ¨λ λ¨μ΄μ§λ 2) μ½κ² νκ° μ²λ¦¬κΈ°, .shared
, μ¬μ©μκ° λμμ μ¬λ¬ κ°μ κ³μ μ μ€νν μ μλλ‘ [λλμ΄ μ€λ λλ λ΄μΌ μμ
μ μμν μμλ κ·Έκ²μ νμΈμ κ²½μ°] βλ₯Ό
3) λ μ¬μ΄ λ‘κ·ΈμΈ, μ‘μΈμ리λ₯Ό λ§λ€κ³ private
λλ internal
λ€μ μΌλΆ μμ©κ΅¬ μ½λλ₯Ό μ¨κ²¨ νλ‘μΈμ€λ₯Ό κ°μνν©λλ€. β
4) λ§μ€ν°μκ² νΈμνκΈ° μ μ λͺ¨λ κ²μ λ μ ν
μ€νΈνκΈ° μν΄ μΉμΈλ _pull μμ²_μ νΈμν μ μλ development
λΆκΈ°( 2.0
λ νμ€ν ν° μΌμ
λλ€ π) β
5) κ³ μ , μ΄λ¦ μ§μ κ·μΉ userId
, pk
, userPk
... κ·Έλ¦¬κ³ (λ΄κ° κ°μ§μ΄ μ
ν μκ³ λ§€κ° λ³μμ μ΄λ¦μ κ· μΌνκ² completionHandler
λ completion
, νμ§λ§ UserReference
μ²λΌ λκ»΄μ§λλ€. νννν), ν¨μλ₯Ό λ "λΉ λ₯΄κ²" λ§λλ κ²(μ΄λ¦ μ§μ λ 맀κ°λ³μ λ± μ¬μ©) β
6) ~Swift 5.1, λꡬ? π€ some Protocol
ν¨ν΄μ λλΆλΆμ λ‘κ·ΈμΈ "λ¬Έμ "λ₯Ό ν΄κ²°νλ λ° μ’μ κ² κ°μ΅λλ€~
νμ§λ§ λͺ κ°μ§ μμ΄λμ΄. μ΄λ€ μ°μ μμκ° μκ³ μ΄λ»κ² λμΈ μ μλμ§ μλ €μ£Όμμμ€.
νν βοΈ
μλ
νμΈμ μ€ν
νλ
Έ
μ λ₯Ό λμμ£Όμκ³ μ΄ λΌμ΄λΈλ¬λ¦¬μ κΈ°μ¬ν΄μ£Όμ
μ κ°μ¬ν©λλ€. μ¬λ¬λΆμ μ°Έμ¬κ° μ λ₯Ό ν볡νκ² νλ κ² μ΄μμ μμ΅λλ€.
μ’μ κΈ°λ₯κ³Ό λ³κ²½ μ¬νμ΄ μλ λ²μ 2.0 μΌλ‘ μ΄λνλ κ²μ μ’μ μκ°μ
λλ€.
λλ μ¬μ©μκ° λΌμ΄λΈλ¬λ¦¬λ₯Ό λ μ½κ² λ€λ£° μ μλλ‘ λμμ£Όλ λͺ κ°μ§ μΆκ° κΈ°λ₯μ ꡬννλ κ²μ λν΄ μκ°νκ³ μμμ΅λλ€.
μμ κ³Ό κ°μ κΈ°λ₯:
UserReference
μμ΄λμ΄κ° μ’μμ΅λλ€.development
λΆκΈ°λ νμν©λλ€.
- μ±κΈ ν€ λͺ¨λΈμ λ¨μ΄ λ¨λ¦¬κ³ μ½κ² νκ° μ²λ¦¬κΈ°, λͺ¨λ
.shared
, λμμ μ¬λ¬ κ³μ μ μ€ννλ μ¬μ©μλ₯Ό νμ©νλ [λλμ΄ μ€λ λλ λ΄μΌ μμ μ μμν μμλ κ²½μ°μ νμΈ]
μ΄ μμ
μ μμνμ΅λλ€. μ€μ μΈμ¦ λ©μ»€λμ¦μ΄ μ€λΉλμ΄ μμ΅λλ€. λ€λ₯Έ λͺ¨λ νΈλ€λ¬(π±)μ λν΄ λͺ¨λ λ¨μΌ λ©μλλ₯Ό λ€μ μμ±νκΈ°λ§ νλ©΄ λ©λλ€. κ·Έλ° λ€μ Siwa
λμΌν λ³κ²½μ μ μ©νκΈ°
λ΄κ° μ§κΈκΉμ§ ν μΌ:
APIBuilder
, HttpSettings
λ° RequestMessageModel
κ° μ¬λΌμ‘μ΅λλ€. μ΄μ Settings
(μ ν μ¬ν) delay
, queues
, device
(μλμΌλ‘ User-Agent
μ
λ°μ΄νΈ)λ₯Ό μ¬μ©νμ¬ APIHandler
λ₯Ό μ§μ μΈμ€ν΄μ€νν©λλ€ delay
User-Agent
) λ° session
( URLSession
) 맀κ°λ³μ.*Handler
νλ‘ν μ½μ΄ μμ΅λλ€. κ·Έλ€μκ²λ μ€μ§μ μΈ μλ―Έκ° μμμ΅λλ€. λͺ¨λ *Handler
λ μ΄μ APIHandler
μΈμ€ν΄μ€λ₯Ό ν΅ν΄ νΈμΆν μ μμ΅λλ€( UserHandler
is .accounts
, FeedHandler
is .feeds
λ±). .), κ·Έκ²λ€μ κ²μΌλ₯Έ μμ±μ΄λ©° μΈμ€ν΄μ€ μ체μ κ³ μ ν©λλ€. HttpHelper
λ° PaginationHelper
( PaginationHandler
μμ 1.*
PaginationHandler
λΌκ³ λ ν¨)μ λν΄ λμΌν μμ
μ μννμ΅λλ€. μ΄λ κ² νλ©΄ APIHandler
λν΄ λͺ¨λ λ¨μΌ λ©μλλ₯Ό λ€μ μμ±ν΄μΌ νλ μ½λ μ€λ³΅μ΄ λͺ¨λ μ κ±°λλ©°, μ΄λ λ‘κ·ΈμΈν μ¬μ©μλ§λ€ APIHandler
μ¬λ¬ κ°λ₯Ό μ¬μ©νλ " λ©ν°νμ€νΉ "μ μλ―Έν©λλ€.APIHandler
μΈμ€ν΄μ€μμ νλμ λ¨μΌ λ°©λ²μΌλ‘ μ²λ¦¬λ©λλ€. authenticate(with request: Login.Request, completionHandler: escaping (Result<(Login.Response, APIHandler), Error>) -> Void)
, μ¬κΈ°μ Login.Request
λ SessionCache
λ μ€ νλλ₯Ό μ·¨ν μ μλ enum
μ
λλ€ SessionCache
νλͺ©( 1.*
SessionCache
κ³Ό μ μ¬)μ΄λ©° "λ€μ λ‘κ·ΈμΈ"νλ λ° μ¬μ©λλ©° Siwa
(ν₯ν) λλ LoginWebView
(aka InstagramLoginWebView
) β κ·Έλ¦¬κ³ μ§κΈλ³΄λ€ ν¨μ¬ κ°λ¨ ν©λλ€. λ§ κ·Έλλ‘ μ ν ν ν΅μ΄λ©΄ λμ
λλ€. λͺ¨λ μ½λ μ€λ³΅ κ°μ μ κ±°ν©λλ€ Siwa
λ° SwiftyInsta
: λΉμ μ΄ "머리κ°μλ"μΈμ¦μ μνλ κ²½μ°, μ¬μ© Siwa
νκ³ ν΅κ³Ό sessionCache
λ¬λ¦¬ _Webλ₯Ό μ¬μ©, 보기_ SwiftyInsta
.pk
λλ username
μλ½νλ λͺ¨λ λ¨μΌ λ©μλλ μ΄μ λμ UserReference
νλͺ©μ μ¬μ©ν©λλ€.λ΄μΌκΉμ§ λͺ¨λ κ²μ λλ΄κ³ μΆκ° ν
μ€νΈλ₯Ό μν΄ development
λ‘ νΈμν μ μμ΅λλ€. μ§μ§ μμ μ λ¬μ΄μ πͺ
μ¬λ¬λΆμ μκ°κ³Ό μ견μ κΈ°λ€λ¦¬κ² μ΅λλ€.
λ³κ²½ μ¬νμ΄ λ§€μ° μ’μ κ² κ°μ΅λλ€. development
λΆκΈ°λ μΆκ°λμμ΅λλ€.
μ λ Logger
λ±κ³Ό κ°μ κΈ°λ₯ λ° λꡬ λͺ©λ‘μ μμ± μ€μ
λλ€.
κ·Έλ¦¬κ³ μΈμ¦μ λν΄ μ΄ μλ‘μ΄ λ°©λ²μ 3κ°μ§ μ’
λ₯μ μΈμ¦μ λͺ¨λ μ§μν©λκΉ?
μμ λͺ¨λ λ³κ²½ μ¬νμ μλ£νμ΅λλ€. μ μ ν μ€νΈν λ€μ _pull request_λ₯Ό νΈμν©λλ€.
κ·Έλ¦¬κ³ μΈμ¦μ λν΄ μ΄ μλ‘μ΄ λ°©λ²μ 3κ°μ§ μ’ λ₯μ μΈμ¦μ λͺ¨λ μ§μν©λκΉ?
μ§κΈμ _Webμ login_μ μ§μνκ³ Siwa
(μ΄λ‘ μ μΌλ‘λΆν° Siwa
μ¬μ© *.shared
, κ·Έκ²μ μ
λ°μ΄νΈν΄μΌν©λλ€ κ·Έλμ,νμ§λ§ λ 빨리 κ·Έ μΌμ κ³νμ΄μΌ - μλ―Έ κΆλ¦¬λ₯Ό μ§κΈ , κ·Έλμ _web login_μ ν΅ν΄μλ§ ν
μ€νΈν μ μμ΅λλ€. SwiftyInsta
μ ν¨κ» μ 곡λλ username
+ password
μΈμ¦μ΄ tbhμ λ―ΈμΉμ§ λͺ»ν κ² κ°μ΅λλ€. κ·Έλ¦¬κ³ Siwa
μμ λλΌμ΄ μΌμ νκΈ° λλ¬Έμ λ©μΈ λΌμ΄λΈλ¬λ¦¬μμ μμ ν μ μμ κ² κ°μ λλμ΄ λλλ€(νμ§λ§ μ μκ°μΌ λΏμ
λλ€).
username
+ password
μΈμ¦μ μννλ €λ μ¬μ©μλ λ€λ₯Έ λͺ¨λ κ²μ μ§λμΉκ² 볡μ‘νκ² νκ±°λ μ½λ κΈ°λ°μ 볡μ νμ§ μκ³ μ²μλΆν°(μ¦, Siwa
) λ°λ‘ μνν΄μΌ νλ€κ³ κ°λ ₯ν λ―Ώμ΅λλ€. λ€μ λ§νμ§λ§, κ·Έλ₯ λ΄ μ견μ
λλ€.
λ€μ μΆκ°ν μλ μμ΅λλ€ π
(μ€νλ₯Ό λ°κ²¬νμ λ μ€νμ μ€μλ₯Ό μμ νλ €κ³ μλνμ§λ§ μΌλΆ λ°©λ²(μ: μ΄μν POST
)μ΄ μ¬μ ν μλν λλ‘ μλνμ§ μμ μ μμ΅λλ€. 1.*
μμλ λμ§ μμμ΅λλ€. 2.0
μμ μλ μμ΅λλ€. Idk)
@sbertix @canaksoy
λ λ§μ μμ΄λμ΄? λͺ¨λ μ
λ°μ΄νΈ?
watchOS
, tvOS
λ° macOS
λ©ν° OS μ§μ #61μ λν΄ μκ°νκ³ μμμ΅λλ€.
λμ€μ μλνκ³ μμ
νκ² μ΅λλ€.
- κ³ νμ§ λ―Έλμ΄ [λΉλμ€ λλ μ΄λ―Έμ§]
- μ νμ§ λ―Έλμ΄ [λΉλμ€ λλ μ΄λ―Έμ§]
- λ―Έλμ΄μ© μ΄λ―Έμ§ μΆμν
- ν΅κ³ κΈ°λ₯(μ΄ μ’μμ, λκΈ κ³μ° λ±)
- λ μ¬μ΄ λ°©λ²μΌλ‘ λ μ μ°ν μ§μ° κΈ°λ₯(λ°νμμμ νΈμ§νκ±°λ μΌκΈ°-λκΈ°).
- λ±λ±....
μ΄μ λν΄... μ¬μ©μμκ² μλ΅μ΄ νμλλ λ°©μμ ν©λ¦¬ννμ§ μλ μ΄μ λ 무μμ
λκΉ?
λμ½λ©λ νμΌ( raw
μμ±μ²λΌ λ μ μμ)μ μ§μ λ°ννλ λμ λ μ§κ° μ΄λ―Έ νμνλ κΉ¨λν struct
, λ€λ₯Έ νμ§μ μ΄λ―Έμ§(λΉμ μ΄ λ§νλ―μ΄), ν΅κ³λ₯Ό λ°ννμ§ μλ μ΄μ λ 무μμ
λκΉ? κ·Έλ€μ λ΄μ₯β¦ λ±.
μλ₯Ό λ€μ΄ MediaModel
κ·Έλλ‘ νΈμνλ λμ ...μ λ κ°κΉμ΄ κ²μ λ°νν©λλ€.
public struct MediaModel: Codable {
/// `MediaModelJSON` would be equal to current `MediaModel`.
public let rawResponse: MediaModelJSON
// Accesories
public var pk: Int! { return rawResponse.pk }
public lazy var date: Date! = { return self.rawRespone.takenAt.flatMap { Date(timeIntervalSince1970: $0) }}()
/* etc */
}
λ€, μ’μ μκ°μ
λλ€. μ΄μ¨λ λͺ¨λΈμ νΈμ§ν΄μΌ ν©λλ€. κ·Έλ€ μ€ μΌλΆλ λͺ κ°μ§ μμ±μ΄ λλ½λμκ³ λͺ¨λΈ μ¬μ΄μ λ§μ μ€λ³΅μ΄ μΈλͺ¨μλ νλ‘ν μ½κ³Ό ....
μ°λ¦¬λ νμ€ν λͺ¨λΈκ³Ό λͺ¨λΈμ΄ μ¬μ©μμκ² λ°μ΄ν°λ₯Ό λνλ΄λ λ°©μμ κ°μ ν΄μΌ ν©λλ€.
swiftlint
ν΅ν΄ ꡬ문 κ·μΉμ μ μ©νλ κ²μ μ΄λ»μ΅λκΉ?
Travis CI
λν μ§μμ μ½κ² μΆκ°ν μ μμ§λ§ μ€μ λ‘ μ 체 μ½λλ² μ΄μ€λ₯Ό μ μ νκ² λ³κ²½νλ λ°λ λ§€μ° μ€λ 걸립λλ€.
νμ§λ§ κ·Έλ§ν κ°μΉκ° μμ΄μΌ ν©λλ€.
μ΄λ»κ² μκ°ν΄? @TheM4hd1