ReactNative의 Expo 개발 환경에서는 expo-localization 라이브러리를 이용해서 사용자의 로케일 및 언어 기본 설정에 대한 정보를 얻을 수 있습니다. 여기에는 사용자가 선호하는 언어, 국가 코드, 시간대 등이 포함됩니다. 이 라이브러리는 사용자의 로케일을 나타내는 문자열(예: 미국 영어의 경우 "en-US")을 반환하는 Localization.locale과 UTC에서 사용자의 시간대 오프셋을 반환하는 Localization.timezone을 비롯한 여러 메서드를 제공합니다.

i18n-js는 JavaScript의 국제화를 위한 라이브러리입니다. 이 라이브러리는 앱 콘텐츠를 여러 언어로 번역하고 사용자의 로케일에 따라 적절한 언어를 선택할 수 있는 방법을 제공합니다. 이 라이브러리는 복수화, 성별에 따른 번역 및 기타 일반적인 로컬라이제이션 작업을 처리하는 메서드를 제공합니다.

i18n-js는 원래 2008년에 Ruby on Rails 커뮤니티에서 Rails 애플리케이션의 국제화를 처리하기 위한 방법으로 개발되었습니다. 이후 JavaScript로 포팅되어 웹 및 모바일 애플리케이션의 국제화를 위한 인기 있는 라이브러리가 되었습니다. 이 라이브러리는 브라우저 기반 및 서버 기반 번역을 모두 지원하며 대규모 기여자 커뮤니티를 보유하고 있습니다.

import React, { useState, useEffect } from 'react';
import { Text, View } from 'react-native';
import { getLocales } from 'expo-localization';
import {I18n}from 'i18n-js';

const i18n = new I18n({
  en: {
    hello: "Hi!",
  },
  ko: {
    hello: "안녕하세요!",
  },
});
i18n.locale = 'ko'

export default function App() {
  const [locale, setLocale] = useState('');

  useEffect(() => {
    async function fetchLocale() {
      const currentLocale = await getLocales();
      setLocale(currentLocale[0].languageCode);
    }
    fetchLocale();
  }, []);

  return (
    <View>
      <Text>{i18n.t('hello')}</Text>
      <Text>Current locale: {locale}</Text>
    </View>
  );
}

이 예제에서는 expo-localization에서 getLocale 함수를 가져와서 useEffect 훅 안에서 사용하여 현재 디바이스 로케일을 비동기적으로 가져옵니다. 그런 다음 useState 훅을 사용하여 결과를 state에 저장하고 Text 컴포넌트에 표시합니다.

getLocale은 프로미스를 반환하기 때문에 비동기적으로 호출한다는 점에 유의하세요. 또한 컴포넌트가 마운트될 때 이펙트가 한 번만 실행되도록 빈 의존성 배열과 함께 useEffect 훅을 사용합니다. 이렇게 하면 불필요하게 getLocale을 호출하여 컴포넌트가 불필요하게 다시 렌더링되는 것을 방지할 수 있습니다.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee

React native의 RefreshControl 컴포넌트는 스크롤뷰, 플랫리스트, 섹션리스트 컴포넌트에 풀-투-리프레시 기능을 제공하는 내장 컴포넌트입니다. 사용자가 화면을 아래로 당겨서 수동으로 새로고침 동작을 트리거할 수 있습니다.

iOS에서 RefreshControl이 사용하는 기반 기술은 Apple에서 제공하는 UIRefreshControl 컴포넌트입니다. 마찬가지로 안드로이드에서 사용되는 기반 기술은 Google에서 제공하는 SwipeRefreshLayout 컴포넌트입니다.

RefreshControl을 사용하려면 'react-native' 패키지에서 가져와서 풀-투-리프레시 기능을 추가하려는 컴포넌트에 감싸줘야 합니다. 다음은 FlatList와 함께 RefreshControl을 사용하는 방법을 보여주는 코드 스니펫 예시입니다

import React, { useState } from 'react';
import { View, Text, FlatList, RefreshControl } from 'react-native';

const sample = [
  { id: '1', title: 'Item 1' },
  { id: '2', title: 'Item 2' },
  { id: '3', title: 'Item 3' },
  { id: '4', title: 'Item 4' },
  { id: '5', title: 'Item 5' },
];

const App = () => {
  const [refreshing, setRefreshing] = useState(false);

  const onRefresh = () => {
    setRefreshing(true);
    setTimeout(() => {
      setRefreshing(false);
    }, 2000);
  };

  const renderItem = ({ item }) => (
    <View style={{ padding: 20 }}>
      <Text>{item.title}</Text>
    </View>
  );

  return (
    <View style={{ flex: 1 }}>
      <FlatList
        data={sample}
        renderItem={renderItem}
        keyExtractor={item => item.id}
        refreshControl={
          <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
        }
      />
    </View>
  );
};

