메인 콘텐츠로 건너뛰기
[Tutorial]

React와 Capacitor를 사용한 모바일 앱 개발

React, Capacitor, 및 Capgo Native Navigation, Transitions, 및 iOS 레이아웃 최적화 방법을 사용하여 모바일 앱을 개발하는 방법을 배웁니다.

기사 기여자

마틴 도나디우

작가

발레리아

리뷰어

조던

편집자

React와 Capacitor를 사용한 모바일 앱 개발

In 이 튜토리얼에서, 우리는 새로운 React 앱을 시작하고 __CAPGO_KEEP_0__를 사용하여 네이티브 모바일 개발로 전환할 것입니다. 또한 __CAPGO_KEEP_1__ 네이티브 네비게이션 및 전환을 추가하여 네이티브 모바일 느낌을 주고, tailwind-__CAPGO_KEEP_2__를 사용하여 안전한 영역을 사용할 수 있습니다. React app and transition to native mobile development using Capacitor. You can also add Capgo Native Navigation and Transitions for a native mobile feel, and use tailwind-capacitor for safe areas.

Capacitor를 사용하여 네이티브 모바일 앱으로 변환하는 데 필요한 단계는 매우 간단합니다.

이 튜토리얼에서는 React 앱을 시작하고 __CAPGO_KEEP_0__를 사용하여 네이티브 모바일 앱으로 전환하는 과정을 안내할 것입니다. 또한 __CAPGO_KEEP_1__ 네이티브 네비게이션, 전환, tailwind-__CAPGO_KEEP_2__를 사용하여 안전한 영역을 사용할 수 있습니다.

This tutorial will guide you through the process, starting with a new React app and then incorporating Capacitor to move into the realm of native mobile apps. You can also use Capgo Native Navigation, Transitions, and tailwind-capacitor for safe areas.

CapacitorJS는 게임 체이너입니다! Capacitor를 웹 프로젝트에 쉽게 통합할 수 있으며, 네이티브 웹뷰로 애플리케이션을.wrap하고, 네이티브 Xcode 및 Android Studio 프로젝트를 생성합니다. 또한 플러그인은 카메라와 같은 네이티브 장치 기능에 대한 접근을 제공하는 JS 브릿지를 제공합니다.

__CAPGO_KEEP_0__를 사용하면 복잡한 설정이나 steep 러닝 커브 없이도 네이티브 모바일 앱을 얻을 수 있습니다. __CAPGO_KEEP_1__가 매우 가볍고 __CAPGO_KEEP_2__의 스트리밍 기능이 매우 간단하여 프로젝트에 쉽게 통합할 수 있습니다. 믿을 수 없을 정도로 __CAPGO_KEEP_0__를 사용하여 네이티브 앱을 완전히 기능하는 앱으로 만들 수 있습니다.

With Capacitor, you get a fantastic native mobile app without any complicated setup or steep learning curve. Its slim API and streamlined functionality make it a breeze to integrate into your project. Trust me, you’ll be amazed at how effortless it is to achieve a fully functional native app with Capacitor!

__CAPGO_KEEP_0__는 CapacitorJS의 이름입니다. React 앱을 네이티브 모바일 앱으로 변환하는 데 사용됩니다.

이 튜토리얼에서 가장 단순한 방법으로 React 애플리케이션을 시작하는 방법에 대해 설명합니다.

npx create-react-app my-app

native 모바일 앱을 만들기 위해서는 프로젝트의 export 을 필요로 합니다. 따라서 프로젝트의 package.json

{
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  }
}

에 간단한 스크립트를 포함시켜 React 프로젝트를 빌드하고 npm run build export

This folder will be used by Capacitor later on, but for now, we must set it up correctly.

Adding Capacitor to Your React App

을 실행할 수 있습니다. sync 이제 프로젝트의 루트 폴더에 새로운 폴더가 생성되어야 합니다.

우선 __CAPGO_KEEP_0__ __CAPGO_KEEP_1__을 개발 의존성으로 설치하고 프로젝트 내에서 설정할 수 있습니다. 설정 중에는 이름과 번들 ID에 대한 기본값을 수락하려면 “Enter”를 눌러도 됩니다. Capacitor CLI 다음으로 코어 패키지와 iOS 및 Android 플랫폼에 관련된 패키지를 설치해야 합니다.

마지막으로 플랫폼을 추가하고 __CAPGO_KEEP_0__은 프로젝트의 루트 폴더에 각 플랫폼을 위한 폴더를 생성할 것입니다:

Finally, we can add the platforms, and Capacitor will create folders for each platform at the root of our project:

