커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
5-3강 애드몹 설치 이후 광고 키 값 넣고 실행시 에러 발생
[왕초보] 나만의 수익성 앱, 앱개발 종합반
5주차
북마크
조*근
댓글
1
추천
0
조회수
43
조회수
43
답변 완료


현재 아래와 같은 에러가 발생 하였습니다.


Invariant Violation: requireNativeComponent: "ViewManagerAdapter_ExpoAdsAdMobBannerView" was not found in the UIManager.


This error is located at:

  in ViewManagerAdapter_ExpoAdsAdMobBannerView

  in Adapter<ExpoAdsAdMobBannerView> (created by AdMobBanner)

  in RCTView (created by View)

  in View (created by AdMobBanner)

  in AdMobBanner (created by MainPage)

  in RCTView (created by View)

  in View (created by ScrollView)

  in RCTScrollView (created by ScrollView)

  in ScrollView (created by ScrollView)

  in ScrollView (created by MainPage)

  in MainPage (created by SceneView)

  in StaticContainer

  in EnsureSingleNavigator (created by SceneView)

  in SceneView (created by CardContainer)

  in RCTView (created by View)

  in View (created by CardContainer)

  in RCTView (created by View)

  in View (created by CardContainer)

  in RCTView (created by View)

  in View

  in CardSheet (created by Card)

  in RCTView (created by View)

  in View (created by AnimatedComponent)

  in AnimatedComponent

  in AnimatedComponentWrapper (created by PanGestureHandler)

  in PanGestureHandler (created by PanGestureHandler)

  in PanGestureHandler (created by Card)

  in RCTView (created by View)

  in View (created by AnimatedComponent)

  in AnimatedComponent

  in AnimatedComponentWrapper (created by Card)

  in RCTView (created by View)

  in View (created by Card)

  in Card (created by CardContainer)

  in CardContainer (created by CardStack)

  in RNSScreen (created by AnimatedComponent)

  in AnimatedComponent

  in AnimatedComponentWrapper (created by Screen)

  in MaybeFreeze (created by Screen)

  in Screen (created by MaybeScreen)

  in MaybeScreen (created by CardStack)

  in RNSScreenContainer (created by ScreenContainer)

  in ScreenContainer (created by MaybeScreenContainer)

  in MaybeScreenContainer (created by CardStack)

  in RCTView (created by View)

  in View (created by Background)

  in Background (created by CardStack)

  in CardStack (created by HeaderShownContext)

  in RNCSafeAreaProvider (created by SafeAreaProvider)

  in SafeAreaProvider (created by SafeAreaInsetsContext)

  in SafeAreaProviderCompat (created by StackView)

  in RNGestureHandlerRootView (created by GestureHandlerRootView)

  in GestureHandlerRootView (created by StackView)

  in StackView (created by StackNavigator)

  in PreventRemoveProvider (created by NavigationContent)

  in NavigationContent

  in Unknown (created by StackNavigator)

  in StackNavigator (created by StackNavigator)

  in StackNavigator (created by App)

  in EnsureSingleNavigator

  in BaseNavigationContainer

  in ThemeProvider

  in NavigationContainerInner (created by App)

  in App (created by ExpoRoot)

  in ExpoRoot

  in RCTView (created by View)

  in View (created by AppContainer)

  in RCTView (created by View)

  in View (created by AppContainer)

  in AppContainer

  in main(RootComponent)

at node_modules\expo\build\environment\react-native-logs.fx.js:null in error

at node_modules\react-native\Libraries\Core\ExceptionsManager.js:null in reportException

at node_modules\react-native\Libraries\Core\ExceptionsManager.js:null in handleException

at node_modules\react-native\Libraries\Core\ReactFiberErrorDialog.js:null in showErrorDialog

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in logCapturedError

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in update.callback

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in callCallback

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in commitUpdateQueue

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in commitLayoutEffectOnFiber

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in commitLayoutMountEffects_complete

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in commitLayoutEffects_begin

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in commitLayoutEffects

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in commitRootImpl

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in commitRoot

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in performSyncWorkOnRoot

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in flushSyncCallbacks

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in flushSyncCallbacksOnlyInLegacyMode

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in scheduleUpdateOnFiber

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in dispatchSetState