export default App;

이 예제에서는 목록이 현재 새로 고쳐지고 있는지 여부를 추적하는 상태 변수 refreshing과 데이터 불러오기를 수행하고 데이터 불러오기가 완료되면 refreshing 상태 변수를 false로 설정하는 onRefresh 함수를 정의합니다.

그런 다음 FlatList 컴포넌트를 RefreshControl 컴포넌트로 감싸고 refreshing 상태 변수와 onRefresh 함수를 프로퍼티로 전달합니다. 이렇게 하면 사용자가 화면을 아래로 끌어내려 수동으로 새로고침을 트리거할 수 있으며, 그러면 onRefresh 함수가 호출됩니다.

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee

리액트 네이티브 구글 모바일 광고(React Native Google Mobile Ads)는 리액트 네이티브로 제작된 모바일 애플리케이션에 구글 애드몹 광고를 통합할 수 있는 리액트 네이티브용 라이브러리입니다. 이 라이브러리는 개발자가 배너 광고, 전면 광고, 보상형 동영상 광고, 네이티브 광고를 React Native 애플리케이션 내에 쉽게 표시할 수 있도록 포괄적인 API 세트를 제공합니다.

이 라이브러리가 현재 모습에 이르기 전, 기존에는 모바일 앱 개발자를 위한 공식 애드몹 SDK를 Google에서 개발했습니다. 하지만 2019년에 구글은 개발자가 안드로이드와 iOS 앱에 AdMob 광고를 통합할 수 있는 통합된 방법을 제공하는 구글 모바일 광고 SDK를 선호하는 대신 공식 SDK에 대한 지원을 중단한다고 발표했습니다.

개발자가 새로운 SDK로 마이그레이션할 수 있도록 React Native Google 모바일 광고 라이브러리가 개발되었으며, 현재 오픈 소스 커뮤니티에서 유지 관리하고 있습니다. 라이브러리는 npm을 통해 다운로드 할 수 있으며 표준 패키지 관리 도구를 사용하여 React Native 프로젝트에 쉽게 설치할 수 있습니다.

invertase/react-native-google-mobile-ads: React Native Google Mobile Ads enables you to monetize your app with AdMob.

 

GitHub - invertase/react-native-google-mobile-ads: React Native Google Mobile Ads enables you to monetize your app with AdMob.

React Native Google Mobile Ads enables you to monetize your app with AdMob. - GitHub - invertase/react-native-google-mobile-ads: React Native Google Mobile Ads enables you to monetize your app with...

github.com

리액트 네이티브 구글 모바일 광고(React Native Google Mobile Ads) 라이브러리를 Expo 환경에서 설치 및 개발을 진행하기 위해서는 expo-dev-client가 필요합니다.

BuildProperties - Expo Documentation

# For iOS
npx pod-install
npx react-native run-ios

# For Android
npx react-native run-android

# For expo users not using EAS
npx expo prebuild

# For expo users using EAS
npx eas-cli build --profile development
# eas build --profile development-simulator --platform ios

아래와 같은 애드몹 설정이 없는 경우 빌드시 에러가 발생하니 주의해야 합니다.

// <project-root>/app.json
{
  "expo": {
    // ...
  },
  "react-native-google-mobile-ads": {
    "android_app_id": "ca-app-pub-xxxxxxxx~xxxxxxxx",
    "ios_app_id": "ca-app-pub-xxxxxxxx~xxxxxxxx"
  }
}

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee

FlatList와 SectionList는 모두 데이터 목록을 렌더링하는 데 사용되는 React Native의 컴포넌트입니다.

FlatList는 모든 항목이 동일한 유형인 항목의 목록을 렌더링하는 데 사용됩니다. 성능이 핵심 요소인 긴 데이터 목록에 가장 적합합니다. FlatList는 화면에 표시되는 항목만 렌더링하므로 애플리케이션의 전반적인 성능이 향상됩니다.

SectionList는 섹션으로 나뉜 항목 목록을 렌더링하는 데 사용됩니다. 각 섹션은 머리글과 바닥글을 가질 수 있으며 다양한 유형의 항목을 포함할 수 있습니다. 분류하거나 그룹화해야 하는 복잡한 데이터를 렌더링하는 데 가장 적합합니다. 섹션 목록은 또한 화면에 표시되는 항목만 렌더링하여 성능에 최적화되어 있습니다.

React Native의 FlatList를 랩핑하는 방식으로 SectionList와 같은 컴포넌트를 만들 수 있습니다. FlatList 컴포넌트를 사용하고 각각의 섹션 프롭을 이용하여 데이터를 그룹화하면 됩니다.

