본문 바로가기
개발/swift

[iOS/Swift] 네이버 아이디로 로그인 하기

by 꼬마상어 2017. 5. 16.
반응형

Naver Developers [https://developers.naver.com] 참고하여 로그인 연동하기


1. 일단 iOS용 네이버 라이브러리를 다운받는다.

폴더를 하나 생성하여 다 넣어버린다.

나의 경우에는 아래처럼 넣어버렸다.




2. 그리고 Bridging-Header 를 만든다.

Naver SDK는 현재 오브젝티브 씨 기반으로 되어있는데,

내가 사용하는 언어는 Swift이기때문에.. 한 프로젝트 내에서 오브젝티브 씨와 Swift를 함께 사용하기 위해 만드는 파일이다.

이 파일은 오브젝티브씨로 된 파일을 스위프트로 변형(?)하여 스위프트 파일 내에서 사용할 수 있다.


브릿징 헤더 만드는 법은 다른 블로그에도 친절히 설명되어있으니 ! 참고하시길!

http://seorenn.blogspot.kr/2014/07/swift-objective-c.html



그리고 브릿징 헤더 내의 내용은 이렇다.

#ifndef HarlequinIOS_Bridge_Header_h

#define HarlequinIOS_Bridge_Header_h


#import "NaverThirdPartyConstantsForApp.h"

#import "NaverThirdPartyLoginConnection.h"

#import "NLoginThirdPartyOAuth20InAppBrowserViewController.h"


#endif



3. AppDelegate에서 설정

위까지 다 잘따라왔다면 Appdelegate에서 import를 해보자

import FacebookCore // 페이스북 연동관련 코어 라이브러리

import FacebookLogin // 페이스북 로그인 관련 라이브러리


cmd + b를 눌러 빌드를 하고 Success가 되었다면 이제 Swift 파일 내에서 오브젝티브씨로 된 파일을 사용할수있다! 

그것도 스위프트 문법으로!!


이제 AppDelegate내에서 설정을 해주자

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

/* 네이버 */

let naverConnection = NaverThirdPartyLoginConnection.getSharedInstance()

naverConnection?.isNaverAppOauthEnable = true

naverConnection?.isInAppOauthEnable = true

naverConnection?.setOnlyPortraitSupportInIphone(true)

naverConnection?.appName = Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String // 앱이름

naverConnection?.serviceUrlScheme =  // 콜백을 받을  url scheme

naverConnection?.consumerKey = // 애플리케이션에서 사용하는 클라이언트 아이디

naverConnection?.consumerSecret = // 애플리케이션에서 사용하는 클라이언트 시크릿

}


func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

guard let scheme = url.scheme else {

return false

}

if scheme == [url scheme] {


let result = NaverThirdPartyLoginConnection.getSharedInstance().receiveAccessToken(url)

if result == CANCELBYUSER {

// 여러 응답에 관한 처리를 해준다.


}


return true


return false

}


주석으로 처리해 둔 곳은 네이버에 앱을 등록할때 입력하는 값들이다! 


아! 앱을 등록할때 url Scheme을 받기 위해 앱스토어 주소를 입력해야되는데, 이때 출시가 안된 앱일 경우에는 

아이튠즈커넥트를 들어가서 앱 아이디를 받아 주소를 생성하면 된다.








https://itunes.apple.com/app/id + [AppleID] + ?mt=8

이렇게 주소를 알수있다!! 


4. info.plist 업데이트!

이런식으로 추가 해주어야 한다! 안하면 에러남 ㅜㅜ




*** 201717.5.17 추가 수정 !!***

네이버 앱을 설치 했을 경우 앱을 통해서 로그인을 하는데, 이때 로그인 성공 후 네이버 메인 홈으로만 이동되고 기존 앱으로 돌아오지 않았다..

application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 

appdelegate의 위의 함수도 호출되지 않았다.. 힝


한 6시간 삽질후에 알았는데..

info.plist의 url type을 설정해 주지 않았기 때문이다.. 


이런식으로 앱 등록할때 입력했던 url Scheme을 추가해 주어야 한다.. 나는 멍청이었다 히이이우ㅜ




5. 해당 버튼에 이벤트 넣어주기!


해당 뷰 컨트롤러에 import와 델리게이트 설정을 해준다.

import FacebookCore

import FacebookLogin


class LoginMainVC: UIViewController, NaverThirdPartyLoginConnectionDelegate {


이제부터는 쉽다.


@IBAction private func onBtnNaverLoginDidTouch(_ sender: UIButton) {

/* Naver SDK 사용합니다. */

let naverConnection = NaverThirdPartyLoginConnection.getSharedInstance()

naverConnection?.delegate = self

naverConnection?.requestThirdPartyLogin()

}

func oauth20ConnectionDidFinishRequestACTokenWithAuthCode() {

// 로그인이 성공했을 경우 호출

}

func oauth20Connection(_ oauthConnection: NaverThirdPartyLoginConnection!, didFailWithError error: Error!) {

/* 로그인 실패시에 호출되며 실패 이유와 메시지 확인 가능합니다. */

}

func oauth20ConnectionDidOpenInAppBrowser(forOAuth request: URLRequest!) {

// 네이버 앱이 설치되어있지 않은 경우에 인앱 브라우저로 열리는데 이때 호출되는 함수


let naverInappBrower = NLoginThirdPartyOAuth20InAppBrowserViewController(request: request)

naverInappBrower?.modalPresentationStyle = .overFullScreen

self.present(naverInappBrower!, animated: true, completion: nil)

}

func oauth20ConnectionDidFinishRequestACTokenWithRefreshToken() {

// 이미 로그인이 되어있는 경우 access 토큰을 업데이트 하는 경우

}


func oauth20ConnectionDidFinishDeleteToken() {

// 로그아웃이나 토큰이 삭제되는 경우

}




6. 네이버 회원 정보 조회를 원할 경우


private func naverSDKDidLoginSuccess() {

/* 네이버 회원 정보 조회 */

let naverConnection = NaverThirdPartyLoginConnection.getSharedInstance()

guard let token = naverConnection!.accessToken else {

return

}

var header = [String: String]()

header["Authorization"] = "Bearer \(token)"

// alamofire를 응용하여 만든 struct이다. 아마 비슷한 방법으로 넘기면 될것이다.


ApiRequest.request(

"https://openapi.naver.com/v1/nid/me",

method: .get,

headers: header,

successHandler: {

apiResponse in

guard let code = apiResponse.responseJSON?["resultcode"] as? String,

  code == "00" else {

return

}

guard let json = apiResponse.responseJSON?["response"] as? [String: String],

  let email = json["email"],

  let id = json["id"] else {

return

}

               // 네이버로 로그인 성공!

},

failureHandler: {

apiResponse in

print("\(#function) is Fail")

})

}



히이,, 까먹을까봐 올린당,,


반응형

댓글