at node_modules\promise\setimmediate\core.js:null in tryCallOne

at node_modules\promise\setimmediate\core.js:null in setImmediate$argument_0

at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in _allocateCallback$argument_0

at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in _callTimer

at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in _callReactNativeMicrotasksPass

at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in callReactNativeMicrotasks

at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __callReactNativeMicrotasks

at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __guard$argument_0

at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __guard

at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in flushedQueue


[Unhandled promise rejection: Invariant Violation: requireNativeComponent: "ViewManagerAdapter_ExpoAdsAdMobBannerView" was not found in the UIManager.]

at node_modules\invariant\browser.js:null in invariant

at node_modules\react-native\Libraries\ReactNative\getNativeComponentAttributes.js:null in getNativeComponentAttributes

at node_modules\react-native\Libraries\Renderer\shims\ReactNativeViewConfigRegistry.js:null in exports.get

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in createInstance

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in completeWork

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in completeUnitOfWork

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in performUnitOfWork

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in workLoopSync

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in renderRootSync

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in performSyncWorkOnRoot

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in flushSyncCallbacks

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in flushSyncCallbacksOnlyInLegacyMode

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in scheduleUpdateOnFiber

at node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:null in dispatchSetState

at node_modules\promise\setimmediate\core.js:null in tryCallOne

at node_modules\promise\setimmediate\core.js:null in setImmediate$argument_0

at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in _allocateCallback$argument_0

at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in _callTimer

at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in _callReactNativeMicrotasksPass

at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in callReactNativeMicrotasks

at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __callReactNativeMicrotasks

at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __guard$argument_0

at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __guard

at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in flushedQueue



보고 계신

스파르타 즉문즉답

화면 전체를 캡처해 주시면, 튜터님들이 빠르게 상황을 이해할 수 있어요.

스파르타 즉문즉답

애드몹 설치를 하였으나, 인식을 못 하는거 같습니다..



작성한 코드 및 에러 메세지

import React,{useState,useEffect} from 'react';

import { StyleSheet, Text, View, Image, TouchableOpacity, ScrollView} from 'react-native';


const main = 'https://storage.googleapis.com/sparta-image.appspot.com/lecture/main.png'

import data from '../data.json';

import Card from '../components/Card';

import Loading from '../components/Loading';

import { StatusBar } from 'expo-status-bar';

import * as Location from "expo-location";

import axios from "axios"

import {firebase_db} from "../firebaseConfig"

import {

  setTestDeviceIDAsync,

  AdMobBanner,

  AdMobInterstitial,

  PublisherBanner,

  AdMobRewarded

} from 'expo-ads-admob';