import { FlatList } from 'react-native';

const MySectionListOne = ({ sections, renderItem, renderSectionHeader }) => {
  // Group data by section key
  const data = sections.reduce((acc, section) => {
    return [
      ...acc,
      { section: true, title: section.title },
      ...section.data.map(item => ({ ...item, section: false })),
    ];
  }, []);

  // Render item or section header based on section property
  const renderItemOrHeader = ({ item }) => {
    if (item.section) {
      return renderSectionHeader(item);
    }
    return renderItem(item);
  };

  return (
    <FlatList
      data={data}
      renderItem={renderItemOrHeader}
      keyExtractor={(item, index) => `${item.id}-${index}`}
    />
  );
};

export default MySectionListOne;

또는 맵 함수를 사용하여 섹션과 데이터 속성을 가진 객체가 포함된 배열을 반복 할 수 있습니다.
MyFlatListTwo 컴포넌트 자체는 목록 위에 제목을 표시하는 Text 컴포넌트가 있는 FlatList 컴포넌트를 감싸는 간단한 래퍼입니다.
이 접근 방식을 사용하면 SectionList 컴포넌트와 비슷한 방식으로 여러 개의 FlatList 컴포넌트를 렌더링할 수 있습니다.

import { View, Text, FlatList } from 'react-native';

const DATA = [
  {
    title: 'Fruits',
    data: ['Apple', 'Banana', 'Cherry'],
  },
  {
    title: 'Vegetables',
    data: ['Carrot', 'Eggplant', 'Tomato'],
  },
];

const MyFlatList = ({ title, data }) => (
  <>
    <Text>{title}</Text>
    <FlatList
      data={data}
      renderItem={({ item }) => <Text>{item}</Text>}
      keyExtractor={(item) => item}
    />
  </>
);

const MySectionListTwo = () => (
  <View>
    {DATA.map(({ title, data }) => (
      <MyFlatList title={title} data={data} key={title} />
    ))}
  </View>
);

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee

React Native의 모달(Modal) 컴포넌트는 콘텐츠를 표시하거나 사용자에게 작업을 요청하는 데 사용되는 UI 요소입니다. 기본적으로 현재 화면 위에 표시되는 팝업 창이며 일반적으로 사용자의 주의를 요하는 중요한 정보가 포함되어 있습니다.

 


크로스 플랫폼 웹 환경에서 모달(Modal) 컴포넌트를 사용할 때 웹 브라우저와 모바일 디바이스가 팝업 창을 처리하는 방식이 다르기 때문에 몇 가지 문제가 발생할 수 있습니다. 주요 문제 중 하나는 모달(Modal) 컴포넌트의 위치와 관련된 것입니다. React Native에서 모달(Modal) 컴포넌트는 기본적으로 화면 중앙에 위치하지만, 웹 환경에서는 이것이 바람직한 동작이 아닐 수 있습니다. 웹 개발자는 모달(Modal) 컴포넌트를 화면의 특정 위치(예: 뷰포트의 모서리나 가장자리)에 배치하고 싶을 수 있습니다.

비교적 최근 react-native-web 라이브러리의 모달(Modal) 컴포넌트에서 이러한 문제를 해결하여 새로 추가 되었습니다.

https://necolas.github.io/react-native-web/docs/modal/

 

Modal // React Native for Web

onRequestClose: ?() => void Called when the user is attempting to close the modal like when they hit Escape. Only the top-most Modal responds to hitting Escape.

necolas.github.io

크로스 플랫폼 웹 환경에서 모달(Modal) 컴포넌트를 사용할 때 발생할 수 있는 또 다른 문제는 접근성과 관련이 있습니다. React Native의 모달(Modal) 컴포넌트는 스크린 리더 지원 및 키보드 탐색과 같은 기능을 통해 장애가 있는 사용자도 완벽하게 액세스할 수 있도록 설계되었습니다. 하지만 리액트 네이티브 웹 라이브러리의 모달(Modal) 컴포넌트는 동일한 수준의 접근성 지원을 제공하지 않을 수 있습니다.

요약하자면, 모달(Modal) 컴포넌트는 리액트 네이티브에서 유용한 UI 요소이지만 크로스 플랫폼 웹 환경에서 사용할 때는 위치 지정 및 접근성 관련 문제를 포함해 고려해야 할 몇 가지 문제가 있습니다. 개발자는 이러한 문제를 인식하고 모달(Modal) 컴포넌트가 올바르게 작동하고 모든 사용자가 액세스할 수 있도록 조치를 취해야 합니다.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0 

Posted by cipleee