Open JooYoung1121 opened 1 year ago
이러한 상태변화를 AppDelegate에서 감지 가능하며, 각 상황별로 대응이 필요하다면 다음 함수들을 사용해서 구현하면 된다.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
BootLoader.runBootLoaderModules(application: application, launchOptions: launchOptions)
/// 앱이 처음 시작될 떄 실행
return true
}
func applicationWillResignActive(_ application: UIApplication) {
/// 앱이 active에서 inactive로 이동될 떄 실행
}
func applicationDidEnterBackground(_ application: UIApplication) {
/// 앱이 background 상태일 떄 실행
}
func applicationWillEnterForeground(_ application: UIApplication) {
/// 앱이 back -> fore로 이동될 떄 실행(아직 active는 아님)
}
func applicationDidBecomeActive(_ application: UIApplication) {
/// 앱이 active상태 되어 실행중일 때
}
func applicationWillTerminate(_ application: UIApplication) {
/// 앱이 종료될 때 실행
}
해당 함수들이 실제 서비스에서 (제가 관리하는 앱)에선 어떻게 동작하는지 코드로 보여드리겠습니다.
import SwiftUI
@main struct TestApp: App { @Environment(.scenePhase) var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}.onChange(of: scenePhase) { newScenePhase in
switch newScenePhase {
case .active:
print("App is active")
case .inactive:
print("App is inactive")
case .background:
print("App is in background")
@unknown default:
print("Oh - interesting: I received an unexpected new value.")
}
}
}
}
레퍼런스 : [iOS) App · ViewController의 생명주기](https://co-dong.tistory.com/62)
[iOS 앱의 생명주기(LifeCycle) AppDelegate : 네이버 블로그](https://blog.naver.com/PostView.naver?blogId=soojin_2604&logNo=222423840595&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView)
[iOS14SwfitUI SwiftUI2 App life cycle 정리](https://huniroom.tistory.com/entry/iOS14SwfitUI-SwiftUI-life-cycle-%EC%97%90%EC%84%9C-%EB%94%A5%EB%A7%81%ED%81%AC-%EC%B2%98%EB%A6%AC)
레퍼 : iOS 앱 시닝(app thinning) https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f
딥링크란 웹 관점에서 바라본다면 어떤 웹에서 하이퍼링크를 터치에 다른 웹사이트로 이동되는 단순한 기능이라고 생각하면 됩니다. ex) https://naver.com → 네이버로 이동 https://github.com → 깃헙으로 이동 모바일에서도 이런 딥링크를 사용이 가능합니다. 즉, 모바일 유저가 웹사이트 혹은 다른 앱에서 관련된 URL을 클릭할 경우 해당 앱으로 전환되도록 해주는 것입니다. 이러한 딥링크엔 총 3가지 방식이 있습니다. 1 URL 스킴 방식 : 앱에 URL 스킴(scheme) 값을 등록하여 딥링크 사용 2 앱링크(App Link) : Android 제공 - 도메인 주소를 이용한 딥링크 사용 3 유니버셜 링크 (Universal Link) : iOS 제공 - 도메인 주소를 이용한 딥링크 사용 iOS에선 1,3번만 알면 됩니다.
하지만 중복이 가능하기 때문에 market이란 스킴을 사용하는곳이 여러곳이라면 해당되는 모든 스킴을 가진앱이 다 실행되기 때문에 거기서 선택해야한다는 불편함도 있고 고유하지도 않다는 단점이 있고 그걸 극복하기 위해 유니버셜링크가 생겼습니다.
스킴값은 고유하지 않을 수 있지만 해당 웹사이트 또는 해당 서비스가 동작하는 사이트는 고유한 주소값으 ㄹ가지고 있습니다. 그것을 도메인주소라고 하는데요. 애플과 구글에선 이 고유한 도메인 주소를 사용하기로 합의를 했고 그래서 탄생한것이 앱링크과 유니버셜링크입니다.
앱 번들에 해당하는 고유한 도메인주소를 등록시키고 해당 도메인주소로 이동할 경우 앱이 실행되도록 하는 것입니다.
등록은 다음과 같이 할 수 있습니다.
앱이 설치되있다면 해당 앱을 실행 후 해당하는 경로로 이동시키며, 앱이 설치되있지 않을 경우 해당 도메인의 웹페이지로 이동한 뒤 그 웹페이지에서 동작하라는대로 하면 됩니다. (보통은 앱스토어로 이동시켜줌)
하지만 단점으로는 해당 웹페이지에 대해서 관리를 해줘야하며 그 웹페이지가 동작할 서버(ssl)등이 필요합니다. 또한, 구글/애플 각자 자체적으로 개발한 웹 어플에 대해서만 호환이 잘 되며 다른곳에선 잘 동작 안할 수 있기에 서버나 웹쪽에서 핸들링을 해줘야합니다.
두 방식 다 웹사이트 또는 다른 앱에서 해당앱으로 이동시켜주는 기능이라 생각하면 되지만 현재로썬 유니버셜링크를 사용하는게 가장 무난합니다.
스킴같은경우는 웹뷰를 사용하는 앱에선 자주 사용합니다. → 예를 들어서 해당 웹뷰내에서 스킴을 발생시키면 앱에서 그것을 감지해서 동작하도록 구현하는 것입니다. 레퍼 : https://help.dfinery.io/hc/ko/articles/360039757433-딥링크-Deeplink-URI스킴-유니버셜-링크-앱링크-구분과-이해 https://baechukim.tistory.com/93 https://yongminlee26.tistory.com/m/304
/// 기기에 따라서 View높이 변경
private func initializeHeight() {
contentViewHeight?.constant = UIScreen.main.bounds.height - (해당 기기에 bottomSafeArea) - (visibleConstraint?.constant ?? 0) // 세부적인 구현은 무시하고 앞에 UIScreen.main.bounds.height만 봐주시면 됩니다.
}
레퍼 : iOS UIScreen, UIWindowScene, UIWindow, UIView Windows and screens | Apple Developer Documentation