본문 바로가기

시작하기

GitHub

AI-Assisted Setup으로 플러그인을 설치할 수 있습니다. 다음 명령어로 AI 도구에 Capgo 스킬을 추가하세요:

터미널 창
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

그런 다음 아래 프롬프트를 사용하세요:

Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/capacitor-native-navigation` plugin in my project.

수동 설정을 선호한다면, 다음 명령어를 실행하여 플러그인을 설치하고 아래의 플랫폼별 지침을 따르세요:

  1. 패키지 설치

    터미널 창
    npm i @capgo/capacitor-native-navigation
  2. 네이티브 프로젝트 동기화

    터미널 창
    npx cap sync
  3. 네이티브 크롬 설정

    import { NativeNavigation } from '@capgo/capacitor-native-navigation';
    await NativeNavigation.configure({
    contentInsetMode: 'css',
    animationDuration: 360,
    colors: {
    tint: '#0f172a',
    inactiveTint: '#64748b',
    },
    });
  4. 네이티브 네비게이션 바 렌더링

    await NativeNavigation.setNavbar({
    title: 'Home',
    subtitle: 'Native chrome',
    transparent: true,
    backButton: { visible: false },
    rightItems: [
    {
    id: 'compose',
    title: 'Compose',
    icon: {
    svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"/></svg>',
    },
    },
    ],
    });
  5. 네이티브 탭 바 렌더링

    await NativeNavigation.setTabbar({
    selectedId: 'home',
    labelVisibilityMode: 'selected',
    icons: true,
    colors: {
    dynamic: true,
    tint: '#0f172a',
    inactiveTint: '#64748b',
    },
    tabs: [
    {
    id: 'home',
    title: 'Home',
    icon: {
    svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 10.5 12 3l9 7.5"/><path d="M5 10v10h14V10"/></svg>',
    },
    },
    {
    id: 'settings',
    title: 'Settings',
    badge: '2',
    icon: {
    svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3"/></svg>',
    },
    },
    ],
    });
  6. 네이티브 인텐트 이벤트 처리

    await NativeNavigation.addListener('navbarBack', () => {
    router.back();
    });
    await NativeNavigation.addListener('navbarItemTap', ({ id }) => {
    if (id === 'compose') router.push('/compose');
    });
    await NativeNavigation.addListener('tabSelect', ({ id }) => {
    router.push(`/${id}`);
    });

세그먼트 행이 있는 멀티 레벨 네비게이션 바

“세그먼트 행이 포함된 다단계 네비게이션 바” 섹션

전달하세요: segments 대상 setNavbar 바 아래에 네이티브 세그먼트 행을 쌓는 기능입니다. 예를 들어 위에는 스코프 스위처, 아래에는 섹션 탭을 둘 수 있습니다. 행은 위에서 아래로 그려지고, 각 행은 navbar와 보고되는 insets에 44pt(iOS) 또는 48dp(Android)를 더합니다. iOS는 UISegmentedControl 그리고 글래스 필을 사용하며, Android는 Material segmented buttons와 filter chips를 사용합니다.

iOSAndroid
iOS 녹화: Account 섹션을 탭하고 Organization으로 전환하면 두 번째 행이 8개의 스크롤 가능한 칩으로 바뀌며, Billing 선택Android 녹화: 스크롤되는 섹션 칩 위의 segmented Account / Organization 행, 스코프 전환 및 Billing 선택
const sections = {
account: ['General', 'Notifications', 'Password', 'Two-factor'],
organization: ['General', 'Members', 'Plans', 'Usage', 'Credits', 'Billing', 'Security', 'Webhooks'],
};
const selection = { scope: 'account', section: 'general' };
const renderNavbar = () =>
NativeNavigation.setNavbar({
title: 'Settings',
segments: [
{
id: 'scope',
selectedId: selection.scope,
items: [
{ id: 'account', title: 'Account' },
{ id: 'organization', title: 'Organization' },
],
},
{
id: 'section',
style: 'scroll', // scrolling chips; `auto` uses `segmented` for up to 4 items
selectedId: selection.section,
items: sections[selection.scope].map((title) => ({ id: title.toLowerCase(), title })),
},
],
});
await NativeNavigation.addListener('navbarSegmentSelect', async ({ groupId, id }) => {
if (groupId === 'scope') {
selection.scope = id;
selection.section = 'general'; // the second level depends on the first one
} else {
selection.section = id;
}
await renderNavbar();
});
await renderNavbar();

사용자가 탭하면 선택 항목이 네이티브로 이동하지만, setNavbar 호출할 때마다 selectedId 다시 적용됩니다. 선택한 id를 state에 유지하고 이후의 모든 setNavbar 호출 시 전달하세요. 선택을 거부하려면 이전 값을 selectedId로 보내세요. 항목은 다음도 받습니다 icon, accessibilityLabel, 그리고 enabled. 전달하세요 segments: [] 행을 제거하려면 사용하세요. 8.13.0부터 사용 가능합니다.

Native transition은 일반적인 JavaScript 라우트 변경을 감싸는 트랜잭션입니다:

const transition = await NativeNavigation.beginTransition({
direction: 'forward',
});
router.push('/detail');
await router.ready?.();
await NativeNavigation.setNavbar({
title: 'Detail',
backButton: { visible: true, title: 'Back' },
});
await NativeNavigation.finishTransition({
id: transition.id,
direction: 'forward',
});

카드에서 상세 페이지로 이동하거나 미디어 미리보기 흐름에는 zoom helper를 사용하세요. 라우터가 콘텐츠를 바꾸기 전에 탭한 요소를 전달하고, 상세 페이지가 준비된 후 마무리하세요.

import { beginZoomTransition, finishZoomTransition } from '@capgo/capacitor-native-navigation';
const card = document.querySelector('[data-message-card]');
if (card) {
const transition = await beginZoomTransition(card, { cornerRadius: 18 });
router.push('/message/42');
await router.ready?.();
await NativeNavigation.setNavbar({
title: 'Message',
backButton: { visible: true, title: 'Inbox' },
});
await finishZoomTransition(undefined, {
id: transition.id,
cornerRadius: 18,
});
}

@capgo/capacitor-transitions와 함께 사용

“@capgo/capacitor-transitions와 함께 사용하기” 섹션

네이티브 navbar, tabbar, safe-area inset, 네이티브 intent 이벤트에는 Native Navigation을 사용하세요. 또한 @capgo/capacitor-transitions 네이티브 크롬(chrome) 하단의 WebView 페이지 스택을 위한 기능입니다.

터미널 창
npm install @capgo/capacitor-native-navigation @capgo/capacitor-transitions
npx cap sync

두 패키지를 한 번만 초기화하세요:

import { NativeNavigation } from '@capgo/capacitor-native-navigation';
import '@capgo/capacitor-transitions';
import { initTransitions, setupRouterOutlet, setDirection } from '@capgo/capacitor-transitions/react';
initTransitions({ platform: 'auto' });
const outlet = document.querySelector('cap-router-outlet');
if (outlet) {
setupRouterOutlet(outlet, { platform: 'auto', swipeGesture: 'auto' });
}
await NativeNavigation.configure({
contentInsetMode: 'css',
});

유지하세요 cap-router-outlet 중복된 웹 바가 아닌 페이지에 집중합니다:

<cap-router-outlet platform="auto" swipe-gesture="auto">
<cap-page>
<cap-content slot="content" fullscreen>
<main class="page">Inbox content</main>
</cap-content>
</cap-page>
</cap-router-outlet>

동일한 라우터 액션으로 두 패키지를 모두 제어하세요:

async function openMessage(id: string) {
setDirection('forward');
await router.push(`/messages/${id}`);
await NativeNavigation.setNavbar({
title: 'Message',
backButton: { visible: true, title: 'Inbox' },
});
}
await NativeNavigation.addListener('navbarBack', () => {
setDirection('back');
router.back();
});
await NativeNavigation.addListener('tabSelect', ({ id }) => {
setDirection('root');
router.push(`/${id}`);
});

경로 변경마다 애니메이션 레이어는 하나만 선택하세요. 일반적인 @capgo/capacitor-transitions 일반적인 페이지 push는 애니메이션으로 처리하고, Native Navigation의 zoom helper는 shared-element나 zoom 라우트에만 사용하세요.

사용하면 contentInsetMode: 'css', 플러그인이 네이티브 바의 크기를 document.documentElement.

.page {
padding-top: var(--cap-native-navigation-top);
padding-bottom: var(--cap-native-navigation-bottom);
}

사용 가능한 변수:

  • --cap-native-navigation-top
  • --cap-native-navigation-right
  • --cap-native-navigation-bottom
  • --cap-native-navigation-left
  • --cap-native-navbar-height
  • --cap-native-tabbar-height

아이콘 디스크립터

“Icon descriptors” 섹션

아이콘은 네이티브 UI에서 렌더링되므로 직렬화가 가능해야 합니다. 크로스 플랫폼 SVG, 플랫폼별 SVG, SF Symbols, 번들링된 iOS 이미지, Android drawable 리소스 또는 번들링된 Android 이미지를 사용할 수 있습니다.

const icon = {
svg: '<svg viewBox="0 0 24 24"><path d="M3 10.5 12 3l9 7.5"/></svg>',
width: 24,
height: 24,
template: true,
src: 'fallback_asset_name',
ios: {
svg: '<svg viewBox="0 0 24 24"><path d="M3 10.5 12 3l9 7.5"/></svg>',
sfSymbol: 'house.fill',
image: 'BundledAssetName',
},
android: {
svg: '<svg viewBox="0 0 24 24"><path d="M3 10.5 12 3l9 7.5"/></svg>',
resource: 'ic_menu_view',
image: 'bundled_drawable_name',
},
};

Inline SVG는 Lucide 및 Feather와 같은 일반적인 아이콘 세트에서 사용하는 아이콘 중심의 서브셋을 지원합니다: path, line, polyline, polygon, circle, 그리고 rect. SVG 아이콘은 기본적으로 템플릿 이미지로 렌더링되므로, 네이티브 tint color로 색상을 변경할 수 있습니다.

선택적 웹 컴포넌트

“Optional web components” 섹션

이 패키지는 프레임워크에 구애받지 않는 선언적 설정을 위해 커스텀 요소를 등록할 수 있습니다:

import { defineNativeNavigationElements } from '@capgo/capacitor-native-navigation';
defineNativeNavigationElements();
<cap-native-navigation-provider enabled="true" content-inset-mode="css"></cap-native-navigation-provider>
<cap-native-navbar
title="Home"
transparent
right-items='[{"id":"compose","title":"Compose","icon":{"svg":"<svg viewBox=\"0 0 24 24\"><path d=\"M12 20h9\"/></svg>"}}]'
></cap-native-navbar>
<cap-native-tabbar
selected-id="home"
tabs='[{"id":"home","title":"Home","icon":{"ios":{"sfSymbol":"house.fill"}}}]'
></cap-native-tabbar>

iPhone Duo의 경우, iOS는 시스템 탭 바와 상태 표시줄을 주로 세로형 사이드 레일(vertical side rail)에. env(safe-area-inset-top) 할 수 있습니다 0 하는 동안 left 또는 right 늘어납니다. 설정하세요 viewport-fit=cover 앱 어디에서든 CSS env로 패딩을 줄 때 viewport meta tag에 적용됩니다. Xcode Device Hub에서 접힘, 펼침, 가로 모드 및 Split View 상태를 테스트하세요.

Native Navigation은 실제 UINavigationBar 및 UITabBar를(을) 사용하므로, 시스템 탭 바는 레일을 따라. 곡선 탭 바 모양은 하단에 유지되며, 창이 넓어질 때 중앙 액션은 원형 크레이들 형태를 유지합니다.

두 가지 가로 모드 레이아웃입니다. 왼쪽은 시스템 탭 바가 사이드 레일에 위치합니다. 오른쪽은 곡선형 탭 바가 하단에 유지되며, 중앙 액션은 원형 크레이들에 위치합니다.

사용하면 contentInsetMode: 'css'플러그인 변수를 사용하여 웹 콘텐츠에 패딩을 적용하세요. 각 가장자리별 env fallback을 사용하는 max() 를(을) 사용하면 플러그인 변수가 0 중복 인셋(insets)을 합산하지 않도록:

main {
padding-top: max(var(--cap-native-navigation-top, 0px), env(safe-area-inset-top, 0px));
padding-right: max(var(--cap-native-navigation-right, 0px), env(safe-area-inset-right, 0px));
padding-bottom: max(var(--cap-native-navigation-bottom, 0px), env(safe-area-inset-bottom, 0px));
padding-left: max(var(--cap-native-navigation-left, 0px), env(safe-area-inset-left, 0px));
}

이벤트 리스닝: safeAreaChanged (또는 capNativeNavigation:safeAreaChanged 켜짐 window) 레일 측면이나 폴드 상태가 변경될 때. 호스팅 시스템 탭 바의 경우, insets.tabbarHeight 일 수 있습니다 0 하단 패딩이 중복되는 것을 방지하려면; 다음을 사용하세요 insets.systemTabbarHeight 또는 --cap-native-system-tabbar-height FAB 오프셋용으로.

Capacitor 관련 가이드 (viewport-fit, System Bars, Status Bar, 테스트): Capacitor 앱에서 iPhone Duo 지원하기.

플랫폼 참고 사항

“Platform notes” 섹션
  • iOS 렌더링 UINavigationBar 및 UITabBariOS 26+는 시스템 Liquid Glass bar 동작을 사용합니다.
  • Android는 AppCompat toolbar와 Material bottom navigation을 렌더링합니다.
  • Web fallback은 네이티브 바를 그리지 않습니다. 브라우저 개발을 위해 이벤트와 inset 변수를 미러링합니다.
  • 이 플러그인은 전체 화면 Capacitor WebView 하나를 유지합니다. 프레임, 바, safe-area 보고, 트랜지션 셸은 네이티브가 담당합니다.

사용 중이라면 시작하기 네이티브 미디어 및 인터페이스 동작을 계획하려면, 이를 다음 항목과 연결하세요: @capgo/capacitor-native-navigation 사용하기 @capgo/capacitor-native-navigation 사용 시 네이티브 기능을 위해서는, @capgo/capacitor-live-activities 사용 @capgo/capacitor-live-activities 사용에서의 네이티브 기능, @capgo/capacitor-live-activities @capgo/capacitor-live-activities의 구현 세부 사항, @capgo/capacitor-video-player 사용 @capgo/capacitor-video-player 사용에서의 네이티브 기능 및 @capgo/capacitor-video-player @capgo/capacitor-video-player.의 구현 세부 사항