# Install the Capacitor CLI locally
npm install -D @capacitor/cli

# Initialize Capacitor in your React project
npx cap init

# Install the required packages
npm install @capacitor/core @capacitor/ios @capacitor/android

# Add the native platforms
npx cap add ios
npx cap add android

이것은 실제 네이티브 프로젝트입니다! Android 프로젝트에 접근하려면 __CAPGO_KEEP_0__을 설치해야 합니다. __CAPGO_KEEP_0__ ios and

android

__CAPGO_KEEP_0__ 안드로이드 스튜디오. iOS에서 사용하려면 Mac이 필요하고 Xcode를 설치해야 합니다. Xcode.

또한 프로젝트에서 capacitor.config.ts file in your project, which contains some fundamental Capacitor settings utilized during the sync. The only thing you need to pay attention to is the __CAPGO_KEEP_0__설정들이 포함되어 있습니다. 주의할 것은

context: HTML text fragment from a longer Capgo UI string (parent key `solutions_cordova_to_capacitor_ai_step2_body`). Page/area: Capgo solutions marketing page. Role: Website copy sentence. Seen in: page solutions/cordova-to-capacitor-ai.astro. Message key `solutions_cordova_to_capacitor_ai_step2_body` (Solutions Cordova To Capacitor Ai Step2 Body). capacitor.config.json 이 문제를 해결하려면 __CAPGO_KEEP_0__.config.json:

{
  "appId": "com.example.app",
  "appName": "my-app",
  "webDir": "out",
  "bundledWebRuntime": false
}

이것을 시도하려면 다음 명령어를 실행하세요:

npm run build
npx cap sync

첫 번째 명령어 npm run build React 프로젝트를 단순히 빌드하고 정적 빌드를 내보냅니다.

두 번째 명령어 npx cap sync 웹 code을 모든 네이티브 플랫폼의 올바른 위치에同步합니다.

그리고 네이티브 플랫폼을 업데이트하고 플러그인을 설치할 수 있습니다. Capacitor 플러그인을 설치하면 다시 실행해야합니다. npx cap sync 이것을 알아채지 못한 채로 이제 실제로 완료되었습니다.

앱을 기기에서 확인해 보세요!

Build and Deploy 네이티브 앱

iOS 앱을 개발하려면 Xcode 설치되어 있어야 하며, 안드로이드 앱을 위해 Android Studio 설치되어 있어야 합니다. 또한 앱을 스토어에 배포하려면 iOS는 Apple Developer Program에, 안드로이드는 Google Play Console에 등록해야 합니다. native 모바일 개발에 새로운 입문자라면 __CAPGO_KEEP_0__ __CAPGO_KEEP_1__을 사용하여 쉽게 두 개의 네이티브 프로젝트를 열 수 있습니다.

If you’re new to native mobile development, you can use the Capacitor CLI to easily open both native projects:

npx cap open ios
npx cap open android

android-studio-run

Xcode에서는 실제 장치에 앱을 배포하려면 서명 계정을 설정해야 합니다. 이 과정을 처음으로 진행하는 경우 Xcode는 개발자 프로그램에 등록되어 있어야 합니다. 그 후에 단순히 플레이 버튼을 클릭하여 연결된 장치에서 앱을 실행할 수 있습니다. 예를 들어:

xcode-run

성공적으로 React 웹 앱을 모바일 장치에 배포했습니다. 예를 들어:

react-mobile-app

하지만 개발 중에 더 빠르게 할 수 있는 방법도 있습니다...

__CAPGO_KEEP_0__

Capacitor Live Reload

이제는 모든 현대 프레임워크에서热 재로드를 사용해 보셨을 것입니다. 좋은 소식은 현대 프레임워크와 마찬가지로 모바일 장치에서도 동일한 기능을 사용할 수 있다는 것입니다. 모바일 장치에서 최소한의 노력으로!

네트워크에서 로컬로 호스팅 된 애플리케이션에 대한 접근 권한을 활성화하여 __CAPGO_KEEP_0__ 앱이 특정 URL에서 콘텐츠를 로드하도록 하세요. 네트워크에서 로컬로 호스팅 된 애플리케이션에 대한 접근 권한을 활성화하여 __CAPGO_KEEP_0__ 앱이 특정 URL에서 콘텐츠를 로드하도록 하세요. by having the Capacitor app load the content from the specific URL.

윈도우즈에서 :

ipconfig getifaddr en0

그런 다음 IPv4 주소를 찾으세요.

ipconfig

__CAPGO_KEEP_0__을 서버에서 앱을 직접 로드하도록 지시하기 위해, 우리의 파일에 추가 항목을 추가할 수 있습니다:

