Method Swizzling
Method Swizzling์ ๊ธฐ์กด์ ๋ฉ์๋๋ฅผ Runtime ์์ ์ํ๋ ๋ฉ์๋๋ก ๋ฐ๊พธ์ด ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก Swizzling๋ ๋ค์๋ค, ๋ค๋ฐ๊พธ๋ค์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
[์ถ์ฒ] : Swift ) Method Swizzling
์ฌ์ฉ ์ํฉ
๋ฐํ์ ์์ ๋ฉ์๋๋ฅผ ๋ฐ๊ฟ ์ผ์ด ํ์ํ ๊น์? ์ง์ ์ฌ์ฉํ ์ผ์ด ์๊ธฐ ๋๋ฌธ์ ๋น์ฅ ์๋ฟ์ง๋ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ฐ์.
- ์ฑ์ ์๋ช ์ฃผ๊ธฐ์ ์ฑ์ ๋ถ์ ๊ธฐ๋ฅ์ ํตํฉํ๊ธฐ ์ํจ
- ํน์ ํด๋์ค์ ๊ธฐ๋ฅ์ ํ ๋ฒ์ ์ ์ฉํ๊ธฐ ์ํจ
- ํน์ SDK๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ณ ์ ํ ๋, ํน์ ๋ฉ์๋์์ ํญ์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๊ณ ์ ํจ
โช๏ธ ๊ฐ๋ น, ์๋น์ค ํ๋ก์ ํธ ๋ด์ GA๋ฅผ ๋ถ์ฌ์ผ ํ๊ณ ํ๋ฉด๋ง๋ค GA ๊ด๋ จ API๋ฅผ ํธ์ถํ๋ค๊ณ ํ๋ฉด viewWillAppear ๋ฉ์๋ ์์ ํธ์ถ ์ฝ๋๋ฅผ ๋ฃ์ด์ค ์ ์์ ๊ฑฐ์์. ๋ง์ฝ ViewController๊ฐ ๋ง์ฝ ์๋ฐฑ ๊ฐ ์ด์์ด๋ผ๋ฉด ํ๋์ฉ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒ์ ์ ๋ง ๋นํจ์จ์ ์ธ ์์ ์ด ๋ฉ๋๋ค.
โช๏ธ ๋๋ ๋ก๊ทธ๋ฅผ ์ผ๊ด์ ์ผ๋ก ์ฐ๊ณ ์ถ์ ๋๋ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์์. ์ญ์๋ ViewController ์๊ฐ ๋ง๋ค๋ฉด ์ฌ์ฉํ์ ๋ ์ด์ ์ ์ป์ ์ ์์ ๊ฒ ๊ฐ์์. ์๋ธํด๋์ฑ(์์)์ผ๋ก๋ ํด๊ฒฐ์ ํ ์ ์๊ฒ ์ง๋ง, Method Swizzling์ด ์ข ๋ ๊ฐํธํ ๊ฒ ๊ฐ์์.
โช๏ธ ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ์ ๋ค์๋ ์ปจํผ๋ฐ์ค(๐ฑ์์น)์์ ๋ฃ๊ฒ๋ ๋ด์ฉ์ธ๋ฐ ์ด๋ฐ ์ํฉ์ ์ ๋ง ์ ์ฉํ ์ ์๊ฒ ๋ค๊ณ ๋๊ผ๋ ๋ด์ฉ์ ์๊ฐํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋์ ๊ฐ์ธ ํ๋ก์ ํธ๋ ์ฌ์ด๋ ํ๋ก์ ํธ์ฒ๋ผ ์ฒ์๋ถํฐ ๊ฐ๋ฐ์ ์งํํ๊ฑฐ๋ ๊ท๋ชจ๊ฐ ๊ทธ๋ฆฌ ํฌ์ง ์์ ์ํฉ์ด๋ผ๋ฉด ํ๋ฉด์ ๋์๋๋ ViewController์ ์ด๋ฆ์ ์ฐพ๋ ๊ฒ์ ์ด๋ ต์ง ์์ ์ ์์ด์. ๊ทธ๋ฌ๋ ํ์ฌ์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ViewController์ ์๊ฐ ๊ต์ฅํ ๋์ด๊ฐ๊ฒ ๋์ฃ . ๊ทธ๋ฆฌ๊ณ ์ด๋ค ViewController๊ฐ ์ด๋ค ํ๋ฉด์ ๋์๋๋ ๊ฑด์ง ์ฐพ๊ธฐ๊ฐ ๊ต์ฅํ ์ด๋ ค์์. print๋ฌธ์ ํ๋ฉด ์ง์ ํ ๋๋ง๋ค ์ฐ๋ ๊ฒ์ ์๊ฐ๋ณด๋ค ๋์ฐํ์ฃ . ์ด ๋ Method Swizzling์ ์ฌ์ฉํ๋ ๊ฒ๋ ํฌ๊ฒ ๋์์ด ๋ ์ ์์ ๊ฒ ๊ฐ์์. (+ LLDB์ ๊ฐ์ด ์ด์ฉ์ ํ๋ค๋ฉด ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.)
์ฌ์ฉ ๋ฐฉ๋ฒ
extension UIViewController {
// ๋ฉ์๋ ๊ต์ฒด
class func swizzleMethod() {
let origin = #selector(viewWillAppear)
let swizzle = #selector(swizzleViewWillAppear)
guard
let originMethod = class_getInstanceMethod(UIViewController.self, origin),
let swizzleMethod = class_getInstanceMethod(UIViewController.self, swizzle)
else { return }
}
// ๊ต์ฒดํ ๋ฉ์๋
@objc public func swizzleViewWillAppear(animated: Bool) {
print("๐ - swizzleViewWillAppear")
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ...
UIViewController.swizzleMethod()
// ...
return true
}
์ฃผ์ ์ฌํญ
- iOS ๋ฒ์ ์ ๋ฐ๋ผ์ ๋์์ด ๋์ง ์๊ฑฐ๋ ์๋ฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํฉ๋๋ค. (์์๋ก ๋ณ๊ฒฝ์ ์๋ํ๊ธฐ ๋๋ฌธ)
- ํ SDK์์๋ Method Swizzling์ ์ฌ์ฉํ๊ณ ์์ ์ ์๊ณ , ์ด๋ฌํ ๊ฒฝ์ฐ ๋ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ผ ํฉ๋๋ค.
Firebase Cloud Messaging์์๋ Method swizzling์ ์ฌ์ฉํ๊ณ ์์ด์. FCM Token ํธ๋ค๋ง์ ์ ์์ ์ผ๋ก ํ ์ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์, Method swizzling์ ์ฌ์ฉ์ ์ค์งํ์ง๋ง๋ผ๊ณ ์ด์ผ๊ธฐํ๊ณ ์๋ค์.