export default function MainPage({navigation,route}) {

  //useState 사용법

  //[state,setState] 에서 state는 이 컴포넌트에서 관리될 상태 데이터를 담고 있는 변수

  //setState는 state를 변경시킬때 사용해야하는 함수


  //모두 다 useState가 선물해줌

  //useState()안에 전달되는 값은 state 초기값

  const [state,setState] = useState([])

  const [cateState,setCateState] = useState([])

  //날씨 데이터 상태관리 상태 생성!

  const [weather, setWeather] = useState({

    temp : 0,

    condition : ''

  })


  //하단의 return 문이 실행되어 화면이 그려진다음 실행되는 useEffect 함수

  //내부에서 data.json으로 부터 가져온 데이터를 state 상태에 담고 있음

  const [ready,setReady] = useState(true)


  useEffect(()=>{

    navigation.setOptions({

      title:'나만의 꿀팁'

    })  

    //뒤의 1000 숫자는 1초를 뜻함

    //1초 뒤에 실행되는 코드들이 담겨 있는 함수

    setTimeout(()=>{

        firebase_db.ref('/tip').once('value').then((snapshot) => {

          console.log("파이어베이스에서 데이터 가져왔습니다!!")

          let tip = snapshot.val();

         

          setState(tip)

          setCateState(tip)

          getLocation()

          setReady(false)

        });

        // getLocation()

        // setState(data.tip)

        // setCateState(data.tip)

        // setReady(false)

    },1000)

 

   

  },[])


  const getLocation = async () => {

    //수많은 로직중에 에러가 발생하면

    //해당 에러를 포착하여 로직을 멈추고,에러를 해결하기 위한 catch 영역 로직이 실행

    try {

      //자바스크립트 함수의 실행순서를 고정하기 위해 쓰는 async,await

      await Location.requestForegroundPermissionsAsync();

      const locationData= await Location.getCurrentPositionAsync();

      console.log(locationData)

      console.log(locationData['coords']['latitude'])

      console.log(locationData['coords']['longitude'])

      const latitude = locationData['coords']['latitude']

      const longitude = locationData['coords']['longitude']

      const API_KEY = "cfc258c75e1da2149c33daffd07a911d";

      const result = await axios.get(

        `http://api.openweathermap.org/data/2.5/weather?lat=${latitude}&lon=${longitude}&appid=${API_KEY}&units=metric`

      );


      console.log(result)

      const temp = result.data.main.temp;

      const condition = result.data.weather[0].main

     

      console.log(temp)

      console.log(condition)


      //오랜만에 복습해보는 객체 리터럴 방식으로 딕셔너리 구성하기!!

      //잘 기억이 안난다면 1주차 강의 6-5를 다시 복습해보세요!

      setWeather({

        temp,condition

      })


    } catch (error) {

      //혹시나 위치를 못가져올 경우를 대비해서, 안내를 준비합니다

      Alert.alert("위치를 찾을 수가 없습니다.", "앱을 껏다 켜볼까요?");

    }

  }


  const category = (cate) => {

    if(cate == "전체보기"){

        //전체보기면 원래 꿀팁 데이터를 담고 있는 상태값으로 다시 초기화

        setCateState(state)

    }else{

        setCateState(state.filter((d)=>{

            return d.category == cate

        }))

    }

}


  //data.json 데이터는 state에 담기므로 상태에서 꺼내옴

  // let tip = state.tip;

  let todayWeather = 10 + 17;

  let todayCondition = "흐림"

  //return 구문 밖에서는 슬래시 두개 방식으로 주석

  return ready ? <Loading/> :  (

    /*

      return 구문 안에서는 {슬래시 + * 방식으로 주석

    */


    <ScrollView style={styles.container}>

      <StatusBar style="light" />

      {/* <Text style={styles.title}>나만의 꿀팁</Text> */}

      <Text style={styles.weather}>오늘의 날씨: {weather.temp + '°C   ' + weather.condition} </Text>

       <TouchableOpacity style={styles.aboutButton} onPress={()=>{navigation.navigate('AboutPage')}}>

          <Text style={styles.aboutButtonText}>소개 페이지</Text>

        </TouchableOpacity>

      <Image style={styles.mainImage} source={{uri:main}}/>

      <ScrollView style={styles.middleContainer} horizontal indicatorStyle={"white"}>

      <TouchableOpacity style={styles.middleButtonAll} onPress={()=>{category('전체보기')}}><Text style={styles.middleButtonTextAll}>전체보기</Text></TouchableOpacity>

        <TouchableOpacity style={styles.middleButton01} onPress={()=>{category('생활')}}><Text style={styles.middleButtonText}>생활</Text></TouchableOpacity>

        <TouchableOpacity style={styles.middleButton02} onPress={()=>{category('재테크')}}><Text style={styles.middleButtonText}>재테크</Text></TouchableOpacity>

        <TouchableOpacity style={styles.middleButton03} onPress={()=>{category('반려견')}}><Text style={styles.middleButtonText}>반려견</Text></TouchableOpacity>

        <TouchableOpacity style={styles.middleButton04} onPress={()=>{navigation.navigate('LikePage')}}><Text style={styles.middleButtonText}>꿀팁 찜</Text></TouchableOpacity>

      </ScrollView>

      <View style={styles.cardContainer}>

         {/* 하나의 카드 영역을 나타내는 View */}

         {

          cateState.map((content,i)=>{

            return (<Card content={content} key={i} navigation={navigation}/>)

          })

        }

       

      </View>

      {/*

        ca-app-pub-5579008343368676/9202552776

        ca-app-pub-5579008343368676/6885179499

      */}

      {Platform.OS === 'ios' ? (

                <AdMobBanner

                  bannerSize="fullBanner"

                  servePersonalizedAds={true}

                  adUnitID="ca-app-pub-1079694147079460/7258825414"

                  style={styles.banner}

                />

            ) : (

                <AdMobBanner

                  bannerSize="fullBanner"

                  servePersonalizedAds={true}

                  adUnitID="ca-app-pub-1079694147079460/7446775091"

                  style={styles.banner}

                />

            )}

   

    </ScrollView>)

}