Capacitor을 서버에서 앱을 직접 로드하도록 지시하기 위해, 우리의 파일에 추가 항목을 추가할 수 있습니다: capacitor.config.ts __CAPGO_KEEP_0__을 서버에서 앱을 직접 로드하도록 지시하기 위해, 우리의 파일에 추가 항목을 추가할 수 있습니다:

import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'my-app',
  webDir: 'out',
  bundledWebRuntime: false,
  server: {
    url: 'http://192.168.x.xx:3000',
    cleartext: true
  }
};

export default config;

이러한 작업을 완료하기 위해 올바른 IP와 포트를 사용하십시오. 이 예시에서 기본 React 포트를 사용했습니다.이제 이러한 변경 사항을 우리의 네이티브 프로젝트로 복사할 수 있습니다:

명령어는 이와 유사하지만, 웹 폴더와 설정만 업데이트하고 네이티브 프로젝트를 업데이트하지 않습니다.

npx cap copy

이제 Android Studio 또는 Xcode를 통해 앱을 한 번 더 배포할 수 있습니다. 그 후에, React 앱에서 변경 사항이 생기면 앱은 자동으로 다시 로드되고 변경 사항을 보여줍니다. copy 이제 이러한 변경 사항을 우리의 네이티브 프로젝트로 복사할 수 있습니다: sync명령어는 이와 유사하지만, 웹 폴더와 설정만 업데이트하고 네이티브 프로젝트를 업데이트하지 않습니다. 이제 Android Studio 또는 Xcode를 통해 앱을 한 번 더 배포할 수 있습니다. 그 후에, React 앱에서 변경 사항이 생기면 앱은 자동으로 다시 로드되고 변경 사항을 보여줍니다. 명령어는 이와 유사하지만, 웹 폴더와 설정만 업데이트하고 네이티브 프로젝트를 업데이트하지 않습니다.

이제 Android Studio 또는 Xcode를 통해 앱을 한 번 더 배포할 수 있습니다. 그 후에, React 앱에서 변경 사항이 생기면 앱은 자동으로 다시 로드되고 변경 사항을 보여줍니다. 이제 Android Studio 또는 Xcode를 통해 앱을 한 번 더 배포할 수 있습니다. 그 후에, React 앱에서 변경 사항이 생기면 앱은 자동으로 다시 로드되고 변경 사항을 보여줍니다. 이제 Android Studio 또는 Xcode를 통해 앱을 한 번 더 배포할 수 있습니다. 그 후에, React 앱에서 변경 사항이 생기면 앱은 자동으로 다시 로드되고 변경 사항을 보여줍니다.

주의해야 할 점 새로운 플러그인(예: 카메라) 설치 시에도 네이티브 프로젝트를 다시 빌드해야 합니다. 이는 네이티브 파일이 변경되었기 때문입니다.

정확한 IP와 포트를 사용하여 구성해야 합니다. 위의 code 블록은 React 기본 포트를示しています.

Capacitor 플러그인 사용

Capacitor 플러그인을 실제로 사용해 보겠습니다. 이를 위해 우리는 이전에 언급한 것처럼 간단한 플러그인을 설치할 수 있습니다.

npm i @capacitor/share

Share 플러그인은 특별한 기능이 없지만 네이티브 공유 대화상자를 열 수 있습니다. 이 플러그인을 사용하기 위해, 우리는 패키지를 임포트하고 함수를 호출하면 됩니다.앱의 src/App.js를 다음과 같이 변경해 보겠습니다. share() 새로운 플러그인을 설치할 때, sync 연산을 수행하고 앱을 다시 배포해야 합니다. 이 작업을 수행하려면 다음 명령어를 실행하세요. __CAPGO_KEEP_0__

import React from 'react';
import { Share } from '@capacitor/share';

function App() {
  const share = async () => {
    await Share.share({
      title: 'Open Youtube',
      text: 'Check new video on youtube',
      url: 'https://www.youtube.com',
      dialogTitle: 'Share with friends'
    });
  };

  return (
    <div>
      <h1>Welcome to React and Capacitor!</h1>
      <p>
        <h2>Cool channel</h2>
        <button onClick={() => share()}>Share now!</button>
      </p>
    </div>
  );
}

export default App;

__CAPGO_KEEP_0__

npx cap sync

버튼을 클릭한 후, 아름다운 네이티브 공유 대화창을 실제로 경험할 수 있습니다!

react-capacitor-share

