๐Ÿšจ 1. ๋ฌธ์ œ ์ƒํ™ฉ ๋ฐ ํ˜„์ƒ

  • React Native 0.77๋ถ€ํ„ฐ AppDelegate.mm โ†’ AppDelegate.swift๋กœ ๋ณ€๊ฒฝ
  • ๐Ÿ“š ๊ธฐ์กด Kakao Login ๊ฐ€์ด๋“œ๋Š” ๋ชจ๋‘ Objective-C ๊ธฐ๋ฐ˜
  • ์•„๋ž˜ ์ฝ”๋“œ์—์„œ loginResult์—์„œ ์‘๋‹ต์ด ์ „ํ˜€ ์˜ค์ง€ ์•Š๋Š” ํ˜„์ƒ ๋ฐœ์ƒ
import { login as kakaoLogin } from '@react-native-seoul/kakao-login';

export const signInWithKakao = async () => {
  try {
    const loginResult = await kakaoLogin();
    // --->>> ์•„๋ฌด๋Ÿฐ ์‘๋‹ต๋„ ์—†๊ณ  console.log ๋„ ์ฐํžˆ์ง€ ์•Š๋Š”๋‹ค.
    ...
  } catch (error) {
    console.error('๋กœ๊ทธ์ธ ๋˜๋Š” ํ”„๋กœํ•„ ์กฐํšŒ ์‹คํŒจ:', error);
    throw error;
  }
};

๐Ÿ“‹ 2. ํ™˜๊ฒฝ ์ •๋ณด

  • ๐ŸŽฏ React Native: 0.77.1
  • ๐Ÿ“ฆ react-native-kakao-login ๋ฒ„์ „: "@react-native-seoul/kakao-login": "^5.4.1",

๐Ÿ› ๏ธ 3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

3.1 ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฌธ์„œ ๋Œ€๋กœ ์„ค์ •

  • ์šฐ์„  ์นด์นด์˜ค ๋ฌธ์„œ ๊ธฐ์ค€์œผ๋กœ info.plist ์„ค์ • ๊นŒ์ง€๋Š” ๋™์ผํ•˜๋‹ค. ๋‚ด๊ฐ€ ํž˜๋“ค์—ˆ๋˜ ๋ถ€๋ถ„์€ Swift Bridging Header ์ƒ์„ฑํ•˜๋Š” 4๋ฒˆ ํ•ญ๋ชฉ ๋ถ€ํ„ฐ์˜€๋‹ค.

3.2 Swift Bridging Header ์ƒ์„ฑ

  • ์šฐ์„  ๊ณต์‹ ๋งํฌ ๋ฌธ์„œ ๋Œ€๋กœ Swift Bridging Header ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋‹ค๋งŒ ๋‚ด๋ถ€ ๋‚ด์šฉ์ด ๋‹ค๋ฅด๋‹ค.
  • RNKakaoLogins.h๋งŒ ๋‹จ๋…์œผ๋กœ importํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋Š” ์˜์กด์„ฑ ์ˆœ์„œ ๋•Œ๋ฌธ์ด๋‹ค.
// YourAppName-Bridging-Header.h
// โŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
#ifndef YourAppName_Bridging_Header_h
#define YourAppName_Bridging_Header_h

#import "RNKakaoLogins.h"

#endif /* YourAppName_Bridging_Header_h */
  • RNKakaoLogins.h ๋‚ด๋ถ€์—์„œ RCTBridgeModule, NSObject ๋“ฑ์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ, ์ด๋“ค์ด ๋จผ์ € ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
// YourAppName-Bridging-Header.h
#ifndef YourAppName_Bridging_Header_h
#define YourAppName_Bridging_Header_h

// ๊ธฐ๋ณธ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์„ ๋จผ์ € import
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

// React Native ํ—ค๋”๋“ค
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

// ๋งˆ์ง€๋ง‰์— RNKakaoLogins import
#import "RNKakaoLogins.h"

#endif /* YourAppName_Bridging_Header_h */

3.3 AppDelegate.swift ์ˆ˜์ •

  • ๊ธฐ์กด Objective-C ์—์„œ AppDelegate.mm ํŒŒ์ผ์„ ๋งํฌ ๋‚ด์šฉ๋Œ€๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋‚ด์šฉ์„ AppDelegate.swift ์— ์ ์šฉ ํ•ด์•ผ ํ•œ๋‹ค.

  • ๋‚ด์šฉ ์ ์šฉ๋œ Swift ์ฝ”๋“œ

// ios/AppDelegate.swift

import UIKit
import React
import React_RCTAppDelegate
import ReactAppDependencyProvider
...

@main
class AppDelegate: RCTAppDelegate, MessagingDelegate, UNUserNotificationCenterDelegate {
  override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    self.moduleName = "YourAppName"
    self.dependencyProvider = RCTAppDependencyProvider()
    ...
    // ์ถ”๊ฐ€: Kakao SDK ์ดˆ๊ธฐํ™”
    RNKakaoLogins.initialize()
    ...
  }
  
  // ์ถ”๊ฐ€: - Kakao Login URL Scheme ์ฒ˜๋ฆฌ
  override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    if RNKakaoLogins.isKakaoTalkLoginUrl(url) {
      return RNKakaoLogins.handleOpen(url)
    }
    return super.application(app, open: url, options: options)
  }
  ...
}
...
  • RNKakaoLogins๋Š” ์•ž์„œ ๊ตฌ์„ฑํ•œ YourAppName-Bridging-Header.h ํŒŒ์ผ์„ ํ†ตํ•ด Objective-C ๋ชจ๋“ˆ์ด Swift ํ™˜๊ฒฝ์œผ๋กœ ๋ธŒ๋ฆฟ์ง•๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, Swift ํŒŒ์ผ์—์„œ ๋ณ„๋„์˜ import ๊ตฌ๋ฌธ ์—†์ด๋„ ์ง์ ‘ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

3.4 ์ถ”๊ฐ€ ์„ค์ •

๐Ÿ“„ Info.plist ์„ค์ •: ์นด์นด์˜ค ๋ฌธ์„œ ๋‚ด์šฉ ๋Œ€๋กœ 3๋ฒˆ๊นŒ์ง€๋Š” ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ”— 4. ์ฐธ๊ณ  ์ž๋ฃŒ

  • Claude - AI agent

ํ›„๊ธฐ

AppDelegate.swift ์—์„œ kakao ๋ชจ๋“ˆ swift ์ง์ ‘์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ๋„ ์‹œ๋„ํ•ด๋ดค๋Š”๋ฐ swift ๋ฅผ ์ „ํ˜€ ๋‹ค๋ค„๋ณธ์ ์ด ์—†์–ด ์‹คํŒจํ–ˆ๋‹ค. ์šฐ์„  ์ •์ƒ๋™์ž‘ ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ˆ˜์ •ํ•˜์˜€๋‹ค.

Claude ๋•๋ถ„์— ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ์ด ๋งค์šฐ ํŽธํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.ใ…Žใ…Ž

profile
์žŠ๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์„ ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€