1. 네이버 로그인 기본 사진

Untitled

  1. 필요한 패키지

flutter pub add flutter_naver_login

  1. 기본 로직
import 'package:flutter/material.dart';
import 'package:flutter_naver_login/flutter_naver_login.dart';
import 'package:my_dream/coreService/provider.dart';
import 'package:my_dream/login/snsLogin/login_dio.dart';

class NaverLogin extends StatefulWidget {
  const NaverLogin({super.key});

  @override
  State<NaverLogin> createState() => _NaverLoginState();
}

class _NaverLoginState extends State<NaverLogin> {
  Future<void> signInWithNaver() async {
    LoginModel loginModel = LoginModel();
    await FlutterNaverLogin.logIn();
    final NaverAccessToken naverLogin =
        await FlutterNaverLogin.currentAccessToken;
    bool result = await snsLogin('NAVER', naverLogin.accessToken);
    if (result) {
      if (mounted) {
        loginModel.setloginStatus(result);
        Navigator.pushNamed(context, '/StudentIdentityCheck');
      }
    } else {
      loginModel.setloginStatus(result);
    }
  }

  @override
  Widget build(BuildContext context) {
    return TextButton(
      onPressed: () => signInWithNaver(),
      child: Image.asset(
        'assets/naver_login.png',
      ),
    );
  }
}
  1. info.Plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "<http://www.apple.com/DTDs/PropertyList-1.0.dtd>">
<plist version="1.0">
<dict>
    <!--기본 설정 생략 -->

    <!-- 네이버 로그인에 필요한 Custom URL Scheme -->
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>your_custom_scheme</string> <!-- 여기를 네이버 앱 URL Scheme으로 교체 -->
            </array>
        </dict>
    </array>
    
    <!-- 네이버 앱에서 호출될 수 있도록 LSApplicationQueriesSchemes에 추가 -->
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>naversearchapp</string>
        <string>naversearchthirdlogin</string>
    </array>

    <!-- 네이버 로그인 설정 -->
    <key>naverConsumerKey</key>
    <string>client-id</string> <!-- 네이버 클라이언트 ID로 교체하세요 -->

    <key>naverConsumerSecret</key>
    <string>client-secret</string> <!-- 네이버 클라이언트 시크릿으로 교체하세요 -->

    <key>naverServiceAppName</key>
    <string>app_name</string> <!-- 네이버 애플리케이션 이름으로 교체하세요 -->

    <!-- 네이버 API 요청을 위한 네트워크 설정 -->
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>naver.com</key>
            <dict>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
            <key>naver.net</key>
            <dict>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>
    <!-- 나머지 설정들... -->
</dict>
</plist>

4.1. 배포시 주의 NSAllowsArbitraryLoads 키를 NSAppTransportSecurity로 변경해 보안 신경쓰기

  1. 네이버 앱 어플리케이션과 연동해 로그인 하기(AppDelegate.swift)

AppDelegate.swift 이 설정을 누락시, 사용자가 네이버앱이 설치되어있을 경우, 로그인 흐름이 끊긴다 → 네이버 앱에서 토큰을 받아오지 못하는 상황발생

import UIKit
import Flutter
import NaverThirdPartyLogin

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    if NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options) {
      return true
    }

    return super.application(app, open: url, options: options)
  }
}