다음으로, 앱을 iOS와 Android에서 더 네이티브하게 느끼게 하려면 Capgo 네비게이션과 전환을 사용하고, 일반적인 iOS 레이아웃 문제를 해결하여 수평 오버플로우나 안전 영역이 잘려 나가는 문제를 고칠 수 있습니다.

네이티브 느낌의 UI와 Capgo 네이티브 네비게이션 및 전환

수년간 Ionic을 사용하여 크로스 플랫폼 앱을 개발해 왔습니다. Ionic React와 함께 사용하는 Ionic과는 달리, Tailwind CSS와 함께 사용하는 것이 훨씬 더 가독성 좋고 효율적입니다. Tailwind CSS.

React + Capacitor 앱에서 네이티브 모바일 느낌을 얻으려면 웹 전용 UI 키트인 Konsta UI와 같은 대신 Capgo 플러그인을 사용하세요.

  • @capgo/capacitor-native-navigation — 네이티브 네비게이션 바, iOS에서 Liquid Glass 탭 바, Android에서 흐린 탭 바 스타일. React 라우터는 라우트 상태를 유지하고 플러그인은 네이티브 창을 관리합니다.
  • @capgo/capacitor-transitions — iOS와 Android에서 WebView layer에서 Ionic-style 페이지 전환 및 iOS edge swipe-back을 사용할 수 있습니다. Ionic UI를 채택하지 않습니다.

설치 BOTH:

bun add @capgo/capacitor-native-navigation @capgo/capacitor-transitions
bunx cap sync

자연스러운 네이티브 네비게이션을 구성하기 위해 CSS inset 모드를 사용하여 웹 콘텐츠가 네이티브 바를 존중하도록 하세요:

import { NativeNavigation } from '@capgo/capacitor-native-navigation';

await NativeNavigation.configure({
  contentInsetMode: 'css',
  animationDuration: 360,
  glass: {
    effect: 'liquidGlass',
  },
});

리퀴드 글라스 탭 바를 렌더링하세요 (iOS는 시스템 소유 렌더링을 사용하고 Android는 흐린 WebView 백그라운드 사용):

await NativeNavigation.setTabbar({
  selectedId: 'home',
  labelVisibilityMode: 'labeled',
  icons: true,
  colors: { dynamic: true },
  tabs: [
    { id: 'home', title: 'Home', icon: { svg: '...' } },
    { id: 'settings', title: 'Settings', icon: { svg: '...' } },
  ],
});

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  navigate(`/${id}`);
});

앱 셸에서 네이티브 페이지 전환을 추가하세요:

import { useEffect, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import '@capgo/capacitor-transitions';
import { initTransitions, setDirection, setupRouterOutlet } from '@capgo/capacitor-transitions/react';

initTransitions({ platform: 'auto' });

export function AppShell() {
  const navigate = useNavigate();
  const outletRef = useRef<HTMLElement>(null);

  useEffect(() => {
    if (outletRef.current) {
      setupRouterOutlet(outletRef.current, { platform: 'auto', swipeGesture: 'auto' });
    }
  }, []);

  const openSettings = () => {
    setDirection('forward');
    navigate('/settings');
  };

  return <cap-router-outlet ref={outletRef}>{/* routes */}</cap-router-outlet>;
}

페이지를 wrapping하여 cap-router-outlet, cap-page페이지를 wrapping하여 cap-content또는 setDirection('forward') 또는 setDirection('back') or

or Using @capgo/capacitor-native-navigation 그리고 Using @capgo/capacitor-transitions.

안전 영역에 있는 Tailwind

Tailwind CSS에서 장치의 안전 영역을 사용하려면 @capgo/tailwind-capacitor (__CAPGO_KEEP_0__에서 발표) tailwind-capacitor npm에서 제공하는 Tailwind 플러그인은 safe-areas utilities and other Capacitor-friendly Tailwind plugins:

bun add -D tailwind-capacitor

Tailwind의 유용한 기능을 사용하십시오 src/index.css:

@import 'tailwindcss';
@plugin "@capgo/tailwind-capacitor/platform";
@plugin "@capgo/tailwind-capacitor/safe-areas";

, 그리고 pt-safe, pb-safe대신에 px-safe 분산시키지 마십시오 env(safe-area-inset-*) __CAPGO_KEEP_0__ GitHub.

iOS 레이아웃 문제를 해결하는 방법

iOS에서 콘텐츠가 잘려나거나-shifted되거나 가로 스크롤이 가능하다면 overflow-x: hidden viewport 태그를 수정하는 것만으로도 해결되지 않는다. 이 체크를 순서대로 진행해 보세요.

viewport meta 태그가 올바르게 적용되어 있는지 확인하세요.

viewport meta 태그를 추가하세요. index.html viewport meta 태그를 <head>:

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />

안에

iOS safe area를 한 루트 wrapper에서만 처리하세요.

html,
body,
#root {
  width: 100%;
  min-height: 100%;
  margin: 0;
  padding: 0;
  overflow-x: hidden;
}