const styles = StyleSheet.create({

  container: {

    //앱의 배경 색

    backgroundColor: '#fff',

  },

  title: {

    //폰트 사이즈

    fontSize: 20,

    //폰트 두께

    fontWeight: '700',

    //위 공간으로 부터 이격

    marginTop:50,

    //왼쪽 공간으로 부터 이격

    marginLeft:20

  },

weather:{

    alignSelf:"flex-end",

    paddingRight:20

  },

  mainImage: {

    //컨텐츠의 넓이 값

    width:'90%',

    //컨텐츠의 높이 값

    height:200,

    //컨텐츠의 모서리 구부리기

    borderRadius:10,

    marginTop:20,

    //컨텐츠 자체가 앱에서 어떤 곳에 위치시킬지 결정(정렬기능)

    //각 속성의 값들은 공식문서에 고대로~ 나와 있음

    alignSelf:"center"

  },

  middleContainer:{

    marginTop:20,

    marginLeft:10,

    height:60

  },

  middleButtonAll: {

    width:100,

    height:50,

    padding:15,

    backgroundColor:"#20b2aa",

    borderColor:"deeppink",

    borderRadius:15,

    margin:7

  },

  middleButton01: {

    width:100,

    height:50,

    padding:15,

    backgroundColor:"#fdc453",

    borderColor:"deeppink",

    borderRadius:15,

    margin:7

  },

  middleButton02: {

    width:100,

    height:50,

    padding:15,

    backgroundColor:"#fe8d6f",

    borderRadius:15,

    margin:7

  },

  middleButton03: {

    width:100,

    height:50,

    padding:15,

    backgroundColor:"#9adbc5",

    borderRadius:15,

    margin:7

  },

  middleButton04: {

    width:100,

    height:50,

    padding:15,

    backgroundColor:"#f886a8",

    borderRadius:15,

    margin:7

  },

  middleButtonText: {

    color:"#fff",

    fontWeight:"700",

    //텍스트의 현재 위치에서의 정렬

    textAlign:"center"

  },

  middleButtonTextAll: {

    color:"#fff",

    fontWeight:"700",

    //텍스트의 현재 위치에서의 정렬

    textAlign:"center"

  },

  cardContainer: {

    marginTop:10,

    marginLeft:10

  },

  aboutButton: {

    backgroundColor:"pink",

    width:100,

    height:40,

    borderRadius:10,

    alignSelf:"flex-end",

    marginRight:20,

    marginTop:10

  },

  aboutButtonText: {

    color:"#fff",

    textAlign:"center",

    marginTop:10

  },

  banner:{

    width:"100%",

    height:100

  }



});오류 발생 시, 작성한 코드 전체와 에러 메시지를 첨부해 주세요.

Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.

Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!




취소
 공유
취소
댓글 0
댓글 알림
나의얼굴