라이징캠프 iOS 11기 5주차 개발일지(2)

Ryu_jin·2022년 11월 27일
0
post-thumbnail

5주차 서울시 동물병원 지도


Response 받을 데이터 모델

  • 포스트맨 활용해서 받아온 데이터 quicktype.io 로 빠르게 변환해서 사용하였음

🔥 API 키 숨기기

  • Storage.swift 파일에 각각 사용할 키들 등록 후 변수명으로 사용

  • github 에 푸쉬하기 전 .gitignore에 Storage.swift 작성하여 api 키를 숨겨주었다!

  • 이젠 메일로 매번 오던 your api key exposed 를 안볼지도...

    • vim .gitignore 작성

카카오 로그인 api

  • AppDelegate
import KakaoSDKCommon

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
		// api 키를 숨겨서 변수명으로 사용!
        KakaoSDK.initSDK(appKey: "\(Storage().kakao_appkey)")
        return true
    }
  • SceneDelegate
import KakaoSDKAuth

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        if let url = URLContexts.first?.url {
            if(AuthApi.isKakaoTalkLoginUrl(url)){
                _ = AuthController.handleOpenUrl(url: url)
            }
        }
    }
  • ViewController
import UIKit
import KakaoSDKAuth
import KakaoSDKUser
import KakaoSDKCommon

class LoginViewController : UIViewController {
    
    @IBOutlet weak var NickNameLabel: UILabel!
    @IBOutlet weak var EmailLabel: UILabel!
    
    @IBOutlet weak var KakaoLogin: UIButton!
    @IBOutlet weak var LogoutButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
  // 유저 정보 가져오기
    func setUserInfo() {
            UserApi.shared.me {(user, error) in
                if let error = error {
                    print(error)
                } else {
                    print("nickname: \(user?.kakaoAccount?.profile?.nickname ?? "닉네임 없음")")
                    print("email: \(user?.kakaoAccount?.email ?? "이메일 없음")")
                    
                    guard let userId = user?.id else {return}
                    
                    print("닉네임 : \(user?.kakaoAccount?.profile?.nickname ?? "닉네임 없음").....이메일 : \(user?.kakaoAccount?.email ?? "이메일 없음"). . . . .유저 ID : \(userId)")
                    self.NickNameLabel.text = "Nickname : \(user?.kakaoAccount?.profile?.nickname ?? "닉네임 없음")"
                    self.EmailLabel.text = "Email : \(user?.kakaoAccount?.email ?? "이메일 없음")"
                }
            }
        }
    
    func resetUserInfo() {
        self.NickNameLabel.text = "로그아웃에 성공했습니다"
        self.EmailLabel.text = ""
    }
    
    @IBAction func LoginAction(_ sender: Any) {
        if (UserApi.isKakaoTalkLoginAvailable()) {
            UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in
                if let error = error {
                    print(error)
                }
                else {
                    print("카카오톡 앱으로 로그인 성공")
                    self.setUserInfo()
                    //do something
                    _ = oauthToken
                }
            }
        } else {
            UserApi.shared.loginWithKakaoAccount {(oauthToken, error) in
                    if let error = error {
                        print(error)
                    }
                    else {
                        print("카카오게정으로 로그인 성공")
                        self.setUserInfo()
                        
                        guard let nextVc =
                        self.storyboard?.instantiateViewController(withIdentifier: "MainNavigationVC")
                        else {return}
                        nextVc.modalPresentationStyle = UIModalPresentationStyle.fullScreen
                        self.present(nextVc, animated: true)
                        
                        //do something
                        _ = oauthToken
                    }
                }
        }
    }
    
    @IBAction func LogoutAction(_ sender: Any) {
        UserApi.shared.logout{(error) in
            if let error = error {
                print(error)
            } else {
                self.resetUserInfo()
                print("kakao logout success")
            }
        }
    }

병원 API 가져오기

  • HospitalRequeset
    • alamofire 사용하여 통신 요청

  • ViewController 에서 api 요청
class ViewController: UIViewController {

  override func viewDidLoad() {
        super.viewDidLoad()
	   
       //API 요청
       HospitalRequest().getHospitalData(self)
       
       collectionViewDelegate()
        
       self.CollectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "cell")
    }
  • Request 성공 시 데이터 저장
    • 배열 형태로 데이터를 저장 후 사용해도 가능!
   func didSuccess(_ response: HospitalResponse) {
  
        HosNumber = response.localdata020301.row[2].sitewhladdr
        HosName = response.localdata020301.row[1].bplcnm
    }

  • 컬렉션 뷰 세팅
  • 컬렉션 뷰에 커스텀한 Xib 셀 파일을 넣어주자

피드백

  • 아직 데이터를 받아와서 저장하는 것에 미숙함 struct 좀 더 연습
  • 지도 API 적용하려고 했으나 지옥같은 m1 에러를 보았음... x86_64....
    • 해결 방안 찾아보니 네이버 지도로 하면 될 것같은 느낌?...
    • cmc 데모데이에서 질문을 해보니 다들 네이버 지도 사용

  • 잘한 점?...
    • 로그인 성공 시 메인화면으로 넘어갈 수 있게 해줌
    • 하지만 코드 전체 작성 말고 함수형태로 사용하기!
profile
Empire

0개의 댓글