* {
  box-sizing: border-box;
}

.app-shell {
  min-height: 100dvh;
  width: 100%;
  padding-top: env(safe-area-inset-top);
  padding-right: env(safe-area-inset-right);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
}

싱글 앱 셸을 생성하고 safe area padding을 적용하세요. 여러 개의 중첩된 컴포넌트에서 safe area padding을 적용하는 것은 좋지 않습니다. .app-shell모든 페이지 콘텐츠를

With @capgo/tailwind-capacitor, __CAPGO_KEEP_0__을 사용하여 동일한 패딩을 표현할 수 있습니다. pt-safe pb-safe px-safe on that single shell.

Capacitor iOS contentInset to never 첫 번째

In capacitor.config.ts, __CAPGO_KEEP_0__의 자동 콘텐츠 인셋과 CSS 패딩을 혼합하는 것은 더블 스페이싱의 일반적인 원인입니다. contentInsetMode: 'css'__CAPGO_KEEP_0__

const config: CapacitorConfig = {
  appId: 'com.example.myapp',
  appName: 'my-app',
  webDir: 'dist',
  ios: {
    contentInset: 'never',
  },
};

Mixing Capacitor’s automatic content inset with CSS env(safe-area-inset-*) __CAPGO_KEEP_0__

실제로 넘치는 요소를 찾으세요

일반적으로 범인은 픽셀 너비가 고정된 요소 또는 큰 100vw, Tailwind w-screen, 고정된 픽셀 너비 또는 큰 min-width.

Safari Web Inspector에서 실행하세요:

[...document.querySelectorAll('*')]
  .filter(el => el.scrollWidth > document.documentElement.clientWidth)
  .map(el => ({
    el,
    tag: el.tagName,
    class: el.className,
    scrollWidth: el.scrollWidth,
    clientWidth: document.documentElement.clientWidth,
  }));

Tailwind의 경우 w-screen 대신 w-full 가능한 경우. 많은 가로 방출 문제는 100vw / w-screen, 중복된 안전 영역 패딩 또는 고정 너비 컨테이너에서 오는 것이 아니라, viewport meta 태그 자체에서 오지 않습니다.

결론

Capacitor은 기존 웹 프로젝트 기반의 네이티브 애플리케이션을 빌드하는 데 적합한 옵션입니다. existing web project의 code을 공유하고 일관된 UI를 유지하는 간단한 방법을 제공합니다.

그리고 __CAPGO_KEEP_1__의 추가 Capgo애플리케이션에 실시간 업데이트를 추가하는 것이 thậm chí 더 쉬워졌습니다. 사용자들이 항상 최신 기능과 버그 수정에 접근할 수 있도록 보장합니다.

다음 기사를 참조하여 React 애플리케이션에 Capgo를 추가하는 방법을 배우려면:

Building Mobile Apps with React and Capacitor

만약 __CAPGO_KEEP_0__를 사용하고 있다면 Building Mobile Apps with React and Capacitor CI/CD 자동화 계획을 위해 __CAPGO_KEEP_0__를 사용하고 있다면 __CAPGO_KEEP_0__ CI/CD와 연결하세요. Capgo CI/CD Capgo CI/CD에서 제품 워크플로우를 사용하세요. Capgo Native Builds Capgo Native Builds에서 제품 워크플로우를 사용하세요. Capgo Integrations Capgo 제품 워크플로우에 대한 CI/CD 통합 CI/CD 통합에 대한 구현 세부 정보 GitHub 액션 통합 GitHub 액션 통합에 대한 구현 세부 정보

Capacitor 앱에 대한 즉각적인 업데이트

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

__CAPGO_KEEP_0__를 통해 웹层 버그가 활성화된 경우, 앱 스토어 승인까지 며칠 기다리지 않고修정을 배포하세요. 사용자는 배경에서 업데이트를 받으면서 네이티브 변경 사항은 일반적인 검토 경로에 남아 있습니다.

페이지/영역: 홈페이지 마케팅 복사 문장. 역할: 웹사이트 복사 문장. 본문에 나타나는 곳: component HumanSupport.astro, component pricing/Plans.astro. 메시지 키 `home_hero_human_support` (홈 히어로 휴먼 지원).

시작하기

Capgo gives you the best insights you need to create a truly professional mobile app.