티스토리 뷰
기본적으로 Facebook, Kakao 로그인 시 앱이 설치되어 있는 경우 앱에 로그인되어 있는 정보를 이용해 로그인을 한다.
즉, 우리 앱에서 Facebook 혹은 Kakao 로 앱이 이동했다가 다시 우리 앱으로 돌아온다.
(이를 Facebook 에서는 FAS, Fast App Switching 이라 표현한다.)
예외가 있다면, iOS 9 부터 iOS 가 앱 간 이동을 지양한다는 정책을 발표함에 따라
Facebook 로그인 시 무조건 Safari WebView 가 노출된다.
참고 사이트 : https://developers.facebook.com/blog/post/2015/10/29/Facebook-Login-iOS9
1. Facebook
WebView 노출의 경우 (iOS 9 이상 or 앱 미설치)
WebView 를 가진 ViewController 가 우리 앱 위에 Present 된다.
이에 따라 Facebook 로그인 버튼을 누르면 내 ViewController 에서는 viewWillDisappear, viewDidDisappear 가 호출된다.
FAS 의 경우 (iOS 9 미만 and 앱 설치)
가장 처음이면 App을 이동하겠냐는 System Alert 가 뜨고 한번 이동한 이후에는 앱이 System Alert 없이 노출되는 것으로 보인다. (정확한 테스트는 못해봄)
System Alert 가 노출되거나 앱이 이동하면 "applicationWillResignActive:" 가 노출된다.
2. Kakaotalk
WebView 노출의 경우 (앱 미설치 시)
WebView 를 가진 View 가 우리 앱 위에 Present 된다.
이에 따라 Kakao 로그인 버튼을 누르면 내 ViewController 에서는 viewWillDisappear, viewDidDisappear 가 호출되지 않는다.
"applicationWillResignActive" 도 당연히 호출되지 않는다.
FAS 의 경우 (앱 설치)
Facebook 과 동일하다.
3. Facebook, Kakao 로그인 동작 시 사용자 Input을 막고 싶을 때는 어떻게 해야하는가?
1) Facebook WebView 의 경우
로그인 버튼이 눌렸을 때 Progress 를 돌리고 "viewWillDisappear" 와 같은 곳에서 Progress 를 멈춰주면 된다.
2) Facebook FAS, Kakao FAS 의 경우
로그인 버튼이 눌렸을 때 Progress 를 돌리고 "applicationWillResignActive" Notification(UIApplicationWillResignActiveNotification) 을
ViewController 에 Add 하여 detecting 이 가능하다.
3) Kakao WebView 의 경우
아무 이벤트도 들어오지 않는 경우이다. "viewWillDisappear" 도 "applicationWillResignActive" 도 호출되지 않는다.
애매하지만, 로그인 버튼이 눌렸을 때 View 에 존재하는 모든 버튼의 userInteractionEnabled 를 꺼주고
dispatch_after 혹은 NSTimer 를 이용하여 일정 시간 (0.5초 정도?) 이후 userInteractionEnabled 를 켜준다.
4. Kakao WebView 노출 시 화면
카카오 앱 미설치의 경우 WebView 를 포함한 View 가 ViewController 위에 노출되는데,
카카오 View 가 노출된 상태에서 왼쪽 모서리에서 오른쪽 모서리로 Slide 하면
아래에 있는 ViewController 에서 Sliding Pop Event (interactivePopGestureRecognizer) 가 된다.
이게 싫다면 카카오 로그인 버튼이 눌렸을 때 앱 설치 여부를 확인하여
viewController.navigationController.interactivePopGestureRecognizer.enable = NO 로 만들어 준 후
로그인 결과 값이 오는 CallBack Block 에서 YES 로 만들어주면 된다.
앱 설치 여부를 확인할 수 있는 (정확한 API 는 아닌걸로 보인다.) 카카오 API 는
[KOAppCall canOpenKakaoTalkAppLink] 이다.
참고) https://devtalk.kakao.com/t/api/2135
위 메소드를 호출할 때는 plist 의 LSApplicationQueriesSchemes 에 "kakaolink" 가 반드시 들어가 있어야한다.
'iOS 개발 > iOS' 카테고리의 다른 글
[iOS] Objective C 의 Block 에 관하여 (0) | 2016.09.19 |
---|---|
[iOS Widget] TodayExtension Update 시 Freeze 되는 현상 (0) | 2016.09.10 |
[iOS] preferredMaxLayoutWidth, Intrinsic content size, Content hugging priority, content Compression resistance priority (0) | 2016.08.22 |
[UIView] UIViewContentMode 의 이해 (0) | 2016.08.20 |
[UIView] layout 변경, setNeedsLayout, layoutIfNeeded, drawRect, sizeToFit, sizeThatFits (0) | 2016.08.20 |
- Total
- Today
- Yesterday
- Swfit
- Swift 3.0
- NSManagedObjectModel
- 읽기 좋은 코드가 좋은 코드다
- workerThread
- dictionary
- EffectiveObjectiveC
- coredata
- Swift 3
- HTTP
- CGImage
- Arc
- Block
- set
- UIView
- NSManagedObject
- string
- NSManagedObjectContext
- 꺼내먹어요
- delegate
- thread
- CIImage
- optional
- Swift3
- Swift
- RunLoop
- AWS
- ios
- docker
- applicationWillResignActive
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |