@jiggag/react-native-kakao-maps
Version:
react native kakao map
200 lines (170 loc) • 11.3 kB
Markdown
## 갑자기 문제가 생겼습니다
### iOS 빌드가 되지 않아요
```shell
❌ ld: symbol(s) not found for architecture x86_64
❌ clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
<details>
<summary>에러 메세지 자세히 보기</summary>
```shell
Undefined symbols for architecture x86_64:
"_sqlite3_bind_blob", referenced from:
mapEngine::ResourceCacheDao::_updateCacheData(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::_insertCacheData(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_bind_double", referenced from:
mapCore::DiskCacheDao::insertEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateAccessTime(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapEngine::ResourceCacheDao::_updateCacheEntity(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::_insertCacheEntity(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::updateAccessTime(mobileToolkit::BasicString const*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_bind_int", referenced from:
mapCore::DiskCacheDao::selectByType(int, bool) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectCleaningList(int, int) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::insertEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::deleteEntitiesByType(int) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::invalidateAllEntries() in DaumMap(DiskCacheDao.o)
mapEngine::ResourceCacheDao::selectCleaningList(int, int) in DaumMap(ResourceCacheDao.o)
...
"_sqlite3_bind_text", referenced from:
mapCore::DiskCacheDao::selectByKey(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::insertEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateAccessTime(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::deleteEntity(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapEngine::ResourceCacheDao::selectCacheEntity(mobileToolkit::BasicString const*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::selectCacheData(mobileToolkit::BasicString const*, mobileToolkit::BasicString*) in DaumMap(ResourceCacheDao.o)
...
"_sqlite3_close", referenced from:
mapCore::DiskCacheDao::_openOrCreateDB() in DaumMap(DiskCacheDao.o)
mapCore::BaseSqliteDao::~BaseSqliteDao() in DaumMap(BaseSqliteDao.o)
mapCore::BaseSqliteDao::open() in DaumMap(BaseSqliteDao.o)
mapCore::BaseSqliteDao::close() in DaumMap(BaseSqliteDao.o)
"_sqlite3_column_blob", referenced from:
mapEngine::ResourceCacheDao::selectCacheData(mobileToolkit::BasicString const*, mobileToolkit::BasicString*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_column_bytes", referenced from:
mapEngine::ResourceCacheDao::selectCacheData(mobileToolkit::BasicString const*, mobileToolkit::BasicString*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_column_double", referenced from:
mapCore::DiskCacheDao::selectByKey(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectByType(int, bool) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectCleaningList(int, int) in DaumMap(DiskCacheDao.o)
mapEngine::ResourceCacheDao::selectCacheEntity(mobileToolkit::BasicString const*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::selectCleaningList(int, int) in DaumMap(ResourceCacheDao.o)
"_sqlite3_column_int", referenced from:
mapCore::DiskCacheDao::selectByKey(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectByType(int, bool) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectCleaningList(int, int) in DaumMap(DiskCacheDao.o)
mapEngine::ResourceCacheDao::selectCacheEntity(mobileToolkit::BasicString const*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_column_text", referenced from:
mapCore::DiskCacheDao::selectByKey(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectByType(int, bool) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectCleaningList(int, int) in DaumMap(DiskCacheDao.o)
mapEngine::ResourceCacheDao::selectCacheEntity(mobileToolkit::BasicString const*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::selectCleaningList(int, int) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::selectDanglingList(mobileToolkit::BasicString*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_errmsg", referenced from:
mapCore::BaseSqliteDao::~BaseSqliteDao() in DaumMap(BaseSqliteDao.o)
mapCore::BaseSqliteDao::open() in DaumMap(BaseSqliteDao.o)
mapCore::BaseSqliteDao::_logError(char const*) in DaumMap(BaseSqliteDao.o)
mapCore::BaseSqliteDao::close() in DaumMap(BaseSqliteDao.o)
mapCore::BaseSqliteDao::_logErrorOnPrepareStatement() in DaumMap(BaseSqliteDao.o)
"_sqlite3_exec", referenced from:
mapCore::DiskCacheDao::_openOrCreateDB() in DaumMap(DiskCacheDao.o)
mapEngine::ResourceCacheDao::_attachDatabase(mobileToolkit::BasicString const*, mobileToolkit::BasicString const*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::updateEntity(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::insertEntity(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::deleteEntity(mapEngine::ResourceCacheEntity const*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_finalize", referenced from:
mapCore::DiskCacheDao::onAfterInitializeDb() in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectByKey(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectByType(int, bool) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectCleaningList(int, int) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::insertEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateAccessTime(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
...
"_sqlite3_free", referenced from:
mapCore::DiskCacheDao::_openOrCreateDB() in DaumMap(DiskCacheDao.o)
"_sqlite3_last_insert_rowid", referenced from:
mapCore::DiskCacheDao::insertEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapEngine::ResourceCacheDao::insertEntity(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_open", referenced from:
mapCore::DiskCacheDao::_openOrCreateDB() in DaumMap(DiskCacheDao.o)
mapCore::BaseSqliteDao::open() in DaumMap(BaseSqliteDao.o)
"_sqlite3_prepare_v2", referenced from:
mapCore::DiskCacheDao::onAfterInitializeDb() in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectByKey(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectByType(int, bool) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectCleaningList(int, int) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::insertEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateAccessTime(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
...
"_sqlite3_reset", referenced from:
mapEngine::ResourceCacheDao::_insertCacheEntity(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
mapEngine::ResourceCacheDao::_insertCacheData(mapEngine::ResourceCacheEntity*) in DaumMap(ResourceCacheDao.o)
"_sqlite3_step", referenced from:
mapCore::DiskCacheDao::selectByKey(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectByType(int, bool) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::selectCleaningList(int, int) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::insertEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateEntity(mapCore::DiskCacheEntity*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::updateAccessTime(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
mapCore::DiskCacheDao::deleteEntity(mobileToolkit::BasicString const*) in DaumMap(DiskCacheDao.o)
...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Undefined symbol: _sqlite3_bind_blob
Undefined symbol: _sqlite3_bind_double
Undefined symbol: _sqlite3_bind_int
Undefined symbol: _sqlite3_bind_text
Undefined symbol: _sqlite3_close
Undefined symbol: _sqlite3_column_blob
Undefined symbol: _sqlite3_column_bytes
Undefined symbol: _sqlite3_column_double
Undefined symbol: _sqlite3_column_int
Undefined symbol: _sqlite3_column_text
Undefined symbol: _sqlite3_errmsg
Undefined symbol: _sqlite3_exec
Undefined symbol: _sqlite3_finalize
Undefined symbol: _sqlite3_free
Undefined symbol: _sqlite3_last_insert_rowid
Undefined symbol: _sqlite3_open
Undefined symbol: _sqlite3_prepare_v2
Undefined symbol: _sqlite3_reset
Undefined symbol: _sqlite3_step
```
</details>
#### 해결방법
`Build Phases > Link Binary With Libraries > libsqlite3.tbd 추가`
------
### iOS 빌드가 되지 않아요
```shell
❌ ld: in /Users/jiggag/react-native-kakao-maps/example/node_modules/@jiggag/react-native-kakao-maps/ios/DaumMap.embeddedframework/DaumMap.framework/DaumMap(HashUtils.o), building for iOS Simulator, but linking in object file built for iOS, file '/Users/jiggag/react-native-kakao-maps/example/node_modules/@jiggag/react-native-kakao-maps/ios/DaumMap.embeddedframework/DaumMap.framework/DaumMap' for architecture arm64
❌ clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
#### 해결방법
`xcode > example.xcworkspace` 열어서 빌드
------
### 지도가 보이지 않아요
[카카오 지도 개발자 문서](https://apis.map.kakao.com/android/guide/#step2)를 참고하여 앱 키 발급 및 키 해시를 등록해주세요
<details>
<summary>안드로이드 키 해시 추출하기</summary>
```shell
keytool -exportcert -alias {key_alias} -keystore {keystore_path} -storepass {store_password} -keypass {key_password} | openssl sha1 -binary | openssl base64
keytool -exportcert -alias androiddebugkey -keystore ./android/app/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
```
</details>
#### 해결방법
발급 받은 앱 키 `strings.xml > kakao_app_key` 교체 및 `앱 설정 > 플랫폼` 키 해시 등록
------
### 안드로이드 에뮬레이터에서 지도를 열면 앱이 크래시 발생해요
```shell
java.lang.UnsatisfiedLinkError
at net.daum.mf.map.n.api.NativeMapLibraryLoader.loadLibrary(NativeMapLibraryLoader.java:39)
...
```
#### 해결방법
- 안드로이드 에뮬레이터(x86, x86_64)에서는 카카오 맵을 지원하지 않고 있습니다. ([관련 이슈 #31](https://github.com/jiggag/react-native-kakao-maps/issues/31#issuecomment-1435983575))
- 실기기를 이용해주세요.