Android ์ฑ์ ๊ฐ๋ฐํ๋ ๋์ 6.1์์ ์คํ์ค์ธ Android ๊ธฐ๊ธฐ์์ ๋๋ฒ๊น
ํ๋ ๋์ geolocation api๋ ํญ์ Location request timed out
๋ฉ์์ง์ ํจ๊ป ์ค๋ฅ ์ฝ๋ฐฑ์ ๋ฐํํฉ๋๋ค.
navigator.geolocation.getCurrentPosition(
(position) => {
console.log(position);
},
(error) => {
console.log(error)
},
{enableHighAccuracy: true, timeout: 20000, maximumAge: 10000}
);
enableHighAccuracy ์ต์ ์ false๋ก ์ ํํ๋ฉด API๊ฐ ์ ๋๋ก ์๋ํฉ๋๋ค. ๊ณ ์ ํ๋ ๋ชจ๋์์ ํ์ ์์์ ํญ์ ํ์ ์์ ์ต์ ์ ์ง์ ํ๋ ํ, ์ฆ 20 ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
๊ฐ๋ฐ ๋ชจ๋๋ฅผ ๋ ์ํ์์ ์คํ ํด ๋ณด์์ต๋๋ค.
Android์์ ๊ณ ์ ๋ฐ ๋ชจ๋๊ฐ ์๋ํด์ผํฉ๋๊น?
@ acapop77 ๊ถํ์ด ๋ค์์ ์ฌ์ฉํ์ฌ ํ์ฑํ๋๋ค๋ ๊ฒ๋ ์ธ๊ธํ๋ ๊ฒ์ ์์์ต๋๋ค.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
RN 0.25.1์์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฐจ์ด์ ์ ์ ์๊ฒ ๋ฌธ์ ๊ฐ ๋๊ณ ๋ฎ์ ์ ํ๋๋ก ์ง์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ง์นจ๋ด ๋๋ ๊ทธ๊ฒ์ด ์๋ํ์ง๋ง ํด๊ฒฐ์ฑ ์ด ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ค์์ ๋๋ฅผ ์ํด ์ผํ ๊ฒ์ ๋๋ค-stock android avd-emulator๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค- 'ํ ๋ฒ๋ง ๊ธฐ๋ฐ'. ์ฑ์ ๋ค์๋ก๋ ํ ๋๋ง๋ค 3-4 ๋จ๊ณ๋ฅผ ๋ค์ ์ํํด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋ ์ด๋ ๊ฒํ๋ฉด Geolocation์ด ์๋ํ๊ณ ์๊ฐ ์ด๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
0.24์์ ๋น์ทํ ๊ฒ์ ๊ฒฝํํ๊ณ ์์ต๋๋ค. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
์ด ๋ด AndroidManifest.xml์ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋นจ๊ฐ์ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค.
"์ฑ์ ์์น ์ก์ธ์ค ๊ถํ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์ ์ค์ ์ถ๊ฐํ์ธ์ ..."
์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋์ ์ฅ์น์ ์ง์ ๋น๋ํฉ๋๋ค.
ํธ์ง-0.25.1์์๋ ๋ฐ์ํฉ๋๋ค.
@ acapop77 @rossthedevigner ์ ๋ ๋ํ ์ผ์ฑ S6 ์ฅ์น์ ์ง์ ๊ตฌ์ถํ๊ณ ์์ต๋๋ค.
@Findiglay ์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค. ์๋ .apk ์ค์น๋ฅผ ์๋ํ์ง๋ง ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๊ถํ ๋งค๋ํ์คํธ๋ฅผ ๋ฐ๋ณตํ๊ณ android.permission.ACCESS_FINE_LOCATION
๊ฐ ํ์ฑํ๋์ด ์๋์ง ํ์ธํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ํ๊ณ ์์ต๋๋ค.
navigator.geolocation == ์ ์๋์ง ์์ ์ฌ๋์ด ์์ต๋๊น?
ํ์ฌ ๋ด ๊ธฐ๊ธฐ์์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ์๋ณด๊ณ ๋๋ ๋ค์ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด enableHighAccuracy์ ํน์ ๋ฌธ์ ์ ๊ด๋ จ์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ๋ํ ๊ฒฝํ์ด ์์ง๋ง LocationModule.java๋ฅผ ํธ์งํ์ฌ LocationOptions boolean highAccuracy = true;
๋ฅผ ํ๋ ์ฝ๋ฉํ๊ณ ๋ค์ ๋น๋ํ๋ฉด ๋ด ์์น๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐํ๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ฒฐ๊ณผ๊ฐ React-Native geolocation API์์ enableHighAccuracy: false
์ค์ ์ผ๋ก๋ฐ์ ๊ฒฐ๊ณผ์ ๋ค๋ฅธ์ง ์ฌ๋ถ๋ ํ์คํ์ง ์์ง๋ง ์ด๊ฒ์ด highAccuracy ๋ชจ๋์์ ์๋ํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
์ด๊ฒ์ Geolocation API์ LocationModule ์ฌ์ด์ ๋ธ๋ฆฌ์ง์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ณ ์์์ ์๋ฏธ ํ ์ ์์ต๋๊น?
๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. @Findiglay๊ฐ ์ ์ํ ๊ฒ๊ณผ ๋๊ฐ์ด ๋ช ๋ฒ ์์ ํ์ง๋ง ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค.
์ด๊ฒ์ด ์ค์ ์ฅ์น์์ ๋ฐ์ํ๋ ์ด์ ๋ฅผ ์์ญ๋๊น? :(
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ์ฌ RN 0.25.1์ ์ฌ์ฉํ์ฌ ์ค์ ์ฅ์น์์ ์ฑ์ ์คํํ๊ณ ์์ต๋๋ค.
๊ถํ ๋งค๋ํ์คํธ์ ํ์ํ Android ๊ถํ์ ์ด๋ฏธ ์ถ๊ฐํ์์ ์ถ๊ฐํด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ์๊ฐ ์ด๊ณผ.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก Android ์ค์ ์์ '๋ชจ์ ์์น ํ์ฉ'์ ํ์ฑํํ๊ณ GPS๋ฅผ ๋ชจ์ํ๋ ์ฑ์ ์ค์นํ์ต๋๋ค (๋งค์ฅ์์ ๊ฐ์ง GPS ์ฐพ๊ธฐ). ์ต์ํ ์ด๊ฒ์ด ์์ ๋ ๋๊น์ง ๊ฐ๋ฐ์ด ์ฐจ๋จ๋์ง ์์ต๋๋ค.
์ฌ๋ฌ๋ถ,
๋๋ ๊ฐ์ ์ค๋ฅ์ ์ง๋ฉดํ์ง๋ง ๋๋ฃ๋ค๊ณผ ๋ช ๋ฒ์ ์ฌ์๋ ํ์ ์ด์ํ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค (ํ์ง๋ง GPS์ ๋ํด ์๊ฐํ๋ค๋ฉด ์ ์์
๋๋ค).
๋ฌผ๋ฆฌ์ ์ฅ์น๋ฅผ ์ฌ์ฉํ์ฌ "์ฌ๋ฌด์ค ๋ด๋ถ" ํ ์คํธ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ GPS ๋ก์ผ์ดํฐ๋ ๋ฒฝ๊ณผ ๊ฐ์ ์ธ๋ถ ๋ฌผ์ฒด ๋๋ "์ค๋ด"์์์ด ์์ ์ ์ํํ๋ ค๋ ๊ฐ๋จํ ์ด์ ์ ์ํด ๋ฐฉํด๋ฅผ๋ฐ์ ์ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ค์ธ์์ ์คํํด์ผํฉ๋๋ค. .
๊ทธ ํ ์ฌ๋ฌด์ค์์ ๋๊ฐ์ ํ ์คํธ๋ฅผ ๋ค์ ์คํํ๊ณ ์ฅ์น๊ฐ ๊ณํ๋๋ก ์๋ตํฉ๋๋ค (์์ฒญ ์๊ฐ ์ด๊ณผ ์ค๋ฅ๊ฐ ์์ ๋์ง ์์).
๋ด ์ ์์ "enableHighAccuracy"๋ฅผ true๋ก ์ค์ ํ์ฌ ์ง๋ฆฌ์ ์์น๋ฅผ ์๋ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์คํจํ๋ฉด (์ฌ๋ฌด์ค์์๋ ์คํจ ํ ์ ์์) false๋ก ๋ค์ ์๋ํ์ญ์์ค. ์ ๊ฒฝ์ฐ์๋ ์๋ํฉ๋๋ค.
์ด๊ฒ์ด ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
+1
enableHighAccuracy
์ด true
๋๋ false
๋ก ์ค์ ๋์ด ์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
GenyMotion ์๋ฎฌ๋ ์ดํฐ์์๋ ์๋ํ์ง๋ง ์ค์ ์ฅ์น์์๋ ์๋ํ์ง ์์ต๋๋ค (์ผ์ฑ, Nexus, Mi์์ ํ
์คํธ ๋จ).
AndroidManifest.xml์์ ์ฌ์ฉ ๊ถํ
์ํธ:
navigator.geolocation.getCurrentPosition(
(position) => {
console.log(position);
},
(error) => console.log(new Date(), error),
{enableHighAccuracy: true, timeout: 10000, maximumAge: 3000}
);
enableHighAccuracy
์ true
๋๋ false
์ค์ ํด๋ ์๋ํ์ง ์์ต๋๋ค.
๋ค์ดํฐ๋ธ ๋ชจ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด getCurrentPosition
์ ๋ํ ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ตํ๋ฉด ์ ์๊ฒ ํจ๊ณผ์ ์
๋๋ค.
LGE Nexus 5 (Android 6.0)์์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
Android 5.1.1 ๋ฐ 4.3์์๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Android 6.0์ ์ฌ์ฉํ๋ ์๋ฎฌ๋ ์ดํฐ์์๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
boolean highAccuracy = false;
๋ ์๋ํ์ง ์์ต๋๋ค.
RN 0.28.0.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ์์ ์์ ์ฌํญ์ ์ฐพ์์ต๋๋ค-์ด ํจํค์ง https://github.com/lucasferreira/react-native-android-permissions
์ด์ ๋ํ ์ ๋ฐ์ดํธ ๋๋ ์์ ์ฌํญ์ด ์์ต๋๊น? ์ ํ ์๊ฐ์ด ์ง๋๋ฉด ์๋ฎฌ๋ ์ดํฐ์ 5.0 ์ด์ ์ฅ์น์์ ๋ชจ๋ ๊ฒ์ด ์ ์๋ํ๋ฉฐ ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฑ์ ๋ํ ์์ ์ด ์ ์คํ ํ์ํฉ๋๋ค!
+1
์ด ๋ฌธ์ ๋ ์ฅ์น์ locationMode ์ค์ ์ ์ํฅ์๋ฐ์ต๋๋ค. ์์น ๋ชจ๋๊ฐ ๋์ ์ ํ๋ ๋๋ ์ฅ์น ์ ์ฉ์ผ๋ก ์ค์ ๋๋ฉด ์์น ์ ๋ณด ์๊ฐ์ด ์ด๊ณผ๋ฉ๋๋ค. ์์น ๋ชจ๋๊ฐ ๋ฐฐํฐ๋ฆฌ ์ ์ฝ์ผ๋ก ์ค์ ๋๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
๋๋ ๋๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช์๊ณ , ํํธ๋ฅผ ์ทจํ๊ณ ์ธ ๋ฒ์งธ ์ฃผ์ฅ์ ์ ๊ฑฐํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์๋ํฉ๋๋ค.
navigator.geolocation.getCurrentPosition(
(position) => {
console.log(position);
},
(error) => console.log(new Date(), error),
{enableHighAccuracy: true, timeout: 10000, maximumAge: 3000} //removed this
);
๋๋ ์ด๊ฒ์ด ๊ด๋ จ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค : https://productpains.com/post/react-native/add-android-m-permissions-model-support
๊ถ๋ฆฌ?
์์น ์๊ฐ ์ด๊ณผ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
์, ๋ฐฉ๊ธ ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ์์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์์ง ๊ธฐ๊ธฐ๋ฅผ ์์ ํ ํ ์คํธํ์ง๋ ์์์ง๋ง ๊ธฐ๊ธฐ ๋ชจ๋๊ฐ ๋์ ์ ํ๋ ๋๋ ๊ธฐ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ๋ Android ๋ฒ์ 22๋ ์ค์ ์ ๊ด๊ณ์์ด ์ธ ๋ฒ์งธ ์ธ์๊ฐ ํฌํจ๋๋ฉด ์์น๊ฐ ์๊ฐ ์ด๊ณผ๋๋ ์์ธ์ด๋๋ ๊ฒ ๊ฐ์ต๋๋ค. Android ๋ฒ์ 23์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Android ๋ฒ์ 23์ enableHighAccuracy
๊ฐ false
( true
์ธํด ์์น๊ฐ ์๊ฐ ์ด๊ณผ ๋จ)๋ก ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์ธ ๋ฒ์งธ ์ธ์๋ก ์๋ํ๋ค๋ ์ ์ ์ ์ธํ๋ฉด ๋์ผํ ๊ฒฝํ์
๋๋ค. ๋ํ Android ๋ฒ์ 22, 21, 20 ๋ฐ 19์์ ํ
์คํธ๋์์ผ๋ฉฐ ์ธ ๋ฒ์งธ ์ธ์๊ฐ ์์ผ๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๊ทธ ์ฃผ์ฅ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ ์ผํ ํด๊ฒฐ์ฑ
์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์ ๊ฑฐํ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ์๋ฃ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ "์์น ์์ฒญ ์๊ฐ ์ด๊ณผ"ํ์
์ด ์ฆ์ ํ์๋ฉ๋๋ค. enableHighAccuracy
์ false๋ก ์ค์ ํด๋ ์๋ํ์ง ์์ต๋๋ค.
๋ด ์๋ฎฌ๋ ์ดํฐ์์ ์์น๋ ์๋ฎฌ๋ ์ดํฐ ์ค์ ์ ์ด๊ณ ์์น๋ฅผ ๋ณด๋ผ ๋๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค (์คํฌ๋ฆฐ ์ท ํ์ธ).
์๋์ผ๋ก๋ฐ์ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ ๊ฒฝ์ฐ์๋ enableHighAccuracy
์ false
ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
์๋ฎฌ๋ ์ดํฐ์ ์ฅ์น ๋ชจ๋์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ enableHighAccuracy์ ๋ํด true ๋ฐ false๋ก ์๋ํ์ต๋๋ค.
"์ ์๋์ง ์์ ๊ฒ์ ๊ฐ์ฒด๊ฐ ์๋๋๋ค ( 'navigator.geolocation.getCurrentPosition'ํ๊ฐ)."
true๋ฅผ ๋ฐํํ๋์ง ํ์ธํ๋ ค๊ณ ์๋ํ์ต๋๋ค.
๊ทธ๋ฌ๋ if (navigator.geolocation)๋ false๋ฅผ ๋ฐํํ์ต๋๋ค.
๋ํ Android 5.1 OnePlus One์ ๊ธฐ๊ธฐ์์์ด ์์ ์ ์ํํฉ๋๋ค. ๊ฐ๋ฐ์ ๋ชจ๋ ํ์ฑํ, AndroidManifest ๊ถํ ํฌํจ, ๋ชจ์ ์์น ์ผ๊ธฐ / ๋๊ธฐ, ๋ชจ๋ ๊ฒ.
๋ํ ์ฅ์น์ ์ฑ๊ณผ Mac์ ์ถ๋ ฅ ํด๋๋ฅผ ์ญ์ ํ์ง๋ง ์์น ๊ถํ์ ์์ฒญํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
React Realm์ ์ฌ์ฉํ๊ณ ์๊ณ ํฌ๋กฌ ์๊ฒฉ ๋๋ฒ๊ฑฐ๋ฅผ ์์ ํ ๋ง๊ฐ ๋จ๋ฆฌ๋ ํฐ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์๊ฒฉ์ผ๋ก ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
๋๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ์๋๋ฐ, ์ฑ์ด ํญ์ ์๊ฐ ์ด๊ณผ๋์ง๋ ์์ง๋ง ๋ค๋ฅธ ์์น ์ ๋ณด ์ฑ์ด RN์ด์๋ ์์น ์ ๋ณด๊ฐ ๋งค์ฐ ์ข์ง ์์ ๋๋ง๋ค ์ ์๋ํ๋ฉด ๋ง์ด ์ํํฉ๋๋ค.
๋๋ RN 0.32๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง ๋ชจ๋ ๋ฒ์ ์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๋ค ์ด์ ๋ก RN์ ์์น ์ ๋ณด๋ ๋งค์ฐ ์ด์ํ๊ณ ๊ฐ๋ํฉ๋๋ค (์ ์ด๋ Android์์๋)
์ค์ ์ฅ์น์์ ํ ์คํธํ๋ ๋์ผํ ๋ฌธ์ ์ ๋๋ค.
์ด๊ฒ์ ๋ถ๋ชํ๋ฉด ์ ๋ง ์ง์ฆ๋ฉ๋๋ค : /
Android 6.0์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
+1
ํด๊ฒฐ์ฑ ์ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐํ์ง ์๊ณ Android ๋ฒ์ > = 23์์ ์์ ๋งํฌ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (https://github.com/lucasferreira/react-native-android-permissions)๋ฅผ ์ฌ์ฉํ์ฌ Android M ๊ถํ์ ์์ฒญํ๋ ๊ฒ์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ฐฉ๊ธ ๋ฐ๊ฒฌ ๋ PermissionsAndroid๊ฐ ์ด์ RN์ ์ถ๊ฐ๋์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ์ฌ์ฉํ์ฌ android> = 23
https://facebook.github.io/react-native/docs/permissionsandroid.html
ํ์ง๋ง ๋ด ๊ธฐ๊ธฐ์ Android 5.1.1์ด ์์ต๋๋ค. ์ด Android v.์์๋ Geolocation์ด ์ ๋๋ก ์๋ํด์ผํฉ๋๋ค.
23์ 6.0 ์ด์์ ๋๋ค. ๋ํ ๋ชจ๋ ์์ ์ ์ํํ๊ธฐ ์ํด ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐํ์ง ์์๋๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์๋์ํฌ ์ ์์์ง๋ง ๋น์ ์๊ฒ๋ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ต์ ๋ฒ์ ์ RN (Mine์ 0.32.1)์๋ MainApplication.java (MainActivity.java ์ธ์)๋ผ๋ ํ์ผ์ด ํฌํจ๋์ด ์์ต๋๋ค. React Native Mapbox GL Docs๋ ReactNativeMapboxGLPackage๋ฅผ MainActivity.java์ ํฌํจํด์ผํ๋ค๊ณ ๋งํ๊ณ ์์ง๋ง MainApplication.java์์ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.
MainApplication.java
`. . .
<strong i="8">@Override</strong>
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new ReactNativeMapboxGLPackage()
);
}
};
`
๊ทธ๋ฆฌ๊ณ MainActivity.java๋ ํญ์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค.
๋ด Android ๋ฒ์ ์ 23์ด๋ฏ๋ก ์ฌ์ ํ ๋งค๋ํ์คํธ xml์ ๊ถํ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ฅ์น์์ GPS๋ฅผ ํ์ฑํํ๋ฉด ์ฑ์ด ์์น๋ฅผ ์ ๋ฐํํ์ง๋ง ๋๋ฉด ์์น ๋ฐํ : error: No available location provider.
์ฅ์น๋ฅผ ํ์ฑ GPS ์์น๋ก ๊ฐ์ ์ค์ ํ๋ ค๋ฉด ์ด๋ป๊ฒํฉ๋๊น?
์ด๊ฒ์ ๋ฏธ์น ์ง์ด๋ค = /
์ง๋ ๋ช ์ฃผ ๋์ Genymotion Android ์๋ฎฌ๋ ์ดํฐ์์ getCurrentPosition
์์
์ํ์ง๋ง ์ง๊ธ์ ๋ค์ ์คํจํฉ๋๋ค.
Genymotion์ GPS ์์ ฏ์ ์ฌ์ฉํ์ฌ ์์น๋ฅผ ์ค์ ํ๊ณ ์์ต๋๋ค. ์๋ฎฌ๋ ์ดํฐ์ Google์ง๋๋ฅผ ์ค์นํ๋๋ฐ Google์ง๋์์ ๋ด ์์น๋ฅผ ์ ์ฝ์ ์ ์์ต๋๋ค.
ํ์ํ ๋ชจ๋ ๊ถํ์ด ์์ผ๋ฉฐ @sattaman์ด ์ ์ํ PermissionsAndroid
๋ชจ๋๋ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ธ์ ๊ฐ๋ ์๋ํ๊ณ ๋ค์ ๋ ์๋ ์๋ํ์ง ์๋๋ค๋ ์ ์์ ๋์์ด ๊ฒฐ์ ์ ์ด์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
๋๋ RN 0.31์ ์ฌ์ฉ ์ค์ด๋ฉฐ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ์ ์๊ฒ๋ ํจ๊ณผ์ ์ด์์ต๋๋ค! ์ค์ ๊ธฐ๊ธฐ, Nexus 5X, Android 6.
RN 0.34.1์์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
enableHighAccuracy๋ฅผ false๋ก ์ค์ ํ๋ฉด์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๋ค.
RN 0.32์์ ๋์ ๋์ผํ ๋ฌธ์ , Android 22 ๋ฐ 23์์ ์๋,
enableHighAccuracy๋ฅผ true ๋๋ false๋ก ์ค์ ํ๋ฉด ๋์๊ฒ ์ ํฉํ์ง ์์ต๋๋ค.
์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ์ฆ์ "์์น ์์ฒญ ์๊ฐ ์ด๊ณผ"๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ด ์ฅ์น๋ฅผ ๋ค์ ์์ํ๋ฉด ์๋ํ์ง๋ง ์ ์ ํ ์์๋ฉ๋๋ค.
์ด์ ์ฌ์ฉ์ ์์น๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ญ์์ค.
https://github.com/mauron85/react-native-background-geolocation
@acondense ์์น ๊ธฐ๋ฅ์ ์คํํ์ง ์๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ background-geolocation์ ๋ํ ์ฝ๋๋ฅผ ์ด๋์ ์ค์ ํฉ๋๊น?
Android 23 ๋ฐ 24์์ RN 0.35์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง Android 22์์๋ ์ ์๋ํฉ๋๋ค.
Android 6.0 ๋ฐํ์ ๊ถํ ์์คํ
๊ณผ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค.
http://stackoverflow.com/questions/32224534/access-fine-location-permission-error-emulator-only
์ด ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ ์๋ํฉ๋๋ค!
https://github.com/yonahforst/react-native-permissions
์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ๋์๊ฒ๋ ์์ ๋์์ต๋๋ค .๐ฏ ๐ฏ ๐ฏ
์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ๐
์ฒ์๋ถํฐ ๋ชจ๋ ์ฌ๋๋ค์ด ์ด๋ค ๋งค๊ฐ ๋ณ์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋์ง, ๋ฉ์๋ ๋งค๊ฐ ๋ณ์ ๋ ์ต์ ๊ฐ์ฒด์ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๊ฐ ๋ช ํํ์ง ์์์ต๋๋ค.
์ ํํ ๋งํ๋ฉด getCurrentPosition
๋ฉ์๋์ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์์ด๋ฉฐ ๋์๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
navigator.geolocation.getCurrentPosition(
(position) => {
...
},
(error) => alert(error.message)
)
๋ง์ง๋ง์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์๋ฃจ์ ์ ์ ๊ณตํ์ต๋๋ค (์์์ ์ค๋ช ํ ๊ฒ๊ณผ ๋์ผํ ์์ด๋์ด).
export const detectCurrentLocation = (successCallback, errorCallback) => {
let navigatorOptions = {}
if (Platform.OS === 'android' && Platform.Version === 23) {
navigatorOptions = {
enableHighAccuracy: false,
timeout: 10000,
maximumAge: 0
}
}
navigator.geolocation.getCurrentPosition(
position => successCallback(detectedLocation),
error => errorCallback(error),
navigatorOptions
)
}
๊ธฐ๊ธฐ์์ ์๋ํ์ง๋ง (Android 21, 22 ๋ฐ 23์์ ํ ์คํธ ๋จ) Android 23์ ๊ฒฝ์ฐ 5 ~ 10 ์ด๋ก ๋งค์ฐ ๋๋ฆฝ๋๋ค.
๋ฐ์ ๋ค์ดํฐ๋ธ (Android ์ฉ Java ์ฝ๋์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ)์์์ด ๋ชฉ์ ์์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก LocationServices.FusedLocationApi๋ฅผ ์ฌ์ฉํ ์ฌ๋์ด ์์ต๋๊น?
enableHighAccuracy: true
์ (๋) Android์์ ์ ํ ์๋ํ์ง ์์ต๋๋ค.
์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ Android 6์์ ์์น ๊ถํ์ ํ์ธํ๊ณ ์์ต๋๋ค.
requestLocationPermission = async () => {
try {
const granted = await PermissionsAndroid.requestPermission(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
'title': 'Enable location',
'message': 'Location is good \o/',
},
);
if (granted) {
console.log('You can use the location');
this.getLocation();
} else {
console.log('Location permission denied');
}
} catch (err) {
console.warn(err);
}
};
@sibelius ์ด๊ฒ์ Location request timed out
์ค๋ฅ๋ฅผ ๋ฐฉ์งํฉ๋๊น?
๋ด ์ค ๋ํซ๊ณผ ์ด๊ฒ๋ ์ฌ์ฉ ํ์ญ์์ค https://github.com/facebook/react-native/issues/7495#issuecomment -259753488
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ง ์์ต๋๊น? ๋๋์ด ์ค๋ ๋์์ ๋ชจ๋ ๊ฒ์ ์ ๋์ ์ผ๋ก ์๋ํ์ง๋ง ์๋ฌด๊ฒ๋ ์๋ํ์ง ์์ต๋๋ค. ์ฆ์ ๋๋ ๋ช ์ด ํ์ ํญ์ ์๊ฐ ์ด๊ณผ ์ค๋ฅ์ ๋๋ค.
์ฌ๊ธฐ์์ @sattaman ์ฃผ์์ ๋ด ์ฅ์น์
enableHighAccuracy
๋นํ์ฑํํ๊ฑฐ๋ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์๋ตํ๋ฉด ํจ๊ณผ๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์์น๋ ์ฌ์ ํ ๊ฝค ์ ํ ํด ๋ณด์
๋๋ค.
iOS์์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. (RN 0.39)
RN 0.40 ๋์ผํ ๋ฌธ์ . ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
(๊ทธ๋ฌ๋ ๋น์ ์ ๋์ ์ ํ๋๋ฅผ ์ป์ง ๋ชปํฉ๋๋ค)
์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ๊ฐ์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
์๋ฎฌ๋ ์ดํฐ์์ enableHighAccuracy: true
๋ฅผ ์ค์ ํ๊ณ ์์น ๋ชจ๋๊ฐ ๋์ ์ ํ๋๋ก ์ค์ ๋์๋์ง ํ์ธํด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ฐ์ด ์ด๊ณผ๋ฉ๋๋ค. ์ด๋ค ์ํฉ์์๋ ์๋ํ๋๋ก ์๋ฎฌ๋ ์ดํฐ์์ ๋ฐฐํฐ๋ฆฌ๋ฅผ ์ ์ฝ ํ ์ ์์ต๋๋ค.
์ฅ์น์์๋ ์ต์ ์ ์ ํ ์ ๋ฌํ์ง ์์ต๋๋ค. ๋ด๊ฐ ๊ฐ์ง ๊ฒ์ฒ๋ผ ์ด๊ฒ์ผ๋ก ์ด๋ ค์์ ๊ฒช๊ณ ์๋ค๋ฉด ์ค์ ์ฅ์น์์ ์๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Pixel C (Android 7.1) ๋ฐ Note 4 (Android 6.0.1)์์ ํ ์คํธํ์ต๋๋ค.
iOS์์๋ ๋์ ์ ํ๋๋ฅผ True๋ก ์ค์ ํด์ผํ์ต๋๋ค. ์ด ์์ ์์ ๋ด ์์น ์ฐพ๊ธฐ ๊ธฐ๋ฅ์ ์์ํ ์ ์์ต๋๋ค.
RN 0.40์์ ์์ ์ค์ด๋ฉฐ ์ค์ ์ฅ์น (Nexus 5)๋ฅผ ์ฌ์ฉ ์ค์ด๋ฉฐ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ชจ๋ ์๊ฒฌ์์ ๋ฌด์์ด๋ ์๋ํ์ต๋๋ค.
์ฌ๊ธฐ์ ์ธ๊ธ๋์ง ์์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ฌ๋์ด ์์ต๋๊น?
// ์ ๋ฐ์ดํธ :
navigator.geolocation.watchPosition
์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ navigator.geolocation.getCurrentPosition์ด ์์ ๋ ๋๊น์ง์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ ์ผ ์ ์์ต๋๋ค.
์ง๊ธ์ ๋์ ์ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์ ๋ค์ดํฐ๋ธ ๋ชจ๋์ ์์ฑํ๊ณ ๋ค์ดํฐ๋ธ API์ ์ง์ ๋ํ ํ ๊ฒ์
๋๋ค.
RN์ ์์น ์ ๋ณด API๋ ํ์ฌ ๋ถ์์ ํด ๋ณด์
๋๋ค.
๋ด ํ๋ก์ ํธ์์ ๋ช ๊ฐ์ง ๊ท์น์ ์์ ๋์ต๋๋ค.
enableHighAccuracy: true
getCurrentPosition์enableHighAccuracy: true
๋ฅผ getCurrentPosition์ผ๋ก ์ค์ ํด์ผํฉ๋๋ค.์ด ๋ ๊ฐ์ง ๊ท์น์ ๋ฐ๋ผ ๋ด ํ๋ก์ ํธ์์ ๋ชจ๋ ๊ฒ์ด ์ ์๋ํฉ๋๋ค.
@kimochg ํ ์คํธ ์ค์ ์ ๋ฌด์์ ๋๊น?
๋ด ํ
์คํธ์์ ์์น์ ๋ํ ์ฅ์น ์ค์ ์ ์ฅ์น๋ก๋ง ์ค์ ํ๋ฉด ์ง๋ฆฌ์ ์์น enableHighAccuracy
๊ด๊ณ์์ด ๋งค๋ฒ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฅ์น ์ค์ ์ ๋์ ์ ํ๋๋ก ์ค์ ํ๋ฉด enableHighAccuracy
์ค์ ์ ๊ด๊ณ์์ด ์ ํจํ ์์น๊ฐ ์ ๊ณต๋ฉ๋๋ค.
ํธ์งํ๋ค
๋๋ฅผ ์ํด Geolocation์ enableHighAccuracy: false
๋ฐ ์ฅ์น ์์น ์ค์ ์ ๋์ ์ ํ๋๋ก ์ค์ ํ ๊ฒฝ์ฐ์๋ง ์๋ก์ด ์์น๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ ๊ฐ์ต๋๋ค. enableHighAccuracy: true
ํ๋ฉด ์บ์ ๋ ์์น๋ฅผ ๊ฐ์ ธ ์ค์ง๋ง ์ ๊ฐ์ ธ ์ค๊ธฐ๋ ์๊ฐ ์ด๊ณผ๋ฉ๋๋ค.
์ด๊ฒ์ React Native 0.40์ ์์ผ๋ฉฐ Android 7.1.1์ ์คํํ๋ Nexus 5X์์ ํ ์คํธ๋์์ต๋๋ค.
@kulmajaba some as you React Native 0.40, Android 7.1.1์ ์คํํ๋ Nexus 5X์์ ํ
์คํธ
ํ์ง๋ง ์ฌ๊ธฐ์ ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ, ์ค์ ์๋๋ก์ด๋ ์ฅ์น๊ฐ ์๋๋๋ค.
์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
์๋ฎฌ๋ ์ดํฐ ์ค๋ฅธ์ชฝ ๋ฐ์ 'Extended controls'๋ฒํผ์ ํด๋ฆญํ๊ณ GPS ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๊น?
( '...'๋ฒํผ)
@kimochg ์ข์์. ํ ์คํธ๋ฅผ ์ํด ์ค์ ์ฅ์น๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋ค์์ ํ๋ก์ ํธ์์ ์์ ํ ๋ ์๋ฎฌ๋ ์ดํฐ ๋์๊ณผ ์๋ฎฌ๋ ์ดํฐ ๋์์ ๋น๊ตํด์ผํฉ๋๋ค.
@Ascendance @ Daniel-ltw ๋๋์ด ์ค๋ ๋์ ๋ชจ๋ ์๋ฃจ์
์ ๋ฐ๋๊ณ ๋๋ ค์ด navigator.geolocation ์ ์๋์ง ์์ ๋ฌธ์ ๋ฅผ ํ๋ค ์ ์์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ navigator
.
๋ด๊ฐ ๋์์จ ๋ด์ฉ์ โโ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
_attachGesture
_cleanScenesPastIndex
_clearTransformations
_completeTransition
_deltaForGestureAction
_detachGesture
_disableScene
_disableTVEventHandler
_doesGestureOverswipe
_eligibleGestures
...
๊ทธ๋ฐ ๋ค์ ์ด๊ฒ์ด Navigator ๊ตฌ์ฑ ์์์์ ์ค๋ ๊ฒ์์ ๊นจ๋ฌ์์ต๋๋ค. ๊ฒฝ๋ก๋ฅผ ๋ ๋๋ง ํ ๋ (route, navigator)
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค๋น๊ฒ์ดํฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ค์ ๋ก๊น
ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
appCodeName
appName
appVersion
geolocation (...)
get geolocation
getValue()
set geolocation
setValue(newValue)
hardwareConcurrency
์ด๊ฒ์ด ๋ค๋ฅธ ์ฌ๋์ ๋์ธ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ๊นจ๋ซ๋ ๋ฐ ์ฌํ ์๊ฐ์ ๋ณด๋์ต๋๋ค. : /
@kulmajaba maximumAge
๋งค๊ฐ ๋ณ์๋ ์ ์๊ฒ ์บ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. 0์ผ๋ก ์ค์ ํ๋ฉด ํญ์ ์ ์์น๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์๊ฐ ์ด๊ณผ ๋ฌธ์ ๋ก ์ด๋ ค์์ ๊ฒช๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด, @RoBYCoNTe ๊ฐ ์์์ ์ง์ ํ๋ฏ์ด, ํนํ ์ค๋ด์์ ๋์ ์ ํ๋์ GPS ํตํ๊ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค๋ ๊ฒ์ ์ฝ์์ต๋๋ค (1 ๋ถ ์ด์).
์ฒ์๋ถํฐ ๋์ ์ ํ๋์ ํธ์ถ์ ์์กดํ๋ ๊ฒ์ด ์ต์ ์ด ์๋ ์ ์์ผ๋ฉฐ, ๋ฎ์ ์ ํ๋์ ํธ์ถ์ ๋จผ์ ๋ฐ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์ ์ ํ๋์ ํธ์ถ์ ์์ํ๋ ๊ฒ์ด ๋ ๋์ ๋ฐฉ๋ฒ ์ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ก ๊ทํ์ ํ์์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ, ์ ํ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ๋ชจ๋ ์ฌ๋์์ํ ๊ฒ์ ์๋๋๋ค. :)
๋ํ RN์ด ์ง๋ฆฌ์ ์์น์ ๋ํ ์น ์ฌ์์ ํ์ฅํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ http://stackoverflow.com/questions/3752383/geolocation-is-so-slow-what-im- ๋ผ๋ ์ ์ ํ ์ด๋ฆ๊ณผ ๊ฐ์ด ์น์์ ๊ด๋ จ ๋ต๋ณ์ ์ฐพ์ ์ ์์ต๋๋ค
๋๊ตฌ๋ ์ง ์๋ฆฌ๋ ์๋ฃจ์ ์ ๊ฐ์ง๊ณ ์์ต๋๊น? ์ผ๋ถ ์ฌ์ฉ์๋ ๋ฑ๋ก์ ์ผ๋ถ๋ก ์ธํด ์ง๋ฆฌ์ ์์น๋ฅผ ์ค์ ํด์ผํ๋ฏ๋ก ๋ด ์ฑ์ ๋ฑ๋ก ํ ์๋ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ผ๋ถ Android ๊ธฐ๊ธฐ์์๋ง ๋ฐ์ํ๋ฉฐ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ ๋ฏธ์น๊ฒ ํด. ์ฌ๋๋ค์ด ๋ด ์ฑ์ ๋ณํ 1 ๊ฐ๋ฅผ ์๋์ผ๋ก ์ ๊ณตํ๋ ์ด์ ๋ ์์น ์ ๋ณด๋ฅผ ์ค์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํํํ. >.>
@booboothefool ์ต์
๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ
๊ทธ๋ฆ๋. ๊ฒฐ๊ณผ๋ ํจ์ฌ ๋ ๋น ๋ฆ
๋๋ค.
2017 ๋
2 ์ 20 ์ผ ์์์ผ ์ค์ 9:50 booboothefool [email protected]
์ผ๋ค :
๋๊ตฌ๋ ์ง ์๋ฆฌ๋ ์๋ฃจ์ ์ ๊ฐ์ง๊ณ ์์ต๋๊น? ์ผ๋ถ ์ฌ์ฉ์๋ ๋ด
๋ฑ๋ก์ ์ผ๋ถ๋ก ์ธํด ์ง๋ฆฌ์ ์์น๋ฅผ ์ค์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ๋ฌธ์ ๋ ์ผ๋ถ Android ๊ธฐ๊ธฐ์์๋ง ๋ฐ์ํ๊ณ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ๋ฏธ์น๊ฒ ํด.โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-281142941 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ADJE_BC-osVA45bcpejEI_paDEBykBs1ks5redJtgaJpZM4Ibete
.
@greyvugrin ์๊ฒ ์ต๋๋ค. ์ ๋ฐ์ ์ฌ๋๋ค์ด "3 ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํด์ผํ๊ณ enableHighAccuracy๋ฅผ false๋ก ์ค์ ํ๋ฉด ์๋ํ์ง ์๋๋ค"๊ณ ๋ณด๊ณ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ชจ๋๊ฐ ๋ค๋ฅธ ๋ง์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ์ด๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก : https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions
์ด๊ฒ์ด ๊ธฐ๋ณธ ์ต์
์ธ ๊ฒ ๊ฐ์ต๋๋ค. enableHighAccuracy: false
with timeout: Infinity
, ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ์ด๋ฏธ ๊ทธ๋ ๊ฒํ๊ณ ์์ง ์์ต๋๊น?
@booboothefool ์ด ์ค๋ ๋๊ฐ ํท๊ฐ๋ฆฌ๋ ๊ฒ์ ๋ํด ๋ง์ต๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ฏ์ด ์ต์ ๋งค๊ฐ ๋ณ์๋ฅผ ์๋ตํ๋ ์ฌ๋๋ค์ ์ค์ ์ ๋ค๋ฅธ ๊ฒ์ด ์ฌ๋ฌผ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ ์ ์์ต๋๋ค.
enableHighAccuracy๋ฅผ true ๋๋ false๋ก ์ค์ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
๋ค์ดํฐ๋ธ ๋ชจ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด getCurrentPosition์ ๋ํ ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ตํ๋ฉด ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์ ๋ timeout
์์ต๋๋ค. ์ง๋ฆฌ์ ์์น์ ์ํฅ์ ๋ฏธ์น๋ ๋ง์ ์์๊ฐ ์์ผ๋ฉฐ ์ถฉ๋ํ๋ ์ฌ๋๋ค๋ก๋ถํฐ ๊ฐ๋ฅํ ํ ๋ง์ ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์
๋๋ค.
์ด๋ฏธ ์ต์ ์ ์ ๊ฑฐํ๊ณ RN์ด ์ค์ ๋ก ์น๊ณผ ๋์ผํ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ด์ผํฉ๋๋ค. ์ฌ์ ํ ๋ฌธ์ ๊ฐ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ์์น์ ๋ํ ๊ถํ์ด ํ์ฑํ๋์ด ์๋์ง (์ฑ์์ ํ์ธ ์ค์ธ์ง) ํ์ธํ ์ ์์ต๋๋ค.
์๋ ํ์ธ์ @greyvugrin ,
๊ถํ์ ๋ํ ํฐ ํ์ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ด๊ฐ ๋์น ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. https://github.com/lucasferreira/react-native-android-permissions๋ฅผ ๊ตฌํ ํ ํ ( enableHighAccuracy: false
์ง์ ๊ณผ ํจ๊ป timeout
์ค์ ํ๋ฉด ์ด์ ๋ชจ๋ ์ฌ๋์๊ฒ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด ์ฑ์ Google Play ์คํ ์ด์์ ๋ณ 1 ๊ฐ์์ ๋ชจ๋ ์ฌ๋๋ค์ด ์์น ์ ๋ณด ๋ฌธ์ ๋ก ๋ณ์ 3.6 ์ ์ผ๋ก ์ฌ๋ผ๊ฐ์ต๋๋ค. ํํํ! ๐
@booboothefool ์ ๋ง ์ข์ ์์์ ๋๋ค.
์ฌ๊ธฐ์ ์ ์ ๋ ๋ชจ๋ ์ ๊ทผ ๋ฐฉ์์ ์๋ํ์ต๋๋ค. getCurrentPosition์์ ์๋ฌด๊ฒ๋ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง Android์ ์๋ฎฌ๋ ์ดํฐ ๋๋ ์ฅ์น์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค. watchPosition
์ ์๋ํ์ง๋ง ์ฌ์ฉ์์๊ฒ ์ต๊ณ ์ UX๋ฅผ ์ ๊ณตํ์ง๋ ์์ต๋๋ค. ์ฌ์ฉ์ ์์น๋ ํ ๋ฒ๋ง ํ์ํฉ๋๋ค. GPS๋ฅผ ๋ฐฐํฐ๋ฆฌ๋ฅผ ๋ญ๋น ํ ํ์๊ฐ ์์ต๋๋ค.
๋ ๋ ธ๋ ฅ ํ์ด:
getCurrentPosition
๋ํ ์ ํ ์๊ฐ ๋ณ๊ฒฝ ์์
์ด๊ฒ์ Android Studio Emulator ๊ฐ๋ฐ์๊ฐ ๊ธฐํ๊ฐ์์ ๋ ํฅํ ์์ / ๊ตฌํํด์ผ ํ ์ผ์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๋์ ... ํฐ GPX ํธ๋ ์ผ ํ์ผ์ ๊ฐ์ ธ์ "1x"์๋๋ก ์ฌ์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ GPX๋ฅผ ๊ฐ์ ธ ์์ต๋๋ค ... ExpertGPS.com-> ca-trails.gpx
...์ด ํ์ผ์ "5x"์๋๋ก ์ฝ 8 ๋ถ ๋์ ์ง์๋์์ผ๋ฏ๋ก "1x"์๋์์๋ ์ฝ 40 ๋ถ ๋์ ์ง์๋์ด์ผํฉ๋๋ค (SHOULD).
[...] ํ์ฅ ์ต์ -> ์์น (์ค๋ฅธ์ชฝ ํ๋จ์ GPS / KML๋ก๋ ๋ฒํผ)์๋ก๋ (๋๋ ๋ ํฐ ๋ค๋ฅธ GPX ํ์ผ)๋ฅผ๋ก๋ํ๊ณ ์ฌ์ ๋ฒํผ์ ๋๋ฅธ ๋ค์ ์ฐฝ์ ๋ซ์ต๋๋ค. ๊ณ์ ์ฌ์๋ฉ๋๋ค. ๋๋ ๋๊น์ง. ์ํ๊น๊ฒ๋ ์๋ ๋ฐ๋ณต์ด ์์ต๋๋ค. Android ์คํ๋์ค ํ๋ก๊ทธ๋๋จธ๋ฅผ์ํ ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ์์ฒญ์ ๋๋ค. :-)
๊ทธ๊ฑด ์ฌ์ค์ด ์๋์ผ. ์ค์ ์ฅ์น์์ ๋์ผํ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค.
getCurrentPosition์ ํญ์ ์๊ฐ ์ด๊ณผ๋ฉ๋๋ค. ์๊ณ๊ฐ ์ ์๋ํฉ๋๋ค. Z5, Nexus 5X ํ
์คํธ
& Pixel, getCurrentPosition์ ๋ํ ์ด๊ธฐ ํธ์ถ์ ๋ชจ๋ ์๊ฐ ์ด๊ณผ.
2017 ๋ 3 ์ 4 ์ผ ํ ์์ผ 19:49 Deen Foxx, [email protected] ์์ฑ :
์ด๊ฒ์ Android Studio Emulator ๊ฐ๋ฐ์๊ฐ ํ ์ผ์ ๋๋ค.
๊ธฐํ๊ฐ ์๊ธฐ๋ฉด ๋ฏธ๋์ ์์ / ๊ตฌํํด์ผํฉ๋๋ค.๊ทธ๋ฌ๋ ๊ทธ๋์ ... ํฐ GPX ํธ๋ ์ผ ํ์ผ์ ๊ฐ์ ธ ์์
"1x"์๋๋ก ์ฌ์๋ฉ๋๋ค. ์ฌ๊ธฐ์์ GPX๋ฅผ ๊ฐ์ ธ ์์ต๋๋ค ... ExpertGPS.com->
ca-trails.gpx
https://www.expertgps.com/data/downloading.asp?file=ca/ca-trails.gpx
...์ด ํ์ผ์ "5x"์๋๋ก ์ฝ 8 ๋ถ ๋์ ์ง์๋์์ผ๋ฏ๋ก "1x"์๋๋ก
์ฝ 40 ๋ถ ๋์ ์ง์๋์ด์ผํฉ๋๋ค (SHOULD).๊ทธ๊ฒ์ (๋๋ ๋ค๋ฅธ ์๋ง๋ ๋ ํฐ GPX ํ์ผ)๋ก๋ [...] ํ์ฅ
์ต์ -> ์์น (์ค๋ฅธ์ชฝ ํ๋จ์ GPS / KML๋ก๋ ๋ฒํผ), ์ฌ์
๋ฒํผ์ ๋๋ฅธ ๋ค์ ์ฐฝ์ ๋ซ์ต๋๋ค ... ๋ฒํผ์ ๋๋ฅผ ๋๊น์ง ๊ณ์ ์ฌ์๋ฉ๋๋ค.
์ข ๋ฃ. ์ํ๊น๊ฒ๋ ์๋ ๋ฐ๋ณต์ด ์์ต๋๋ค. Android์ ๋ํ ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ์์ฒญ์ ๋๋ค.
์คํ๋์ค ํ๋ก๊ทธ๋๋จธ. :-)โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-284172310 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AACQ6AoZYXJ02DCmevcLmmF3tuOdg_SEks5ribJHgaJpZM4Ibete
.
getCurrentLocation์ ๋ํ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ์๋ฎฌ๋ ์ดํฐ์์ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
{
timeout: 20000,
maximumAge: 1000
}
๋ฐฉ๊ธ 3 ํจ์ค ๊ฐ๋ฅ์ฑ์ ์ฝ๋ฉํ์ต๋๋ค. ์ฝ๊ฐ์ ๊ณผ์์ผ์ง๋ ๋ชจ๋ฅด์ง๋ง ์ค ์. ๋ค์์ ์ฝ๋ ์ค ๋ํซ (์ฃผ์ ํฌํจ)์ ๋๋ค.
class FindNearMe extends Component {
constructor(props) {
super(props);
this.state = {
prevLatitude: 0.0,
prevLongitude: 0.0,
gotLocation: false,
locating: false,
loading: false
};
}
handleGeolocationSuccess = (position) => {
// Get a response, say we are done locating, even if it is still looking for a fine result.
this.setState({ locating: false });
// If we previously failed, we can clear the error if it just happens to still be visible.
if (!this.state.gotLocation) {
this.props.navigator.hideLocalAlert(); // Hide possibly open alert.
this.setState({ gotLocation: true }); // Remove the previous failure state.
}
// Only proceed if there is an actual change in location.
if (this.state.prevLatitude != position.coords.latitude ||
this.state.prevLongitude != position.coords.longitude) {
// Overwrite the old location with the new location.
this.setState({
prevLatitude: position.coords.latitude,
prevLongitude: position.coords.longitude,
loading: true // Only needed if you plan to get content from server.
});
// ... DO SOMETHING WITH THE UPDATED LOCATION ...
// If you used a callback function (success or failure) be sure to include this...
this.setState({ loading: false });
};
// This first, RoughError, means the "enableHighAccuracy: false" time-out occurred.
handleGeolocationRoughError = (error) => {
this.props.navigator.showLocalAlert('Attempting to pinpoint your location...', config.errorStyles);
// Invalidate our current location
this.setState({ gotLocation: false });
};
// This second, FineError, means the "enableHighAccuracy: true" time-out occurred.
handleGeolocationFineError = (error) => {
// If we got Rough location, I'm ignoring this. But, if neither rough nor fine succeeded...
if (!this.state.gotLocation) {
// ...try once more without the options.
navigator.geolocation.getCurrentPosition(
this.handleGeolocationSuccess,
this.handleGeolocationFinalError
);
}
};
// This last, FinalError, means nothing worked and we're giving up.
handleGeolocationFinalError = (error) => {
if (!this.state.gotLocation) {
this.props.navigator.showLocalAlert('Could not determine your location, sorry!', config.errorStyles);
// Let our app know that we are not trying anymore.
this.setState({ locating: false });
}
};
goToNearMe = () => {
// Track when we are attempting to get a location update.
this.setState({ locating: true });
// Try to get the rough location quickly.
navigator.geolocation.getCurrentPosition(
this.handleGeolocationSuccess,
this.handleGeolocationRoughError,
{
enableHighAccuracy: false,
timeout: 500, // I have this set for half-second before popping up the alert.
maximumAge: 0
}
);
// But, also, simultaneously try to get the fine location.
navigator.geolocation.getCurrentPosition(
this.handleGeolocationSuccess,
this.handleGeolocationFineError,
{
enableHighAccuracy: true,
timeout: 7500, // I have this set for 7.5 seconds, about the length of the first alert's visibility.
maximumAge: 0
}
);
};
render() {
return (
<Container>
<LocateMeButton
onPress={this.goToNearMe}
loading={this.state.loading || this.state.locating}
/>
<Header>
Use Current Location
</Header>
</Container>
);
}
}
export default FindNearMe;
ํ๋ก๋์ ์ด ์๋ ๋ก์ปฌ ๊ฐ๋ฐ ์๋ฎฌ๋ ์ดํฐ์์๋ง ์ด๊ฒ์ ํ ์คํธํ์ต๋๋ค. ์ด๊ฒ์ด ๋์์ด๋์๋์ง ์๋ ค์ฃผ์ธ์.
๋๋ ๋จ์ง ์๊ฐํ๊ณ ์์๋ค ... roughError ํธ์ถ์ด ์ต์ ์ด์๋ ๋ฒ์ ์ ์ฌ์ฉํ๋ค๋ฉด ๊ทธ๊ฒ์ ์๋ง๋ 2 ํจ์ค๋ก ์๋ฒฝํ๊ฒ ์๋ ํ ๊ฒ์ ๋๋ค ...
goToNearMe = () => {
// Track when we are attempting to get a location update.
this.setState({ locating: true });
// Try to get the rough location quickly.
navigator.geolocation.getCurrentPosition(
this.handleGeolocationSuccess,
this.handleGeolocationRoughError,
// Just leave this off entirely (but default timeout is Infinity, so you'd never get the first alert!)...
// {
// enableHighAccuracy: false,
// timeout: 500, // I have this set for half-second before popping up the alert.
// maximumAge: 0
// }
// ...or try ujwal-setlur's method of leaving off the enableHighAccuracy portion...
{
timeout: 500,
maximumAge: 0
}
// NOTE: ujwal-setlur's method did NOT work for my Android emulator.
// I had to comment out the options object completely for it to not time-out.
);
// But, also, simultaneously try to get the fine location.
navigator.geolocation.getCurrentPosition(
this.handleGeolocationSuccess,
// this.handleGeolocationFineError, // Wouldn't need this, make it your FinalError instead.
this.handleGeolocationFinalError,
{
enableHighAccuracy: true,
timeout: 7500, // I have this set for 7.5 seconds, about the length of the first alert's visibility.
maximumAge: 0
}
);
};
๊ทธ๋ฌ๋ฉด ๋ฌธ์ ๊ฐ์๋ Android ํด๋ํฐ์ด ๋ ์ด์ ์ง์ฐ๋์ง ์์ง๋ง ์ฌ์ ํ ๋์ ์ ํ๋๋ฅผ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ์ด์ FineError๊ฐ ํ์ํ์ง ์์ผ๋ฉฐ ํด๋น ์ฝ๋๋ฅผ ์ ๊ฑฐ ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ์ง์ ์ด ์์ต๋๊น?
Alex,์ด ์ค๋ ๋์๋ ๋ช ๊ฐ์ง ํด๊ฒฐ์ฑ
์ด ์์ต๋๋ค. ๋น์ ์ ๋ฌด์์ ์๋ ํ์ต๋๊น? ๊ทธ๊ฒ
๋ ๋ง์ ์ธ๋ถ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ ํฐ์ผ์ ๋ง๋ค ๊ฐ์น๊ฐ ์์ต๋๋ค.
์์ ์๋ฃจ์
์ค ์ด๋ ๊ฒ๋ ์๋ํ์ง ์์ผ๋ฉด์ด ์ค๋ ๋๋ ๋๋ฌด ๊น๋๋ค.
2017 ๋
3 ์ 17 ์ผ ๊ธ์์ผ ์ค์ 10:29 Alex Sinelnikov [email protected]
์ผ๋ค :
์ด๊ฒ์ ๋ํ ์ง์ ์ด ์์ต๋๊น?
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-287419487 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete
.
๋ ๊ฐ์ด. ์์ ์ ์ ์ค ์ด๋ ๊ฒ๋ ์๋ํ์ง ์์ต๋๋ค. ๋๋ฅผ์ํ ์ ์ผํ ํด๊ฒฐ์ฑ
Android์์ ์์น๋ฅผ ํ์ธํ๋ ค๋ฉด ์๊ณ๋ฅผ ์ฌ์ฉํ๊ณ UI๋ฅผ ์
๋ฐ์ดํธํ์ฌ
์ฑ ๊ธฐ๋ฅ์ด locat์ ์๋ตํ๋ฉด ์ฌ์ฉ์์๊ฒ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง. ํ์ง๋ง
getCurrentPosition์ ์ฌ์ฉํ๋ฉด 10 ๊ฐ์ ์ค์ ํ
์คํธ์์ ์๋ํ์ง ์์ต๋๋ค.
๋ค์ํ Android ๋ฒ์ ์ ์คํํ๋ ๊ธฐ๊ธฐ 4+
2017 ๋ 3 ์ 17 ์ผ ๊ธ์์ผ 17:48 Gray Vugrin, [email protected] ์์ฑ :
Alex,์ด ์ค๋ ๋์๋ ๋ช ๊ฐ์ง ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค. ๋น์ ์ ๋ฌด์์ ์๋ ํ์ต๋๊น? ๊ทธ๊ฒ
๋ ๋ง์ ์ธ๋ถ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ ํฐ์ผ์ ๋ง๋ค ๊ฐ์น๊ฐ ์์ต๋๋ค.
์์ ์๋ฃจ์ ์ค ์ด๋ ๊ฒ๋ ์๋ํ์ง ์์ผ๋ฉด์ด ์ค๋ ๋๋ ๋๋ฌด ๊น๋๋ค.2017 ๋ 3 ์ 17 ์ผ ๊ธ์์ผ ์ค์ 10:29 Alex Sinelnikov [email protected]
์ผ๋ค :์ด๊ฒ์ ๋ํ ์ง์ ์ด ์์ต๋๊น?
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
<
https://github.com/facebook/react-native/issues/7495#issuecomment -287419487
,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
<
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete.
โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-287424598 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AACQ6DgWuUzw4hj7rmr8LDzcRHjEheIcks5rmsdSgaJpZM4Ibete
.
๋๋ก๋ ์๋ํ์ง๋ง ์ผ๋ถ๋ ์๋ํ์ง ์์ต๋๋ค. ์์ ๋ชจ๋ ์๋ฃจ์ ์ ์๋ํ์ผ๋ฉฐ ์ง๊ธ๊น์ง ์ ๋ขฐํ ์์๋ ์๋ฃจ์ ์ด ์์ต๋๋ค. ์ด๊ฒ์ ์ ๋ง ๋๋ฅผ ๋ฏธ์น๊ฒ ๋ง๋ญ๋๋ค :(
getCurrentPosition๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ณต์ ํ๋ ๋ค์ดํฐ๋ธ ๋ชจ๋์ด ์์ต๋๊น? Java ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ ์ฅ์๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค.
watchPosition
์ ์์น๊ฐ ํ์ฑํ๋์ง ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. timeout = 1000์ผ๋ก ์ค์ ํ์ง๋ง ์๊ฐ ์ด๊ณผ๋ฅผ ๋์ง์ง ์์ต๋๋ค.
'getCurrentPosition'์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์์น ๋ํ ์์๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ GPS๋ฅผ ํ์ฑํ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด์ ๋ 'getCurrentPosition'์์ ์ด๋ํฉ๋๋ค.
ํธ์งํ๋ค:
๋๋ ๋ชจ๋ ๋ณํ์ ์๋ํ์ผ๋ฉฐ ์ด์ ๋ฌธ์ ๊ฐ ์ด๋์ ์๋์ง ์๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ฒฝ์ฐ์ ์์
์ ํ ์ ์์ต๋๋ค ๋์ ์ ํ๋ ๋๋ ๋ฐฐํฐ๋ฆฌ ์ ์ฝ์ ์ ๊ฑฐ ์ธ๋ฒ์งธ PARAMS ๋ฐ ์์น ์ค์ ๋ชจ๋. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ํ์ง ์์ต๋๋ค. ๊ณต๊ธ ์
์ฒด๋ง๋ค์ด ๋ฉ๋ด์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฅ์น ์ ์ฉ ๋์ ๋์ ์ ํ๋ ๋๋ ๋ฐฐํฐ๋ฆฌ ์ ์ฝ์ ์ ํํ๋๋ก ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์์ enableHighAccuracy: false
์ ์ถ๊ฐํ๋ ์ฃผ์์ด ์์ง๋ง ๋์ ์ ํ๋, ๋ฐฐํฐ๋ฆฌ ์ ์ฝ ๋๋ ์ฅ์น ์ ์ฉ ์ต์
์์๋ ์๋ํ์ง ์์์ต๋๋ค. ์ง๋ฆฌ์ ์์น์ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ์ค์ ์ฅ์น์ ์ธ๋ชจ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๊ฒฝ์ฐ์๋ maximumAge๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
maximumAge ์ ๊ฑฐ
@nigelnindo ๋ค์ดํฐ๋ธ ๊ตฌํ์ด๋ ๋ฌด์์ ๋๊น? RN ๋ด์์ ๋๋ Android์์ ์ง์ ์ํํฉ๋๊น?
Android์์ ์ง์ @ L3V147H4N . ์ด๋ฅผ ์ํด ์ฌ์ฉํ ์์๋ ๋ช ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ง๋ง ๋๋ถ๋ถ์ด ์ต์ ๋ฒ์ ์ RN๊ณผ ํธํ๋์ง ์๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ถฉ๋ถํ ๊ด์ฌ์ด ์๋ค๋ฉด์ด ์ค๋ ๋์ ์ค๋ช ๋ Android์ ์์น ์ ๋ณด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด๋๋ ๊ฐ๋จํ ๋ชจ๋์ ๋ง๋๋ ๋ฐ ์๊ฐ์ ํ ์ ํ์ง ์์๋๋ฉ๋๋ค.
https://github.com/mauron85/react-native-background-geolocation#getlocationssuccess -fail์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๊ธฐ๋ณธ ๊ตฌํ์ด๋ฉฐ ๋์๊ฒ ์ ์๋ํฉ๋๋ค.
์ด ์ค๋ ๋์ ๊ฑฐ์ ๋ชจ๋ ์ฌ๋๋ค์ด @nigelnindo์ ๋งค์ฐ ๊ฐ์ฌ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/nigelnindo
2017 ๋ 4 ์ 3 ์ผ (์) 17:34 Nigel Nindo [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@ L3V147H4N https://github.com/L3V147H4N Android์์ ์ง์ . ์์ต๋๋ค
์ด๋ฅผ ์ํด ์ฌ์ฉํ ์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ช ๊ฐ ์์ต๋๋ค.
์ต์ ๋ฒ์ ์ RN๊ณผ ํธํ๋์ง ์์ต๋๋ค. ์ถฉ๋ถํ๋ค๋ฉด
์ฌ๊ธฐ์ ๊ด์ฌ์ด ์์ต๋๋ค. ๊ฐ๋จํ ๋ชจ๋์ ๋ง๋๋ ๋ฐ ์๊ฐ์ ํฌ์ํด๋ ๊ด์ฐฎ์ต๋๋ค.
์ด ์ค๋ ๋์ ์ค๋ช ๋ Android์ ์ง๋ฆฌ์ ์์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-291198134 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AACQ6BwArzmfCk3TXfiRMp7kpdwMLM81ks5rsR-hgaJpZM4Ibete
.
์ข์ ... navigator.geolocation.getCurrentPosition์ ์ฌ์ฉํ๋ ค๊ณ ํ๋๋ฐ ๊ณ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์น ์์ฒญ ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค. Android์ ๊ฒฝ์ฐ iOS๊ฐ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค.
enableHighAccuracy๋ฅผ True / False๋ก ์ค์ ํ๊ณ ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์ ๊ฑฐํ๊ณ AndroidManifest์์ COURSE ๋ฐ FINE ์์น ๊ถํ์ ๋ชจ๋ ์ถ๊ฐํ์ต๋๋ค.
Android SDK 23, ๋น๋ ๋๊ตฌ 25.0.0
๋ฐ์ 16.0.0-alpha.6
RN 0.43.3
๋น์ ์ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ค๋ ๋ Douglas์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค. getCurrentPosition
์ (๋)
Android์์ ์ ๋ขฐํ ์ ์์ต๋๋ค.
์ค๋ ๋์ ์๋ถ๋ถ์์ ๋ค์์ ์ฌ์ฉํ์ฌ ๋ช ๊ฐ์ง ์๋ฃจ์
์ ์ดํด๋ณด์ญ์์ค.
๋์ watchPosition
๊ฐ์ฌํฉ๋๋ค @raldred.
watchPosition์ด ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์์ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
@douglaswissett ์ฒ๋ง ์์. ๊ณง getCurrentPosition
๋ํ ๊ฐ๋ ฅํ ์๋ฃจ์
์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
watchPosition
๋ค์ clearWatch
์ง๋ฆฌ์ ์์น๋ฅผ ์ป์ ์งํ ์ฌ์ฉํ ์ ์์ต๋๊น? clearWatch
๋ componentDidMount
์์๋ง ํธ์ถ ํ ์ ์๊ธฐ ๋๋ฌธ์์ด ์์
์ ์ํํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@pewh ์. ๊ทธ๊ฒ ๋ด๊ฐํ๋ ์ผ์ด์ผ.
๋ํ navigator.geolocation.clearWatch
๋ ์ธ์ ๋ ์ง ํธ์ถ ํ ์ ์์ต๋๋ค.
watchPosition
์ ๋ํ ํธ์ถ์ ์ํด ๋ฐํ๋๋ ๊ตฌ์ฑ ์์์ watchID์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ์ญ์์ค.
https://facebook.github.io/react-native/docs/geolocation.html ์์ ์ฝ์ ๋ฌธ์์์ watchPosition
์ฝ๋ฐฑ ๋ด์์ this.watchID
๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ
๋๋ค. ๋ด ์ฌ์ฉ ์ฌ๋ก๋ ์ ๊ฐ์๋ฐ์ ์งํ clearWatch
ํธ๋ฆฌ๊ฑฐ์
๋๋ค.
@pewh ์ฌ๊ธฐ ๋ด ๊ตฌํ์
๋๋ค. ์๋ฒฝํ์ง๋ ์์ง๋ง ์๋ํฉ๋๋ค.
https://gist.github.com/raldred/b08cf60712eb87d81f05437444dff4ae
@raldred ๋ ๊ทํ์ ์๋ฃจ์ ์ ์๋ํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์ ์๋ํ์ง ์์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ์ฌ๊ธฐ์์ ๋ชจ๋ ๊ฒ์ ์๋ํ๊ณ ์๋ฌด๊ฒ๋ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์์ฃผ์ธ์! ์ค ๋ํซ ๋ฑ์ ๊ณต์ ํ ์ ์๋ค๋ฉด
@ gerard0315 ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฑ๊ณต ํ์ต๋๊น?
๋๋ฅผ ์ํด ์ค์ ์๋๋ก์ด๋ ํฐ์์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
iOS ์ฉ Outlook https://aka.ms/o0ukef ๋ฐ๊ธฐ
๋ณด๋ธ ์ฌ๋ : Jorge Almonacid [email protected]
๋ณด๋ธ ๋ ์ง : 2017 ๋
5 ์ 9 ์ผ ํ์์ผ ์คํ 2:29:56
๋ฐ๋ ์ฌ๋ : facebook / react-native
์ฐธ์กฐ : Ujwal Setlur; ๋
ผํ
์ ๋ชฉ : Re : [facebook / react-native] Android์ Geolocation 'enableHighAccuracy'๊ฐ ํญ์ ์๊ฐ ์ด๊ณผ ๋จ (# 7495)
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ์ฌ๊ธฐ์์ ๋ชจ๋ ๊ฒ์ ์๋ํ๊ณ ์๋ฌด๊ฒ๋ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์์ฃผ์ธ์! ์ค ๋ํซ ๋ฑ์ ๊ณต์ ํ ์ ์๋ค๋ฉด
โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 ์์ ๋ณด๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/ ์ค๋ ๋๋ฅผ ์์๊ฑฐํฉ๋๋ค.
์คํ์ค์ธ ์ค์ ์ฅ์น์์ ์๋ํ๋ ๋ด ์ค ๋ํซ์ ์ด๋ฏธ ๊ณต์ ํ์ต๋๋ค.
Android 4-7.
2017 ๋ 5 ์ 9 ์ผ ํ์์ผ 22:29 Jorge Almonacid, [email protected] ์์ฑ :
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ์ฌ๊ธฐ์์ ๋ชจ๋ ๊ฒ์ ์๋ํ๊ณ ์๋ฌด๊ฒ๋ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋์์ฃผ์ธ์! ์ค ๋ํซ ๋ฑ์ ๊ณต์ ํ ์ ์๋ค๋ฉดโ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AACQ6HSlN8YS_jE6NY9w2vuk7Hv4Wjwfks5r4NrSgaJpZM4Ibete
.
ํ์ฌ ๋ชจ๋ ๋งค๊ฐ ๋ณ์ (๊ฒฝ๋, ์๋, ๊ณ ๋)๋ฅผ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์๋ง Android ์๋ฎฌ๋ ์ดํฐ์์ ์
๋ฐ์ดํธ๋ฅผ๋ฐ์ ์ ์์ต๋๋ค. ํ๋ ๋๋ ๋๋ง ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ- nothing works
.
React-Native๊ฐ Android์์ ์์น๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์๋ ๋ณธ์ง์ ์ธ ๊ฒฐํจ์ด ์์ต๋๋ค. (iOS๋์ด ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค, iirc)
String provider = highAccuracy ? LocationManager.GPS_PROVIDER : LocationManager.NETWORK_PROVIDER;
LocationManager.GPS_PROVIDER is best for outdoors when you have a clear view of the sky
๋์
LocationManager.NETWORK_PROVIDER is best for indoors, since it uses networks (and cell towers?)
์ค์ ๋ก ์ด์ ๋ฐ ์์น๋ฅผ ์ํ๋ค๋ฉด ๋ ๋ค / ๋ชจ๋ ๊ณต๊ธ์๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํ๋, ํ์ ์คํฌํ๋ฅผ ๋น๊ตํ๊ณ ๋ ์ ํํ๊ณ ์๋ก์ด ์์น๋ฅผ ์๋ฝํ๋ ค๊ณ ํฉ๋๋ค.
์ด๋ฅผ ์ํ ํ ์์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
React์์ :
๋ ๊ฐ์ watchID
๋ณ์-> watchIDGPS
๋ฐ watchIDNetwork
ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ๋ช
์ ๊ฐ์์๋ฅผ ์ค์ ํฉ๋๋ค. ํ๋๋ enableHighAccuracy=true
๋ฐ enableHighAccuracy=false
์
๋๋ค. ๊ทธ๋ฌ๋ฉด GPS ๊ณต๊ธ์์ ๋คํธ์ํฌ ๊ณต๊ธ์๊ฐ ๋ชจ๋ ๋ฐํ๋ฉ๋๋ค (๋คํธ์ํฌ๋ ์ค๋ด์์ ๋ ์ ํํจ).
React ๋ฐฉ์์ ๋ฌธ์ ๋ JS ์ค๋ ๋์์์ด ์์ ์ ์ํํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ก ์ธํด ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ ์ฅ์น์์ ์ฑ์ด ์ค๋จ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์๋ํฉ๋๋ค.
๋ค์ดํฐ๋ธ์์ :
LocationModule.java
๋ฅผ ์ฌ์ฉ์ ์ง์ ๋ชจ๋๋ก ๋ค์ ์์ฑํ์ฌ ์ ํํ ๊ณต๊ธ์๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ณต๊ธ์์ ๊ด๊ณ์์ด mLocationListener
์์น๋ฅผ ๋ค์๋ณด๊ณ ํ ์ ์์ต๋๋ค. React-Native๊ฐ์ด "๋ฌธ์ "๋ฅผ ์์ ํ ๋๊น์ง.
@ralred , ์ค ๋ํซ ๊ฐ์ฌํฉ๋๋ค.ํ์ง๋ง AndroidPermissions
๊ฐ์ฒด๋ ๋ฌด์์
๋๊น?
๋๋ ๋ชจ๋ ์๋ฃจ์
์ ์๋ํ์ง๋ง ๋ชจ๋ ์คํจํ์ต๋๋ค ....
๊ฐ์๊ธฐ ๋ด ์ฑ์์ง๋ ๋ชจ๋, baidu์ง๋, Google์ง๋์ ๊ฐ์ ์ค๊ตญ์ง๋ (map.baidu.com)๊ฐ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ต๋๋ค. ๋ง์ปค์ ํ์ฌ ์์น๋ฅผ ์ป์ ์ ์์ต๋๋ค !!! ๋๋์ด ๋ง๋ค์์ด์ ~
github, react-native-baidu-map์ผ๋ก ๊ฒ์ ํ ์ ์์ต๋๋ค.
import {
MapView, //์ง๋๋ณด๊ธฐ (ํ์ํ์ง ์์)
MapTypes, // 2D ๋๋ 3D๋ก ์
๋ ฅ (ํ์ํ์ง ์์)
์์น ์ ๋ณด // ์์น์ ๋ํ API (ํ์)
} 'react-native-baidu-map'์์;
componentDidMount () {
Geolocation.getCurrentPosition ()
.then (data => {
Alert.alert (JSON.stringify (data.latitude), JSON.stringify (data.longitude))
})
}
๋ค๋ฅธ ๋๋ผ์์ ์ผํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ผ๋ถ์ง๋ ์ฑ์ ์ฌ์ฉํ์ฌ ์๊ฐํ๋ฉด react-native-maps ๋๋ ๋ค๋ฅธ์ง๋๋ฅผ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค ...
์๋ฌด๊ฒ๋ ์๋ํ์ง ์๊ณ watchPosition์ Android์์ ํธ์ถ๋์ง ์์ผ๋ฉฐ iOS๋ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. ์ด๋ฏธ RN v0.45.0 (ํ์ฌ 0.44.0)์ธ๋ฐ ์์ง ํด๊ฒฐ๋์ง ์์๋์? ์ด์!
@rexlow
์๋ฌด๊ฒ๋ ์๋ํ์ง ์์ผ๋ฉฐ ๋ฒ์ 0.44๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. v0.45๋ก ์
๋ฐ์ดํธ๋ฅผ ์๋ ํ์ต๋๊น?
@VietDucPhan ๋ฐฉ๊ธ ๋ฐฉ๊ธ ์๋ํ์ผ๋ฉฐ ์์ ํ ๋ฌด์์์ ๋๋ค ๐. ์ฌ์ ํ 0.44.0
@rexlow ์ค ๋น์ ์ ์ํด ์ข์. ์ด์ ๋ ์ด์ด ํ์ํฉ๋๋ค.
์ต์ ๊ตฌ์กฐ๋ฅผ ์ ๊ฑฐํด ๋ณด์ จ์ต๋๊น? ๊ทธ๊ฒ์ด ๋๋ฅผ ์ํด ์ผํ ์ ์ผํ ๊ฒ์ ๋๋ค.
iOS ์ฉ Outlook https://aka.ms/o0ukef ๋ฐ๊ธฐ
๋ณด๋ธ ์ฌ๋ : viet_duc_phan [email protected]
์ ์ก : 2017 ๋
6 ์ 18 ์ผ ์ผ์์ผ ์คํ 11:26:15
๋ฐ๋ ์ฌ๋ : facebook / react-native
์ฐธ์กฐ : Ujwal Setlur; ๋
ผํ
์ ๋ชฉ : Re : [facebook / react-native] Android์ Geolocation 'enableHighAccuracy'๊ฐ ํญ์ ์๊ฐ ์ด๊ณผ ๋จ (# 7495)
@rexlow https://github.com/rexlow ์ค, ์ ๋๋ค์. ์ด์ ๋ ์ด์ด ํ์ํฉ๋๋ค.
โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-309349488 ์์ ๋ณด๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/ ์ค๋ ๋๋ฅผ ์์๊ฑฐํฉ๋๋ค.
@rexlow @ ujwal-setlur ๊ทธ๋ฅ ๋น์ ๋ค์๊ฒ ํ์ด์ด ๋์๊ฒ ์น๋ ๊ฒ์ ์๋ฆฌ๊ณ ์ถ์ต๋๋ค. ๊ทธ๊ฒ์ ์๋ํ๊ณ ์์ ํ ๋ฌด์์์ ๋๋ค. ๋๋ ์๋ฌด๊ฒ๋ ๋ฐ๊พธ์ง ์์๋ค.
์ค์ ์ฅ์น์์ ์๋ํด ๋ณด์ จ์ต๋๊น?
2017 ๋ 6 ์ 20 ์ผ ํ์์ผ 19:18 viet_duc_phan, [email protected] ์์ฑ :
@rexlow https://github.com/rexlow @ ujwal-setlur
https://github.com/ujwal-setlur ๊ทธ๋ฅ ์ฌ๋ฌ๋ถ์๊ฒ ์๋ฆฌ๊ณ ์ถ์ต๋๋ค
๋์๊ฒ ํ์ด์ ๋น๋๋ค. ๊ทธ๊ฒ์ ์๋ํ๊ณ ์์ ํ ๋ฌด์์์ ๋๋ค. ๋๋ ๋ณํ์ง ์์๋ค
์๋ฌด๊ฒ๋.โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-309843462 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AACQ6OVyeCsOgd-qevP9CrP9XJMhwaxsks5sGAz3gaJpZM4Ibete
.
@raldred ํญ์ ์ค์ ์ฅ์น์์ ํ ์คํธ๋์์ต๋๋ค.
@VietDucPhan ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ์์ ๋ฅผ ์ค์ ํ ์ ์์ต๋๊น?
2017 ๋ 6 ์ 20 ์ผ ํ์์ผ 20:52 viet_duc_phan, [email protected] ์์ฑ :
@raldred https://github.com/raldred ํญ์ ์ค์ ์ฅ์น์์ ํ ์คํธ๋์์ต๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-309870269 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AACQ6N5SVbYeDEeY9FRnTQSrvpLwKL5aks5sGCLmgaJpZM4Ibete
.
@raldred ์ด ์ฒด์ธ์ ์๋ณธ ๋ณด๊ณ ์์๋ ์ฝ๋ ์ค ๋ํซ์ด ์์ต๋๋ค.
navigator.geolocation.getCurrentPosition(
(position) => {
console.log(position);
},
(error) => {
console.log(error)
},
{enableHighAccuracy: true, timeout: 20000, maximumAge: 10000}
);
๋์๊ฒ๋ ์คํจํฉ๋๋ค. ํด๊ฒฐํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ต์ ์ธ์๋ฅผ ํฌํจํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
navigator.geolocation.getCurrentPosition(
(position) => {
console.log(position);
},
(error) => {
console.log(error)
}
);
@dreallday ๊ฐ ๋ง์ต๋๋ค. ๋ค์ดํฐ๋ธ ๋ฐ์์ ์๋๋ก์ด๋ ์์น๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ณต๊ธ์๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ๋ณด๋ค ๊ณต๊ธ์์ ์ ๋ณด๋ฅผ ๋ง๋ฒ๊ณผ ๊ฒฐํฉํ๋ Fused API ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
react-native-fused-location ์ Android์์ ์์น ์์ฒญ์ํ๋ ๋ฐ ์ ๋ง ์ ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
@raldred ์๋ ํ์ธ์, ์ต๊ทผ์ ๋ฉ์ผ์ ํ์ธํ์ง ์์์ง๋ง ๋ค์ ์๋ํ์ง ์์ต๋๋ค.
@ derman232 ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ด๋ํ๋ฉด react-native-fused-location์ด ์๋ํฉ๋๊น?
@rexlow ๋ฏธ์ํ์ง๋ง ๋ด ์ฑ์ ํ์ํ ๊ธฐ๋ฅ์ด ์๋๋ผ ๊ทธ์ ๋ํ ๋๋ต์ ๋ชจ๋ฆ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง์ ๋ํ ์๊ฒฌ์ ์ ๊ณตํฉ๋๋ค.
์ด์ ๋ชจ๋ ๊ฒ์ด ์๋ํฉ๋๋ค.
์๋
ํ์ธ์,
์๋ฌด๊ฒ๋ ์๋ํ์ง ์์ต๋๋ค. ๋๋ ๋ชจ๋ ๊ฒ์ ์๋ํ๋ค.
์กฐ์ธํ์ญ์์ค.
๊ณ ๋ง์
์ฌ๋๋ค์ ์ํด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ ๋ง ๋์์ด๋๊ณ ์ถ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ค์๊ฐ ์์น๋ฅผ ์ฌ์ฉํ๋ 3 ๊ฐ์ ๋ฐ์ ๋ค์ดํฐ๋ธ ์ฑ์ด ์์ต๋๋ค. Gingerbread๋ฅผ ์คํํ๋ 30 ๊ฐ ์ด์์ ์ค์ Android ๊ธฐ๊ธฐ์์ Nougat๊น์ง QAํ์ต๋๋ค.
์ฌ์ฉ์ ํ
์คํธ๋ฅผ ํตํด ๋ชจ๋ ์ ์๋ํ๋ฉฐ ์ดํ ์ค์ ์ฌ์ฉ์๋ก๋ถํฐ ๋ฌธ์ ์ ๋ํ๋ณด๊ณ ๊ฐ ์์์ต๋๋ค.
@adriancuco ๋ ๊ตฌํ ๋ฐ ๋งค๋ํ์คํธ๋ฅผ ๊ณต์ ํ์ฌ ์ถ๊ฐ๋ก ๋์์ ๋๋ฆด ์ ์์ต๋๋ค.
๊ตฌํ ๋๋ ์ฅ์น ๊ตฌ์ฑ์ด ๋ณต์ก ํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง ํ์ ํ๋ ๋ฌธ์ ์ ๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ด ์๋ชป!
์์ดํ๊ธฐ ์ ์ ๋๋ ๋ฉฐ์น ์ ์ ์ฝ์ ๊ฒ์ฒ๋ผ ๋ด ํด๋ ์ ํ์ ์์น ์ค์ ์ ํ์ธํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ๋ฐฉ๊ธ GPS๊ฐ ํ์ฑํ๋์์ต๋๋ค. ; (
๊ทธ๋์ GPS, Wifi ๋ฑ ๋ชจ๋ ๊ฒ์ ํ์ฑํํ๊ณ ์ด์ ๋ ์ ์๋ํฉ๋๋ค.
์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
๊ณ ๋ง์
์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์์ง ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค.
๋ณด๋ธ ์ฌ๋ : adriancuco [email protected]
๋ณด๋ธ ๋ ์ง : 2017 ๋
7 ์ 4 ์ผ ํ์์ผ ์คํ 2:44:28
๋ฐ๋ ์ฌ๋ : facebook / react-native
์ฐธ์กฐ : Marouen SAYARI; ๋
ผํ
์ ๋ชฉ : Re : [facebook / react-native] Android์ Geolocation 'enableHighAccuracy'๊ฐ ํญ์ ์๊ฐ ์ด๊ณผ ๋จ (# 7495)
์ฃ์กํฉ๋๋ค. ๋ด ์๋ชป!
์์ดํ๊ธฐ ์ ์ ๋๋ ๋ฉฐ์น ์ ์ ์ฝ์ ๊ฒ์ฒ๋ผ ๋ด ํด๋ ์ ํ์ ์์น ์ค์ ์ ํ์ธํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ๋ฐฉ๊ธ GPS๊ฐ ํ์ฑํ๋์์ต๋๋ค. ; (
๊ทธ๋์ GPS, Wifi ๋ฑ ๋ชจ๋ ๊ฒ์ ํ์ฑํํ๊ณ ์ด์ ๋ ์ ์๋ํฉ๋๋ค.
์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
๊ณ ๋ง์
โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-312881724 ์์ ๋ณด๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/ ์ค๋ ๋๋ฅผ ์์๊ฑฐํฉ๋๋ค.
@ m-sayari ๋น์ ์ ์ฐ๋ฆฌ์๊ฒ ๋์์ด ๋ ์ ๋ณด๋ฅผ ์กฐ๊ธ ๋ ์ฃผ๋ ค๊ณ ํ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ตฌํ / ์ค์ ์ ํน์ ํ ๊ฒ์ ๋๋ค. ์ด์ ์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ผ์ด๋ธ ์ฑ์์ ๋ฌธ์ ์์ด ์๋ํฉ๋๋ค.
์ฌ๊ธฐ์ ํด๊ฒฐ๋์์ต๋๋ค! Android 6์์ Redmi 4A๋ฅผ ์ฌ์ฉํ๋ RN 0.45.1.
componentDidMount () ๋ด๋ถ์์ navigator.geolocation.getCurrentPosition () ํธ์ถ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
getCurrentPosition ๋์ ๋์ผํ ๋งค๊ฐ ๋ณ์๋ก watchPosition ()์ ํธ์ถํ์ญ์์ค.
๋ฟก๋ฟก
RN ๋ฒ์
0.46
Android ๋น๋ ๋์ ๋ฒ์
API 22
Android ๊ธฐ๊ธฐ ๋ฒ์
6.0.1
์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ธฐ๊ธฐ.
๋ฅ์์ค 5
์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์ 'options'์์ด getCurrentLocation์ ํธ์ถํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. 'enableHighAccuracy'๋ฅผ false๋ก ์ค์ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
์๋ ํ์ธ์ @raldred , RN 0.47์๋ณด๊ณ ๋ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๋์ผํ ๋ฌธ์ ์ ๋๋ค.
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 16
targetSdkVersion 22
getCurrentPosition
์ฅ์น ์ค์ ์์ "์ฅ์น ์ ์ฉ"์์น ๋ชจ๋๋ฅผ ์ค์ ํ๋ฉด ์ ๋๋ก ์๋ํ์ง๋ง ๋ชจ๋๊ฐ "๋์ ์ ํ๋"๋ก ์ค์ ๋๋ฉด ์๋์ด ์ค์ง๋ฉ๋๋ค ( Location request timed out
).
getCurrentPosition
๊ฐ ์ ์ด๋ Device Only ๋ชจ๋์์ ์๋ํ๋๋กํ๋ ค๋ฉด ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์๋ตํด์ผํฉ๋๋ค.
navigator.geolocation.getCurrentPosition(setLocation);
๋๋ ์ด๊ฒ์ ๊ฐ์ ํ๊ณ ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ง๋ง ๋ค๋ฅธ ์ฌ๋ก๋ก ํ
์คํธํ์ง ์์์ต๋๋ค.
๊ทธ๋์ ๋ด ์ต์
์ ์ดํด๋ณด๋ฉด maximumAge
๋ฐ enableHighAccuracy
์ ์ถฉ๋ํ๋ ๋ ๊ฐ์ง ํญ๋ชฉ์ด ์์์ ์์์ต๋๋ค.์ด ๋ ์ต์
์ ์ฝ๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋์ผํ์ง๋ง ์ต๋ ์ฐ๋ น์ ์ ํ๋๊ฐ ๋ฎ๋๋ผ๋ ์ค์ ์ ๋ฐ๋ผ ์ต์ ์์น ์ ๋ณด๋ฅผ ์ป์ผ์ญ์์ค. enableHighAccuracy
์ (๋) ๊ฐ์ฅ ์ต์ ์ ์ ํํ ์์น๋ฅผ ํ์ธํ๋๋กํฉ๋๋ค. ๋ค์ ์ต์
์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
{enableHighAccuracy: true, timeout: 20000, maximumAge: 60000}
์ต๋ ์ฐ๋ น์ ์ ๊ฑฐํ๊ณ enableHighAccuracy
๋จ๊ธธ ๋๊น์ง ๋์์ด ๋์์ผ๋ฉดํฉ๋๋ค.
๋๋ ๋จ์ง 7e11bad86fd21ce1a8408218e66ce85993d9db69 ๊ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ํ์ธํ๊ธฐ ์ํด master์์ react-native๋ฅผ ๋น๋ํ์ต๋๋ค. ์ฌํ๊ฒ๋ ์ฌ์ ํ ์ด์ ๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
@olieidel Watch ์์น๊ฐ ์ค์ ๋ก ์๋ํ๊ณ , ์ฅ์น๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ์์น ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋์ง, ์์น ์๋น์ค๊ฐ ํ์ฑํ๋์ด ์๋์ง ํ์ธํ์ญ์์ค.
@olieidel ๋ค์ API ์ธ PermissionsAndroid๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ์์น ๊ถํ์ ๋ํ ์ก์ธ์ค ๊ถํ์ด ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๋จผ์ ํ์ธํ ๋ค์ ๊ถํ์ด ๋ถ์ฌ๋์ง ์์๋์ง ๋ฌป์ต๋๋ค.
@mrbarde ๋น ๋ฅธ ๋ต์ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์, ํ๋ฃจ ์ข
์ผ ๋๋ฒ๊น
์ ๋ง์น๊ณ ์ฐพ์ ๊ฒฐ๊ณผ์ ๊ด๋ จ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
RN 0.46.4, ๊ธฐ๊ธฐ : Nexus 5X, API 25
์์น ๋ชจ๋ : ๊ธฐ๊ธฐ ๋ง
getCurrentPosition
, enableHighAccuracy: true
: GPS ์ ํธ๋ฅผ ์ฌ์ฉํ ์์์ ๋ ์๋ํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ฐ ์ด๊ณผgetCurrentPosition
, enableHighAccuracy: false
: ์๋ํ์ง ์์ต๋๋ค (์๊ฐ ์ด๊ณผ). ์์น ์๋น์ค๊ฐ ํ์ํ ์ ์์ต๋๋ค (์์น ๋ชจ๋! = ์ฅ์น ์ ์ฉ).watchPosition
, enableHighAccuracy: true
: GPS ์ ํธ๋ฅผ ์ฌ์ฉํ ์์์ ๋ ์๋ํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ฐ ์ด๊ณผwatchPosition
, enableHighAccuracy: false
: ์๋ํ์ง ์์์์น ๋ชจ๋ : ๋์ ์ ํ๋
getCurrentPosition
, enableHighAccuracy: true
: GPS ์ ํธ๋ฅผ ์ฌ์ฉํ ์์์ ๋ ์๋ํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ฐ ์ด๊ณผ๋ฉ๋๋ค. maximumAge
์ค์ ์ ๋ฐ๋ผ ์ด์ ์์น๋ฅผ ๋ฐํ ํ ์ ์์ต๋๋ค.getCurrentPosition
, enableHighAccuracy: false
: 5-6 ์ด ํ์ ์๋ํฉ๋๋ค (์ด๋ฏธ๋ณด๊ณ ๋๋๋ก).watchPosition
, enableHighAccuracy: true
: GPS ์ ํธ๋ฅผ ์ฌ์ฉํ ์์์ ๋ ์๋ํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ฐ ์ด๊ณผwatchPosition
, enableHighAccuracy: false
: ์๋์์ฝ
์์น ๋ชจ๋๊ฐ ๊ธฐ๊ธฐ ์ ์ฉ ์ธ ๊ฒฝ์ฐ ํญ์ GPS ์ ํธ๋ฅผ๋ฐ์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์๋ ์์น ์๋น์ค๊ฐ ํ์ํฉ๋๋ค (์์น ๋ชจ๋! = ์ฅ์น ๋ง ํด๋น).
๋๋ ์ด๊ฒ์ด ๋ชจ๋ Location API์ ์์๋๋ ๋์์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ง๊ตฌ๊ฐ ํํํ์ง ์์ ๊ฒ์ ํด๋นํ๋ ๊ฒ์ ๋ฐฉ๊ธ ๋ฐ๊ฒฌํ์ง๋ง Location mode == Device only (an)๋ก ์ค์ ๋ ์ฅ์น๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ด๊ฒ์ ์ง์ฅ์
๋๋ค . ์๋ฎฌ๋ ์ดํฐ, ์๋ก ๊ตฌ์ฑ๋ ์ฅ์น) ์ฌ์ฉ ๊ฐ๋ฅํ gps ์ ํธ๊ฐ์๋ ๋ฐฉ์ ์์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์๊ฐ ์ ํ ๋ง ๋ฐ๊ฒ๋ฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
์ด ์ค๋ ๋์์ ์ด๋ฏธ ์ค๋ช
ํ๋ฏ์ด enableHighAccuracy
๋ํด ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง ๋ ๊ฐ์ watchPosition
๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ๊ณ ๋ ๊ฐ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ์ทจํ ๋ค์ ์ ๊ฑฐํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ง๊ณ ๋๋ฉด์ ๋ ์ฒญ์ทจ์๊ฐ ์ค์ ๋ก ๋์ผํ ์์น๋ฅผ ๋ฐํํ๋ค๋ ์ธ์์ ๋ฐ์์ง๋ง ๊ทธ๋ ์ ๋๋ฒ๊น
๋ด์ฑ์ด ๊ณ ๊ฐ๋์์ต๋๋ค ...
์ด๊ฒ์ ์์น ๋ชจ๋๊ฐ ์ฅ์น ์ ์ฉ์ด ์๋๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
@olieidel ๋ฌผ๋ก , ์ ์๋ฌด๋ ๋ฐ์ ๋ค์ดํฐ๋ธ Geolocation API๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ ์ฉํ์ง ์๊ฑฐ๋ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ์ ์ ํ ๋ฐฉ๋ฒ์ navigator.geolocation
๋ก ๊ต์ฒดํ๋ ๊ฒ์
๋๋ค. ๊ถ๊ธํ ์ ์ด ์์ผ๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ํ ์์ฒญ์ ๋ง๋ค์ด Facebook์ด ์ข์ํ๋์ง ํ์ธํ์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ์ข ๋ ๊น์ด ํ๊ณ ๋ค์ด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ผ๊ด๋๊ฒ ์ฌํํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
์์น ๋ชจ๋๊ฐ "๋์ ์ ํ๋"๋ก ์ค์ ๋์ด ์๊ณ GPS ์ ํธ๊ฐ์๋ ์ค๋ด์์ ํ์ฌ ์์น API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Android 5.1 ๋ฐ 6.0์ด ์ค์น๋ ์ผ์ฑ ํด๋ํฐ์์๋ง์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. Oppo ํด๋ํฐ์์ ์ ์๋ํ๊ฑฐ๋ "๊ณ ์ ํ๋"๋ชจ๋๊ฐ ์ผ์ ธ ์์ด๋ ๋ช ํํ GPS ์ ํธ๋ก ์ค์ธ์์ ์๋ํฉ๋๋ค.
์ด ์ค๋ ๋์์ ์ ์ํ ๋ช ๊ฐ์ง ์๋ฃจ์ ์ ๊ณง ํ ์คํธํ๊ฒ ์ต๋๋ค.
@mrbarde ๋ฅผ ๋ช
ํํํ๊ธฐ ์ํด : ์ ๋ navigator.geolocation
์์์ต๋๋ค. :)
@olieidel ๋๋ ๋ฌธ์๊ฐ Geolocation API๊ฐ ์๋ navigator.geolocation
๋ฐ์ํด์ผํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์๋
ํ์ธ์, Android์์๋ ์์น ์ก์ธ์ค ๊ถํ์ด์์ ์ ์์ง๋ง ์ฌ์ฉ์๊ฐ OS ์ค์ ์์ ์์น๋ฅผ ๊ป๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋ฐ๋ผ์ navigator.getCurrentPosition()
๋ ์ฌ์ ํ ์๊ฐ ์ด๊ณผ๋ฉ๋๋ค.
๋ค์์ ๋ ๊ฐ์ง ๋ฉ์๋๊ฐ์๋ Java ์ค ๋ํซ์
๋๋ค. ์ฌ์ฉ์๊ฐ ์ค์ ์์ ์์น๋ฅผ ์ฌ์ฉ ์ค์ ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ checkIfLocationAvailable
. requestUserToActivateLocation
๋ ์ฌ์ฉ์์๊ฒ ์์น๋ฅผ ์ผ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
package location;
import android.Manifest;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.Log;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;
/**
* Created by nigelnindo on 11/28/16.
*/
public class LocationBridge extends ReactContextBaseJavaModule implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
public LocationBridge(ReactApplicationContext reactContext) {
super(reactContext);
}
public GoogleApiClient googleApiClient;
<strong i="10">@Override</strong>
public String getName() {
return "LocationBridge";
}
<strong i="11">@ReactMethod</strong>
public void checkIfLocationAvailable(final Promise promise){
int locationMode = 0;
String locationProviders;
boolean isAvailable = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
try {
locationMode = Settings.Secure.getInt(getReactApplicationContext().getContentResolver(), Settings.Secure.LOCATION_MODE);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
isAvailable = (locationMode != Settings.Secure.LOCATION_MODE_OFF);
} else {
locationProviders = Settings.Secure.getString(getReactApplicationContext().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
isAvailable = !TextUtils.isEmpty(locationProviders);
}
boolean coarsePermissionCheck = (ContextCompat.checkSelfPermission(getReactApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
boolean finePermissionCheck = (ContextCompat.checkSelfPermission(getReactApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
boolean finalResult = (isAvailable && (coarsePermissionCheck || finePermissionCheck));
Log.e("FINAL RESULT", Boolean.toString(finalResult));
promise.resolve(Boolean.toString(finalResult));
}
<strong i="12">@ReactMethod</strong>
public void requestUserToActivateLocation(final Promise promise){
Log.e("LOCATION_BRIDGE:", "called activate location function");
if (googleApiClient == null) {
Log.e("LOCATION_BRIDGE: ", "googleApiClient is null");
googleApiClient = new GoogleApiClient.Builder(getReactApplicationContext())
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
googleApiClient.connect();
}
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
locationRequest.setInterval(30 * 1000);
locationRequest.setFastestInterval(5 * 1000);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
//**************************
builder.setAlwaysShow(true); //this is the key ingredient
//**************************
Log.e("LOCATION_BRIDGE", "Created builder");
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
<strong i="13">@Override</strong>
public void onResult(LocationSettingsResult result) {
Log.e("LOCATION_BRIDGE: ", "onResult callback invoked");
final Status status = result.getStatus();
final LocationSettingsStates state = result.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
Log.e("LOCATION_BRIDGE: ", "Location settings satisfied");
// All location settings are satisfied. The client can initialize location
// requests here.
promise.resolve("true");
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.e("LOCATION_BRIDGE", "Location resolution required");
// Location settings are not satisfied. But could be fixed by showing the user
// a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
status.startResolutionForResult(
getCurrentActivity(), 1000);
promise.resolve("awaiting");
} catch (IntentSender.SendIntentException e) {
Log.e("LOCATION_BRIDGE", "could not send intent");
promise.reject("LOCATION_BRIDGE", "could not send intent");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.e("LOCATION_BRIDGE", "location settings are unavailable");
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
promise.reject("LOCATION_BRIDGE", "settings change is not available");
break;
}
}
});
}
<strong i="14">@Override</strong>
public void onConnected(<strong i="15">@Nullable</strong> Bundle bundle) {
Log.e("LOCATION_BRIDGE", "CONNECTED");
}
<strong i="16">@Override</strong>
public void onConnectionSuspended(int i) {
Log.e("LOCATION_BRIDGE", "SUSPENDED");
}
<strong i="17">@Override</strong>
public void onConnectionFailed(<strong i="18">@NonNull</strong> ConnectionResult connectionResult) {
Log.e("LOCATION_BRIDGE", "CONNECTION FAILED");
Log.e("LOCATION_BRIDGE", connectionResult.toString());
if (connectionResult.hasResolution()){
try {
connectionResult.startResolutionForResult(getCurrentActivity(), 1);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
else{
Log.e("LOCATION_BRIDGE","CONNECTION FAILURE HAS NO RESOLUTION");
}
}
}
์ด๊ฒ์ ์ฌ์ฉํ๊ธฐ ์์ํ ์ดํ๋ก Android์์ ์์น ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ฌผ๋ก compile 'com.google.android.gms:play-services-location:x.x.x'
๋ฅผ app/build.gradle
์ ์ถ๊ฐํ๊ณ ์ฌ๊ธฐ์ ์ค๋ช
๋๋๋ก ๋ค์ดํฐ๋ธ ๋ชจ๋์ ๋ง๋ค์ด์ผํฉ๋๋ค. ์ด๊ฒ์ด ๋
๋ฆฝํ npm ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ์ ์ถฉ๋ถํ ๊ธฐ๋ฅ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
์๋
ํ์ธ์ @nigelnindo ์ค์ ๋ก PermissionsAndroid ๋ผ๋ React Native API๊ฐ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ฑ์ ๋ํ ์์น ๊ถํ์ ํ์ฑํํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋๋ ๋น์ ์ด ์ง์ ํ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ผ๋ฏ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋จผ์ ์ฌ์ฉ์๊ฐ ๊ธฐ๊ธฐ ์์น์ ๋ํ ์ฑ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋์ง ํ์ธํ์ต๋๋ค.
PermissionsAndroid
.check("android.permission.ACCESS_FINE_LOCATION")
.then((granted) => {
if(granted){
// do something
return;
}
// do something else
}).catch((err) => {
// handle error
});
๊ทธ๋ฐ ๋ค์ ์๋ ์ฝ๋๋ก ํจ์๋ฅผ ์คํํ๋ฉด ์ฌ์ฉ์์๊ฒ
์ฑ์ ๋ํ ์์น ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
PermissionsAndroid
.request("android.permission.ACCESS_FINE_LOCATION")
.then((resp) => {
if(resp == "granted"){
_self._watchLocation();
}else{
this.props.watchLocSuccess();
}
// set state
_self.setState({
requestLocation: false
});
//
}).then((err) => {
// handle error
});
์ด๊ฒ์ ๋๋ฅผ ์ํด ํธ๋ฆญ์ํ๊ณ ์ด์ ๋ ์์น ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ด ๋๊ตฐ๊ฐ๋ฅผ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์๋
ํ์ธ์ @mrbarde , ์ถ๊ฐํ๊ธฐ ์ํด ์์ ์ค ๋ํซ ์ธ์ PermissionsAndroid
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด :
์๋ ํ์ธ์, Android์์๋ ์์น ์ก์ธ์ค ๊ถํ์ด์์ ์ ์์ง๋ง ์ฌ์ฉ์๊ฐ OS ์ค์ ์์ ์์น๋ฅผ ๊ป๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
์ฆ, ์ฑ์ PermissionsAndroid
์ป์ ์์น์ ์ก์ธ์ค ํ ์์๋ ๊ถํ์ ๊ฐ์ง ์ ์์ง๋ง ์ฌ์ฉ์๊ฐ ์ํ ํ์ ์ค ๋ฐ๋ก ๊ฐ๊ธฐ์์ ์์น๋ฅผ ์ฌ์ฉ ์ค์งํ๊ฑฐ๋ Settings -> Location -> Off
ํ์ฌ getCurrentPosition()
ํตํ๋ ์ฌ์ ํ ์๊ฐ ์ด๊ณผ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฃ์ง ์ผ์ด์ค์ ๋์์ด๋ฉ๋๋ค.
@nigelnindo yh ๊ทธ๋ ๋ค๋ฉด ์ ๋ง ๋น์ ์ ํด๊ฒฐ์ฑ ์ ์ ์ ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ผ๋ก PR์ ํ ์ ์์ต๋๊น? ์ ๋ง ๋ง์ ์๊ฐ์ ์ ์ฝ ํ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค. Java๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ์ด ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋น๋ก ๋ฐฐ์ธ ์๊ฐ์ด ์์์ผ๋ฉดํฉ๋๋ค. ์ด๊ฒ์ด ๊ณต์์ ์ผ๋ก React์ ์์๋ค๋ฉด ๋๋ ๊ทธ๊ฒ์ ์ ํธํ๊ณ , ์ด์ ๊ฐ์ ํต์ฌ์ ์ธ ๊ฒ๋ค์ ์ํด ์จ๋ ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๋ ๊ฒ์ ํ์์ ์ด๋ฉฐ ์ผ๊ด์ฑ์ ๋ํด ๊ฑฑ์ ํฉ๋๋ค.
23 (16-22) ๋ฏธ๋ง์ build.gradle (์ฑ)์์ (Android) TargetSdkVersion ์ ๋ณ๊ฒฝํ์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์๋ํฉ๋๋ค!
AndroidManifest ํ์ผ์ ์ฌ์ฉ ๊ถํ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. AndroidManifest ํ์ผ์ 23 (16-22) ๋ฏธ๋ง์ SDK์์๋ง ํธ์ถ๋ฉ๋๋ค.
์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ธ์ :
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
maxAge ๋งค๊ฐ ๋ณ์๋ฅผ ์ญ์ ํ์ง ๋ง์ญ์์ค!
๊ทธ๋ ๊ฒํ๋ฉด GPS ๋ชจ๋์ ์์ฑ์์ ์ค์ ์์น๋ฅผ ์ป์ ๋๊น์ง ๋ง์ง๋ง ์บ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ค์ ์์น์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๋ค๋ฅธ ์ฑ์ ์์น๊ฐ ์บ์ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ๋ถ ํธ๋์ ์ ์ฅํ๋ ค๊ณ ํ๋ฉด ์ฒ์ ์ฌ๋ฌ ์ง์ ์ด ์ค์ ์์น์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ์์น๋ฅผ ํ์ ํ ์ ์์ต๋๋ค.
@pavelpashkovsky ์ฃผ์ฅ์ ๋ท๋ฐ์นจํ๋ ๋ช ๊ฐ์ง ์ฌ์ค์ด๋ ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๊น?
@rexlow ๋ฐฉ๊ธ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ช ํ์ต๋๋ค. ์ฝ 1 ์ฃผ์ผ ์ ์ ๋์ผํ ๋ฌธ์ ์ ๋น ์ก๊ณ ์ด ์ฃผ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๋ ์ฝ 30 ๊ฐ์ ํ ์คํธ๋ฅผ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒ์ 1 ~ 5 ์ด ๋์ ์์น๊ฐ ์๋ชป๋ 3 ~ 4 ๊ฑด์ ๋ฐ์์ต๋๋ค (GPS๊ฐ ์์ฑ ์ ํธ๋ฅผ ์ฐพ์ ๋๊น์ง)
@pavelpashkovsky ๋๋ ์ง๊ธ๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ๋ด ๊ตฌ์ฑ์ maximumAge: 1000
์ด ์์ง๋ง. ๋น์ ์ด ๋งํ ๊ฒ์ฒ๋ผ ์ด์ ์์น๋ฅผ ์บ์ฑํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@rexlow ๋น์ ์ด ๋ง์์. ๊ทํ์ ๊ฒฝ์ฐ GPS๋ 1 ์ด ๋์ ์์น๋ฅผ ์ ์งํฉ๋๋ค.
๊ทธ๋ฌ๋ gps๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ง ์๊ณ ํญ์ ์ค์ ์์น๋ฅผ ์ป์ผ๋ ค๊ณ ํ ๋ maximumAge : 0์ผ๋ก ์ป์ ์ต์์ ๊ฒฐ๊ณผ์ ๋๋ค (๋๋ ์์ฑ์์ ์์น๋ฅผ ๊ฐ์ ธ์ฌ ์์๋ ๊ฒฝ์ฐ ์ค๋ฅ).
์ต๋ ๊ฐ์ ์ ๊ฑฐํ๋ฉด ํ ์คํธ ํ Oppo ์ ํ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์์ ํ์ธํ ์ ์์ต๋๋ค. ์์ฃผ ์ค๋๋ ์บ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๊ฒ์ ๋์๊ฒ ๊ณ์ ์ผ์ด๋ฌ๋ค. ๋ด ์์น ์ ๋ณด ๊ถํ์ด ์ฑ ์ ๋ณด-> ๊ถํ์์ ๊บผ์ง ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ๊ถ๊ธํ์ง๋ง ํด๋น ๊ถํ์ด ๋ฐํ์์ ์์ฒญํ ๊ถํ์ ์ฌ์ ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋์ด ๋ฌธ์ ๊ฐ์์ ์ ์์ต๋๋ค.
์๋
ํ์ธ์ (์์ด ์ฃ์กํฉ๋๋ค).
maximumAge ๋ฅผ ๋๋ฆฌ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๊ฒ
RN 0.48 ์ง๋ฆฌ์ ์์น ๋ฌธ์ :
Geolocation API๋ ์น ์ฌ์์ ํ์ฅํฉ๋๋ค : https://developer.mozilla.org/en-US/docs/Web/API/Geolocation
๊ทธ๋ฆฌ๊ณ ์ ๋ฐ๋ฅด๋ฉด :
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy
&
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/timeout
& ํน๋ณํ :
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/maximumAge
์ด ์ต์
์ด์๋ ์๋๋ฆฌ์ค์์ :
{enableHighAccuracy: true, timeout: 10000, maximumAge: 30000}
์ฅ์น์ GPS ์นฉ์ด ์์ฑ์ ์ฐ๊ฒฐ์ ์๋ํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ๊ธฐ๊ฐ ( 10000ms)์ ์ค์ ๋ ์ฐ๊ฒฐ์ด @RoBYCoNTe๊ฐ ๋งํ๋๋ก ์ค๋ฅ์์ด ๋ฐํ๋๋ ๊ฒฝ์ฐ : issuecomment-220580494 ๊ทธ๋ฌ๋ GPS ์ฐ๊ฒฐ์ด ์คํจํ๊ฑฐ๋ ์๊ฐ ์ด๊ณผ ๋ ๊ฒฝ์ฐ ์ฅ์น๊ฐ ์ค์ ๋ ์ต๋ ์ฐ๋ น ์ผ๋ก ํฉ๋๋ค. ์ต์ (30000ms). ์ด๋ค ๊ฒ์ด ์์ผ๋ฉด ๋ฐํ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ๋ชฉ์ ์๊ฐ ์ด๊ณผ ์ค๋ฅ์ ํจ๊ป ์ค๋ฅ ์ฝ๋ 3์ด ๋ฐํ๋ฉ๋๋ค.
์ฐ๊ฒฐ ์๊ฐ ์ด๊ณผ (์ต์ 25000ms )๋ฅผ 3600000ms = 1 ์๊ฐ)๋ฅผ
{enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000}
์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
_emulator config_ : ์๊ฐ ์ด๊ณผ ๊ธฐ๊ฐ ๋์ ์๋ฎฌ๋ ์ดํฐ ์ค์ ์ ์์น ๋ฉ๋ด๋ฅผ ํตํด ๊ฐ์ ์์น ์ ๋ณด (์๋ ๋ฐ ๊ฒฝ๋)๋ฅผ ์ ์กํด์ผํฉ๋๋ค. (์์ฑ ์ฐ๊ฒฐ์ ์๋ฎฌ๋ ์ดํธํฉ๋๋ค)
{ enableHighAccuracy: true, timeout: 60000, maximumAge: 1200 }
๊ฐ) ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค. ์ ์๊ฒ๋ ์ต๋ ์ฐ๋ น์ด ์๋๋ผ ๊ธฐ๊บผ์ด ๊ธฐ๊บผ์ด ๊ธฐ๋ค๋ฆด ์๊ฐ์ด์์ต๋๋ค.
(Android ๋ง ํด๋น)
์ด ๋ฌธ์ ๋ ์ ์๊ฐ์ ๋ฒ๊ทธ๊ฐ ์๋๋๋ค.
React Native์์ ์ง๋ฆฌ์ ์์น๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก GPS ์ ๊ณต์๋ ๋คํธ์ํฌ ์ ๊ณต ์ ์ฒด๋ณด๋ค ๋๋ฆฌ๋ฉฐ ์์น์ ๋ฐ๋ผ ํญ์ ์๋ํ์ง๋ ์์ต๋๋ค (GPS๊ฐ ํด๋ ์ ํ์ ๋๋ฌ ํ ์์๋ ๊ฒฝ์ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ ํจ). ๋คํธ์ํฌ ๊ณต๊ธ์๋ ๋ ๋น ๋ฅด๊ณ ์ ๊ทผ์ฑ์ด ๋์ง๋ง ์ ์ถฉ์์ผ๋ก ์ ํ๋๊ฐ ๋ฎ์ต๋๋ค (์ต์ ์ ๊ฒฝ์ฐ 2000 ๋ฏธํฐ).
highAccuracy๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ฉด GPS๋ก ์ฐ๊ฒฐํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํํ๊ณ ์ ์ ๋ ์ ํ ํด์ง๋ฉด์ ์์น๋ฅผ ์
๋ฐ์ดํธํ์ญ์์ค. ์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ ๋ด ๊ฐ์์๋ฅผ ๊ตฌํํ์ฌ ์์น๋ฅผ ๋น๊ตํ๊ณ ํญ์ ๋ ์ ํํ ์ ๋ณด๋ฅผ ๋ฐํํ์ต๋๋ค. ๊ธฐ๋ณธ RN ๊ตฌํ์ ๋ฌธ์ ๋ GPS ๊ณต๊ธ์ ๋๋ ๋คํธ์ํฌ ๊ณต๊ธ์์ ์์กดํ์ง๋ง ๋ ๋ค์ ์ ์ถฉ์์ ๋ฐํํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์๋ง๋ JS ๋๋ Native์์ ํด๊ฒฐํด์ผ ํ ๊ฒ์ ๋๋ค.
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Android์์๋ง ํ ์คํธ๋์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์๋ํ๋๋ก ๊ด๋ฆฌํ๊ณ ์์น๊ฐ ํ์ฑํ๋์ด ์๋์ง ํ์ธํ์ต๋๋ค.
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
}, (error) => {
alert("Geolocation error: "+error.message);
},
{enableHighAccuracy: true, timeout: 20000, maximumAge: 0}
);
ํ์ฅ ๋ ์ปจํธ๋กค์ ์ฌ์ฉํ์ฌ ์ํ๋ ์์น๋ฅผ ์ฑ์ผ๋ก ๋ณด๋ ๋๋ค.
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
}, (error) => {
alert("Geolocation error: "+error.message);
}
);
์ด๊ฒ์ ๋น์ ์ ํ์ฌ ์์น๋ฅผ ์ป์ ๊ฒ์ ๋๋ค
๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค!
์ด ๋ฌธ์ ์ ๋ํ ์์ ์ด ๊ฐ๊น์ด ๋ฏธ๋์ ๋ฆด๋ฆฌ์ค์์ ์ ๊ณต๋ฉ๋๊น?
์ ์ ๋ ์๋ฃจ์ ( ์ : ์ , ์ ๋ฐ ์ ) ์ค ์ผ๋ถ๋ฅผ ์๋ํ์ง๋ง ์ด๋ ๊ฒ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ์๋๋ฆฌ์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค๊ณ ๋งํ ํ์๊ฐ ์์ต๋๋ค.
์ฑ
์ฌ์ฉ ์๋๋ฆฌ์ค
์ฌ์ ํ Geolocation timed out, code 3
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค ...
๋๊ตฌ๋ ์ง์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ์ต๋๊น?
_ ์ ๋ฐ์ดํธ _ (2017-11-13) :
Settings >> Privacy >> Location >> Mode
์ High accuracy
๋ก ์ค์ ํ์ฌ (์ ์ด๋ ์ผ์์ ์ผ๋ก) ํด๊ฒฐํ์ต๋๋ค.
์๋
ํ์ธ์.
์ข์ ํด๊ฒฐ์ฑ
์ ์ฐพ์์ต๋๋ค!
์ด ๋ฌธ์ ์ ๋ํ ์ด์ ์๊ฒฌ์ ๋จผ์ ์ฝ์ด์ฃผ์ธ์. # issuecomment-331830285
ํด๊ฒฐ์ฑ
:
๋จผ์ navigator.geolocation.getCurrentPosition
๋ฅผ {enableHighAccuracy: true, timeout: 60000, maximumAge: 0}
๋ก PositionOptions
ํธ์ถํ๋ฉด ์ค์ ํ์ฌ ์์น๊ฐ ๋ฐํ๋ฉ๋๋ค.
์ด์ ์์ฒญ ์๊ฐ์ด ์ด๊ณผํ๋ ๊ฒฝ์ฐ ๋ค์ ์ ํ navigator.geolocation.getCurrentPosition
์ผ๋ก : {enableHighAccuracy: false, timeout: 30000, maximumAge: 3600000}
๋ก PositionOptions
,์ด ๋์ฒด๋ก LowAccuracy ์์น๋ฅผ ๋ฐํํ๊ณ _ (๋ด๊ฐ ์๊ฐํ๋) _ ์๊ฐ ์ด๊ณผ๋์ง ์์ต๋๋ค!
์ํ ์ฝ๋ :
const GeoHightAccuracy = () => {
return new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(
(locHightAccuracy)=>{
resolve(locHightAccuracy)
},
(error)=>{
GeoLowAccuracy()
.then((locLowAccuracy)=>{resolve(locLowAccuracy)})
.catch((err)=>{reject(err)});
},
{enableHighAccuracy: true, timeout: 60000, maximumAge: 0}
)
});
};
const GeoLowAccuracy = () => {
return new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(
(locLowAccuracy)=>{
resolve(locLowAccuracy)
},
(error)=>{
reject(error)
},
{enableHighAccuracy: false, timeout: 15000, maximumAge: 3600000}
)
});
};
md5-625c5be4703308984997af853cc94a42
GeoHightAccuracy()
.then(locationData => console.log(locationData))
.catch(error => console.log(error));
์ ์ฉ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค!
navigator.geolocation์ ๋ด ์๋๋ก์ด๋ ์ค์ ์ฅ์น์์ ์๋ํ๋๋ก ๊ด๋ฆฌ ํ ์ โโ์์ต๋๋ค.
์ฌ๊ธฐ์ ์์ ํ ๊ฒ์ด ์๋ค๊ณ ์๊ฐํ๋ฉฐ ์์น ์ ๋ณด๊ฐ ์์๋๋ก ์๋ํฉ๋๋ค. ์์ ๋ด ๊ฒ์๋ฌผ์ ์ฝ์ผ์ญ์์ค.
@Rewieer , ํ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ด ์ฑ์์ navigator.geolocation์ ํ ์คํธํ๊ณ ์์ต๋๋ค.
var options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 5000
};
function success(pos) {
var crd = pos.coords;
alert(crd.latitude + " " + crd.longitude);
};
function error(err) {
alert('ERROR(' + err.code + '): ' + err.message);
};
navigator.geolocation.getCurrentPosition(success, error, options);
๋๋ ํญ์ ERROR(3): Location request timed out
๋ฐ๊ณ ์์ต๋๋ค.
๋ชจ๋ ์ต์
์กฐํฉ์ ์ฌ์ฉํฉ๋๋ค.
์ง๋์์ ๋ด ์์น์ ํ๋์ ์ ์ ๋ณผ ์ ์๊ณ GPS๊ฐ ์ ์๋ํ์ง๋ง ์์น๋ฅผ ์ป๊ฑฐ๋ navigator.geolocation์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์๋์ํฌ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๊ฒฝ์ฐ ๋คํธ์ํฌ ์์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ต์ ์์ด ํ์ฌ ์์น๋ฅผ ๊ฐ์ ธ ์ค๋ ค๊ณ ํ์ต๋๊น? (๊ทธ ์์น๋ฅผ ์ป๊ธฐ ์ํด ๋คํธ์ํฌ ๊ด๋ จ ์ธํ๋ผ๋ฅผ ์ฌ์ฉํฉ๋๋ค)
์ค์ Android ๊ธฐ๊ธฐ (๋ฒ์ 5.1)๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
react-native-maps๋ฅผ ์ฌ์ฉํ์ฌ ๋ด ์์น๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค (๋ด ์ฑ ๋ด์ง๋์์ ์ ํํ ํ๋์ ์ ์์น) + Google์ง๋ ์ฑ์ ์ฌ์ฉํ์ฌ ๋ด ์์น๋ก ์ด๋ํ ์ ์์ต๋๋ค (GPS ์๋).
ํฐ ์๊ฐ ์ ํ์ ์ฌ์ฉํ๊ณ enableHighAccuracy๋ฅผ true ๋ฐ false๋ก ์ ํํ๊ณ ์ต์
์ ์ ๊ฑฐํฉ๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด navigator.geolocation์ ๊ฐ์ ธ ์ค์ง ๋ชปํ์ต๋๋ค.
๋ค์ดํฐ๋ธ API๋ก Android์์ ์์ ๋๋ฝ ํ์ต๋๊น?
2017-11-16 15:19 GMT + 01 : 00 Badis Merabet [email protected] :
์ค์ Android ๊ธฐ๊ธฐ (๋ฒ์ 5.1)๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
react-native-maps๋ฅผ ์ฌ์ฉํ์ฌ ๋ด ์์น๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค (์ฌ๋ฐ๋ฅธ ํ๋์
๋ด ์ฑ ๋ด์ง๋์์ ์ง์ ์์น) + Google์ง๋ ์ฑ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ
๋ด ์์น๋ก ์ด๋ํฉ๋๋ค (GPS ์๋).
ํฐ ์๊ฐ ์ ํ์ ์ฌ์ฉํ๊ณ enableHighAccuracy๋ฅผ true์ false๋ก ์ ํํฉ๋๋ค.
์ต์ ์ ๊ฑฐ ... ๋ฑ. ๋ชจ๋ navigator.geolocation์ ๊ฐ์ ธ ์ค์ง ๋ชปํ์ต๋๋ค.
๋ฐ์ดํฐ.โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/7495#issuecomment-344935653 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALuPm5XL1tNLCniOMR4YAMI4ZC2fKxrsks5s3ESBgaJpZM4Ibete
.
์ @Rewieer , ๋์ํฉ๋๋ค. ์ค๋ฅ์ ์์ธ์ ์๋ชป๋ ๊ตฌ์ฑ์ ๋๋ค.
์๋ฎฌ๋ ์ดํฐ์์๋ ์๊ฐ ์ด๊ณผ ์ ์ ์๋ฎฌ๋ ์ดํฐ ์ค์ ์ ํตํด ์๋์ ๊ฒฝ๋๋ฅผ ๋ณด๋ด์ผํฉ๋๋ค!
๋ด ์๋ฃจ์ # issuecomment-331830285๋ ๋จผ์ GPS ๋ฐ ์์ฑ ์ฐ๊ฒฐ์ ํตํด ์ค์ ํ์ฌ ์์น๋ฅผ ์ป์ผ๋ ค๊ณ ์๋ํ๊ณ ์์ฒญ ์๊ฐ์ด ์ด๊ณผ ๋ ๊ฒฝ์ฐ (๋๋ ๊ธฐํ ์ค๋ฅ๊ฐ์๋ ๊ฒฝ์ฐ) ๋คํธ์ํฌ ๊ด๋ จ ์ธํ๋ผ๋ฅผ ์ฌ์ฉํ์ฌ LowAccuracy ์์น๋ฅผ ์ป์ผ
@Rewieer ๋๋ ์๋๋ก์ด๋ ๋ค์ดํฐ๋ธ API๋ก ์ผํ ์ ์ด ์์ต๋๋ค. ์ ๋ JavaScript ๊ฐ๋ฐ ๋งํ๊ณ ์์ต๋๋ค.
@badis ์ฝ๋์ ์ค๋ฅ ๋ก๊ทธ๋ฅผ ๋ณด๋ด์ฃผ์ธ์.
@badis
RN ๋ฌธ์ :
์์น์ ๋ํ ์ก์ธ์ค๋ฅผ ์์ฒญํ๋ ค๋ฉด ์ฑ์ AndroidManifest.xml์ ๋ค์ ์ค์ ์ถ๊ฐํด์ผํฉ๋๋ค.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
react-native๋ก ์์
ํ๋ ๊ฒ์ ๊ธฐ๋ณธ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์ ๋ํด ์กฐ๊ธ ์๊ณ ์์ด์ผํฉ๋๋ค. ์๋ํ๋ฉด ๊ทธ๋ฌํ ๋ฌธ์ ๋ React-Native๋ก ์์
ํ๋ ๋์๊ฒ ์๋นํ ๋ง์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ค์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ (์ฌ์ฉ์ ์ธก๋ฉด)์ ์์์ ๊ทผ์ฌ์น๋ฅผ ๊ฐ์ ธ ์์ ์์ ํ๋ ๊ฒ์
๋๋ค. GPS๋ ์ฌ์ฉ์์ ์์น์ ๊ทผ์ฒ ์์ฑ์ ์์น์ ๋ฐ๋ผ ๋ค์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋คํธ์ํฌ ์์น๊ฐ ์ ๋ง ๊ฑฐ์น ์ด ๋ณด์ผ ์ ์์ง๋ง ๋ชจ๋ ์ฌ๋์ด ์ํ๋์์ค์ฝ์ ์ด๊ณ ์๋ ๊ฒ์ ์๋๋๋ค. :)
ํธ์ ๋ด์ ๊ฐ๊ธฐ
๋ค์์ ๊ธฐ๋ฅ ํ
์คํธ๋ฅผ ์ํํ๋ ๋ฐ๋ชจ ์ฝ๋์
๋๋ค. https://github.com/badis/mobile-react-native
์ง๋ ํ์ด์ง๋ฅผ๋ณด์ธ์.
์ฝ๋๊ฐ ์ ํํ๊ณ ๋ค๋ฅธ ์ฌ๋์ ์ํด ์๋ํ๋์ง ์๊ณ ์ถ์ต๋๋ค.
๊ทธ ํ ๋ด ๊ธฐ๊ธฐ ์ค์ ๋ฐ ์์น์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ด ํธ์ ์๋ํฉ๋๋ค.
๋ชจ๋ ๊ฐ์ฌํฉ๋๋ค !
@badis ์ฑ์ AndroidManifest.xml์ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
์ ์ถ๊ฐ ํ์ต๋๊น?
@badis ์ด์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. https://github.com/facebook/react-native/issues/7495#issuecomment -228730196์ ์ ์ ๋๋๋ก ๋ง์ง๋ง ์ธ์ (์ด์์ ์ด์ง ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค)๋ฅผ ์ ๊ฑฐํ๋ฉด ์๋ํฉ๋๋ค.
Android์ ๊ธฐ๋ณธ ์ต์ ์ ๋ฌด์์ ๋๊น? ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค (LocationModule.java ๊ฒ์ฌ์์).
{
enableHighAccuracy : false, // GPS ์ฌ์ฉ ์ ํจ
maximumAge : Double.POSITIVE_INFINITY, // ์บ์ ๋ ์์น ํ์ฉ
์ ํ ์๊ฐ : Long.MAX_VALUE,
distanceFilter : 100
}
๋ํ ๋์ผํ ์์น ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ธ ๋ฒ์งธ ์ต์ ๋งค๊ฐ ๋ณ์ ๋นํ์ฑํ๋ '๋์ ์ ํ๋'๋ฐ '๋ฐฐํฐ๋ฆฌ ์ ์ฝ'๋ชจ๋์์ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฅ์น๋ ๋งค๋ฒ ์คํจํฉ๋๋ค. enableHighAccuracy to true๋ ์ฅ์น๋ฅผ ์ค์ ํ ๋ชจ๋์ ๊ด๊ณ์์ด ์คํจํฉ๋๋ค.
Android Dev ์ฌ์ดํธ์์ ์ ์ํ ๊ฒ์ฒ๋ผ FusedLocationProviderClient๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋๊น?
์ธ ๋ฒ์งธ ์ต์ ๋งค๊ฐ ๋ณ์๋ฅผ ๋นํ์ฑํํ๋ฉด '๋์ ์ ํ๋'๋ฐ '๋ฐฐํฐ๋ฆฌ ์ ์ฝ'๋ชจ๋์์ ์๋ํฉ๋๋ค.
@mkpietrzyk ๊ทธ๋์ options
์๋ตํ๋ฉด์ด ๋ ๊ฐ์ง ๋ชจ๋์์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋์๋์?
์๋ ํ์ธ์.
์, Android์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ฑฐ์ ๋ฌดํํ ์๊ฐ ์ด๊ณผ์ ์ฑ์ maximumAge๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ ์ผ๋ถ ์กฐ๊ฑด์ ํ์ธํด์ผํ๋ ์์น๋ฅผ ์์์ผํ๊ธฐ ๋๋ฌธ์ ์ผ์ข ์ ์ฑ ํฌ๋ฌ์ ๋๋ค.
์ฌ๊ธฐ์์ @hoorsa ์๋ฃจ์ ์ ์ฌ์ฉํ์ฌ gps๋ฅผ ํ์ธํ๋ ๊ฒ๋ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ด์จ๋ gps์ ๋ํด ๋งค์ฐ ๊น๋ค ๋กญ๊ณ ๋๋ก๋ highAccuracy์ ์๋ตํ์ง ์์ต๋๋ค ... ๊ทธ๋์ ๊ทธ๊ฒ์ด ์ ์๋ํ๋ค๊ณ ์๊ฐํ์ง ์์์ง๋ง ํค์ด, ์ฝ๊ฐ ์๋ํฉ๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ํ์ ์์์ด ์๋ํ๋ ค๋ฉด ์์ฒญ๋๊ฒ ๋์ ์๊ฐ์ผ๋ก ์ค์ ํด์ผํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ ๋ณด์ ๋ ๋นจ๋ฆฌ ์ก์ธ์คํด์ผํฉ๋๋ค. ์ฑ์ ์ฒ์ ๋ง๋ค๋ฉด 0.5 ์ด ์ด๋ด์ ์ ๋ฐ ์์น์ ๋ํ ์ก์ธ์ค ๊ถํ์ด ์ ํจํ์ง ๋ก๊ทธ ํ ์ ์์ต๋๋ค. ์ ๋ฐ ์์น ๊ตฌํ์ ๋จ์ํ Android์์ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์๊ณ ์๋ํ์ต๋๋ค. ์ถ๊ฐ ์ต์
์ด ์์ด๋ ์์น๋ฅผ๋ก๋ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. One Plus One์์ ํ
์คํธ๋ฅผ ์ํํ์ต๋๋ค.
์ด ์๊ฐ ์ด๊ณผ ๋ฌธ์ ๋ ์์ต๋๋ค.
RN .50.3
maximumAge ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉ ํ์ง ์๊ณ API ํธ์ถ ์๋ :
{enableHighAccuracy : true, ์๊ฐ ์ด๊ณผ : 10000},
๋๋ ๋ํ์ด ์ ํ๋ฅผ ๊ถํ ์์ฒญ์ผ๋ก ๋ํํ๋ฏ๋ก ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค.
PermissionsAndroid.request (
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
๊ธฐ๊ธฐ์์ ๋์ ์ ํ๋ ๋ชจ๋๊ฐ ์ฌ์ฉ ์ค์ ๋์์ต๋๋ค.
๋งค๋ํ์คํธ์ ์ฌ๋ฐ๋ฅธ ๊ถํ์ด ์์ต๋๋ค.
๋ด Galaxy S7์์-์์น๋ฅผ ์ ํด๊ฒฐํฉ๋๋ค.
๋ด Pixel 2์์-GPS ์ ํธ๊ฐ์๋ ์์น์์ 10 ์ด์ ์๊ฐ ์ด๊ณผ ํ ์๊ฐ ์ด๊ณผ๋ฉ๋๋ค.
์๋ฎฌ๋ ์ดํฐ์์ ํ์ฅ ๋ ์ปจํธ๋กค์ ์์น ํญ์ผ๋ก ์ด๋ํ๊ณ ๋ณด๋ด๊ธฐ๋ฅผ ํด๋ฆญํ์ฌ ์์น๋ฅผ ๋ณด๋ด์ง ์๋ ํ 10 ์ด ์๊ฐ ์ด๊ณผ ํ์ ์๊ฐ์ด ์ด๊ณผ๋ฉ๋๋ค.
navigator.geolocation.getCurrentPosition์ ์ด์ ์ ์์น๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์บ์ ๋ ์ด์ ์์น๊ฐ ์์ด๋ gps ์ ํธ๊ฐ ์์ผ๋ฉด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋์ ์ ํ๋๋ฅผ ์๋ํ ๋ค์ @olieidel ์ด ํ ๊ฒ์ฒ๋ผ ์คํจํ๋ฉด ๋์ ์ ํ๋๋ก ์ฅ์ ์กฐ์น
@jacksontbryan ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ง๋ง maximumAge
๊ฐ ์๋ต๋๋ฉด getCurrentPosition
๋ ์บ์ ๋ ์์น๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Galaxy S7์์๋ ์ ์๋ํ์ง๋ง LG G6์์๋ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. LG์์๋ maximumAge๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ ๊ฑฐ์ ๋ชจ๋ ์๊ฐ์ด ์ด๊ณผ๋ฉ๋๋ค. maximumAge๊ฐ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ์ด์ ์์น๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํธ์ง : ์ต์ ์ธ์๋ฅผ ๋ชจ๋ ์๋ตํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์์ ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ชจ๋ ์ฌ๋์ด Android์์ ์์ฒด ๋ค์ดํฐ๋ธ ๋ชจ๋ ๊ตฌํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ตฌํํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ๊ณ GPS๋ฅผ ํจ์ฌ ๋ ๋ง์ด ์ ์ด ํ ์ ์์ผ๋ฉฐ ์ผ๋ถ ์ฅ์น์์ ์ฑ์ด ์๋ํ์ง ์๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
public Location getBestLastKnownPosition(Context context) {
LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
List<String> providers = locationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
Location l = locationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
// Found best last known location: %s", l);
bestLocation = l;
}
}
if (bestLocation == null) {
locationManager.requestSingleUpdate(new Criteria(), this, null);
}
return bestLocation;
}
private static WritableMap locationToMap(Location location) {
WritableMap map = Arguments.createMap();
WritableMap coords = Arguments.createMap();
coords.putDouble("latitude", location.getLatitude());
coords.putDouble("longitude", location.getLongitude());
coords.putDouble("altitude", location.getAltitude());
coords.putDouble("accuracy", location.getAccuracy());
coords.putDouble("heading", location.getBearing());
coords.putDouble("speed", location.getSpeed());
map.putMap("coords", coords);
map.putDouble("timestamp", location.getTime());
map.putString("provider", location.getProvider());
if (android.os.Build.VERSION.SDK_INT >= 18) {
map.putBoolean("mocked", location.isFromMockProvider());
}
return map;
}
<strong i="6">@ReactMethod</strong>
public void getCurrentPosition(Callback successCallback, Callback errorCallback){
Location l = getBestLastKnownPosition(this.getReactApplicationContext());
if (l == null){
errorCallback.invoke("Failed to retrieve current location");
return;
}
successCallback.invoke(locationToMap(l));
}
private static class LocationOptions {
private final long timeout;
private final double maximumAge;
private final boolean highAccuracy;
private final float distanceFilter;
private LocationOptions(
long timeout,
double maximumAge,
boolean highAccuracy,
float distanceFilter) {
this.timeout = timeout;
this.maximumAge = maximumAge;
this.highAccuracy = highAccuracy;
this.distanceFilter = distanceFilter;
}
private static LocationOptions fromReactMap(ReadableMap map) {
// precision might be dropped on timeout (double -> int conversion), but that's OK
long timeout =
map.hasKey("timeout") ? (long) map.getDouble("timeout") : Long.MAX_VALUE;
double maximumAge =
map.hasKey("maximumAge") ? map.getDouble("maximumAge") : Double.POSITIVE_INFINITY;
boolean highAccuracy =
map.hasKey("enableHighAccuracy") && map.getBoolean("enableHighAccuracy");
float distanceFilter = map.hasKey("distanceFilter") ?
(float) map.getDouble("distanceFilter") :
10;
return new LocationOptions(timeout, maximumAge, highAccuracy, distanceFilter);
}
}
<strong i="7">@ReactMethod</strong>
public void watchPosition(ReadableMap options, Callback successCallback, Callback errorCallback){
LocationOptions opts = LocationOptions.fromReactMap(options);
LocationManager locationManager = (LocationManager)this.getReactApplicationContext().getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
if (opts.highAccuracy) {
criteria.setAccuracy(Criteria.ACCURACY_FINE);
}
String bestProvider = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(bestProvider, 1000, opts.distanceFilter, this);
}
<strong i="8">@Override</strong>
public void onLocationChanged(Location location) {
if (location == null) return;
this.getReactApplicationContext()
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit("locationChanged", locationToMap(location));
}
@Buthrakaur ์ค ๋ํซ์ ๋ํ ๋ค์ดํฐ๋ธ ๋ชจ๋์ ๋ง๋ค๋ ค๊ณ ํ๋๋ฐ ๋น๋์ ์คํจํ๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค. ๋๋ ๋ด ์์ https://gist.github.com/pewh/1fd64c8f0b3797ef2b7a7046b5a5f974๋ฅผ ๊ฒ์ํ์ผ๋ฉฐ ๋๊ตฐ๊ฐ๊ฐ ๋ด ์์ ์ ์น์ ํ๊ฒ ์์ ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋จํ ๊ฐ์ฌํฉ๋๋ค & ๋ฉ๋ฆฌ ํฌ๋ฆฌ์ค๋ง์ค!
์ต์ ์์ด navigator.geolocation.getCurrentPosition์ ํธ์ถํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ์ฑ๊ณต ๋ฐ ์ค๋ฅ ์ฝ๋ฐฑ ๋ง ์ ๋ฌํ๊ณ ์์ต๋๋ค.
Android 5.1์ด ์ค์น๋ ์ค์ ๊ธฐ๊ธฐ์์ ํ ์คํธ๋์์ต๋๋ค.
@ginex ๋ฐ์ดํฐ๊ฐ ์๋ก์ด ๊ฒ์ด ํ์คํฉ๋๊น? ๊ทธ๋ ๊ฒ ํ ๋ ๋๋๋ก ํ ์๊ฐ์ง๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ป์ต๋๋ค. (๋ด๊ฐ ํ ์๊ฐ ์ ์ ์์๋ ๊ณณ์ด๋ผ๊ณ ์ ํ ์์ต๋๋ค).
์ด๊ฒ์ ์ ๋ง๋ก ๊ณ ์ณ ์ ธ์ผํฉ๋๋ค!
์๋ ํ์ธ์
๋๋ ๋ํ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ์ผ๋ถ ์ฅ์น์์ ์๊ฐ ์ด๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๊ฐ ์ ํ์ 2 ์ด์์ 10 ๋ถ์ผ๋ก ๋ ๋ ธ์ง๋ง 10 ๋ถ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋๋ ๋ํ enableHighAccuracy : false๋ก ์๋ํ๋ค. ์ด ๊ฒฝ์ฐ ์์น๋ฅผ ์ ์ ์์ต๋๋ค (์ฅ์น ๋ชจ๋ ์ ์ธ).
๋๋ ๋ํ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๋ฌํ์ง ์๊ณ ์๋ํ์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์์น๋ฅผ ์ ์ ์์ง๋ง ์ฅ์น ๋ชจ๋๋ ์ ์ธ๋ฉ๋๋ค.
๋ํ maximumAge๋ฅผ ์ ๋ฌํ๋ ค๊ณ ์๋ํ์ง๋ง ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ ๋ด ์ฝ๋์
๋๋ค.
getCurrentPosition () {
navigator.geolocation.getCurrentPosition (
(์์น) => {
console.log ( '์์น ๊ฐ์ ธ ์ค๊ธฐ');
this.location = {
๊ฒฝ๋ : position.coords.longitude,
์๋ : position.coords.latitude,
์ค๋ฅ : null,
};
},
(์ค๋ฅ) => {
console.log ( '์์น ์ค๋ฅ ๊ฐ์ ธ ์ค๊ธฐ', error);
this.location = {
๊ฒฝ๋ : null,
์๋ : null,
์ค๋ฅ : error.message,
};
},
{
enableHighAccuracy : true,
์๊ฐ ์ด๊ณผ : 600000
},
);
}
skipPermissionsRequest๋ฅผ ์ฌ์ฉ ์ค์ด๊ณ geoLocation์ด ์๊ฐ ์ด๊ณผ ๋ ๊ฒฝ์ฐ # 17487์ ์ฐธ์กฐํ์ธ์.
์๋ ํ์ธ์
@ngandhy- ์๋์, 'skipPermissionRequests': true๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. minSdkVersion์ 16์ ๋๋ค.
๋๋ ์ฌ๋ฌ๋ถ ๋ชจ๋์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฌ๋๋ค์ด ์๋๋ก์ด๋์ ๋ํด ์ธ๊ธํ๋ ๋ชจ๋ ์กฐํฉ์ ์๋ ํ๊ณ ์ด react-native-background-geolocation์ผ๋ก ํด๊ฒฐํ๋ฉด ์ ์ฅ๋ ์์น์ ์ฌ์ง์ด gps ์์น๋ฅผ ์ป์ ์ ์์ผ๋ฉฐ ์ด๋ฌํ ์์น๋ ๋งค์ฐ ์ ํํฉ๋๋ค.
@badis
๊ทํ์ ์๋ฃจ์
์ด ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
์์ ์ ๋ด ๋ฐฉ๋ฒ :
getUserLocationHandler() {
navigator.geolocation.getCurrentPosition(position => {
console.log(position.coords.latitude, position.coords.longitude);
}, err => {
console.log(err);
}
}
์์ ํ ๋ด ๋ฐฉ๋ฒ :
getUserLocationHandler() {
navigator.geolocation.getCurrentPosition(position => {
console.log(position.coords.latitude, position.coords.longitude);
}, err => {
console.log(err);
},
{enableHighAccuracy: false, timeout: 15000, maximumAge: 3600000});
}
์ด ์ฝ๋๋ฅผ ํ
์คํธํ๊ธฐ ๋งํ๋ฉด ํด๊ฒฐ์ฑ
์ด ๋ ์ ์์ต๋๋ค.
https://www.abidibo.net/blog/2017/11/23/geolocation-react-native/
์ด ๋ฌธ์ ๋ ํด๊ฒฐ ๋์์ต๋๊น?
ํ๋์์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํด ์์ผ๋ฉฐ ์ผ๊ด๋๊ฒ ์๋ํ๋ ์ ์ผํ "์๋ฃจ์ "์ "enableHighAccuracy"๋ฅผ ๋นํ์ฑํํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋ฌธ์ ๋ GPS ๋์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์น๋ฅผ ๊ฒฐ์ ํ๋ฏ๋ก ์ ํ๋๊ฐ ํฌ๊ฒ ๋จ์ด์ง๋๋ค.
๋ค๋ฅธ ๋ง์ ์๋ฃจ์ ์ด ์ฒ์์๋ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์บ์ ๋ ์์น๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ฉฐ ํด๋ํฐ์ ๋ค์ ์์ํ๊ณ ์ฑ์ ์คํํ๋ฉด ์ฌ์ ํ ์คํจํฉ๋๋ค.
์ค๋ ์ ๋ Android ์์น ์ฉ Google์ ํตํฉ ์์น API๋ฅผ ์ฌ์ฉํ๊ณ iOS ์ฉ ๊ธฐ๋ณธ React Native ๊ตฌํ์ผ๋ก ๋์๊ฐ๋์ด ํจํค์ง๋ฅผ ์ฐพ์์ต๋๋ค (์ด ํจํค์ง์ ์์ฑ์๋ ์๋์ง๋ง ์์ฑ์ ๋ํ ์ฐฌ์ฌ).
https://www.npmjs.com/package/react-native-geolocation-service
์ง๊ธ๊น์ง ์กฐ๊ธ๋ง ํ ์คํธํ์ง๋ง ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@globetro ๊ฐ์ฌํฉ๋๋ค! ๋๋ ์ด๊ฒ๋ ํ์ธํ๊ณ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค!
@globetro ๊ฐ์ฌํฉ๋๋ค.
react-native-geolocation-service ๊ฐ ์ต๊ณ ์ ์๋ฃจ์
์
๋๋ค.
@globetro ๋๋ ๋ํ์ด ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ฑ๊ณตํ์ต๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ณธ ์์น ์ ๋ณด ๊ธฐ๋ฅ์ผ๋ก react-native์ ๋ณํฉ๋์ด์ผํฉ๋๋ค!
react-native-geolocation-service๊ฐ ๋๋ฅผ ๋์ง ์์ต๋๋ค :(
๊ฐ์ฌํฉ๋๋ค @globetro ํจํค์ง * react-native-geolocation-service * ๋ ์๋ฒฝํ๊ฒ ์๋ํ์ต๋๋ค.์ด๋ฅผ React Native์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋น์ ์ ์ ๋ง๋ก ๋ ๊ฐ์ ์์น ๋ฆฌ์ค๋ (๋น์ผ)๋ฅผ ์ํฉ๋๋ค. ํ๋๋ ๋์ ์ ํ๋๋ฅผํ๊ณ ๋ค๋ฅธ ํ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ 'ํ์ฌ'์์น๋ณด๋ค ๋ ์ ํํ๊ณ ์๋ก์ด ์์น๋ฅผ ๋น๊ตํ๊ณ ์ถ์ต๋๋ค.
์ด๊ฒ์ '์์'์๋ฃจ์ ์ ๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก RN ์ธก์์ ๊ตฌํ๋์ด์ผํ๋ฏ๋ก highAccuracy๊ฐ ํ์ฑํ ๋ ๊ฒฝ์ฐ COARSE ๋ฐ FINE ๊ถํ์ ๋ชจ๋ ์ฌ์ฉํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๋ค์์ promise๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ ๊ตฌ์ฑ ์์์
๋๋ค.
https://gist.github.com/a3diti/5466f7309752cbb2e63ecefff6365bb9
Android์์๋ maximumAge
์ ๊ฑฐํ๊ณ enableHighAccuracy
์ true
์ผ๋ก ์ ์งํ๊ณ RN PermissionsAndroid
๊ตฌ์ฑ ์์์์ ๊ถํ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
@ a3diti ์ค์ ์ธ๊ณ์์ ํ ์คํธ ํด
@ a3diti ์ต์ ๋ฐ์ ๋ค์ดํฐ๋ธ ๋ฆด๋ฆฌ์ค์์ ์์ ํ์ง ์๋ ํ Android์์๋ ํญ์ ์๋ํ์ง ์์ต๋๋ค. ์ฌ๋ถํ ํ ์ค์ Android ๊ธฐ๊ธฐ์์ ์คํ ํด๋ณด์ธ์. ํ์ ์์์ด ์๋๋ผ๋ฉด ์์น ์ ๋ฐ์ดํธ๋ฅผ๋ฐ๋ ๋ฐ 20 ์ด ์ด์ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ฌ๊ธฐ https://www.npmjs.com/package/react-native-geolocation-service ์ ์ฌ์ฉ ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ ๋ณํฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋์ผํ "์์ฒญ ์๊ฐ ์ด๊ณผ ๋ฌธ์ "์ ์ง๋ฉด ํด ์์ต๋๋ค. R & D ํ "์ฌ๋ถํ "์ฅ์น๋ฅผ ์๋ํ ๋ค์ ์์น ๋ฐ ์๋์ ํ์ธํฉ๋๋ค.
๋ด ์ฝ๋๋ฅผ ํ์ธํ์ญ์์ค.
componentDidMount = () => {
navigator.geolocation.getCurrentPosition (
(์์น) => {
const initialPosition = JSON.stringify (์์น);
this.setState ({initialPosition});
},
(์ค๋ฅ) => alert (error.message),
{enableHighAccuracy : false, ์๊ฐ ์ด๊ณผ : 20000, maximumAge : 1000, distanceFilter : 1}
);
this.watchID = navigator.geolocation.watchPosition((position) => {
const lastPosition = JSON.stringify(position);
this.setState({ lastPosition });
Alert.alert("Location change",lastPosition);
});
}
์ฌ๋๋ค์ด ์ฌ์ ํ ์ด๊ฒ์ ์ฌ์ฉํ์ง ์๊ณ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ ์ด์
https://www.npmjs.com/package/react-native-geolocation-service
์ด์ ์ ์ ์ํ๋๋ก? ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
๋ค๋ฅธ ์ฌ๋์๊ฒ๋ ํจ๊ณผ๊ฐ ์์ต๋๊น?
์ด๊ฒ์ AndroidManifest.xml ํ์ผ์ ์ถ๊ฐํ๋ฉด ์๋ํฉ๋๋ค!
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
์๋ค ์,
@globetro๊ฐ ์ ์ํ๋๋ก react-native-geolocation-service ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง ์ฑ์ด ์ฆ์ ์ถฉ๋ํฉ๋๋ค. ์ด๋ค ์์ด๋์ด?
@ Patrick-Bayer ์๋ํ๋ Google Play์ ๋ด ์ฑ์์ ์ฌ์ฉํ๊ณ ์์ง๋ง ๊ฐ๋ฐ ๋ฒ์ ์ด ์ ์์๋ ์ด์ ๋ก ์ฆ์ ์ถฉ๋ํฉ๋๋ค. ๋์๊ฒ๋ ์ถฉ๋์ ์ผ์ผํค๋ react-native-geolocation-service ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
Fatal Exception: java.lang.VerifyError: Verifier rejected class com.google.android.gms.location.FusedLocationProviderClient: void com.google.android.gms.location.FusedLocationProviderClient.<init>(android.app.Activity) failed to verify: void com.google.android.gms.location.FusedLocationProviderClient.<init>(android.app.Activity): [0x8] register v2 has type Precise Reference: com.google.android.gms.common.api.internal.zzg but expected Precise Reference: com.google.android.gms.common.api.internal.zzcz
ํด๊ฒฐ์ฑ ์ ์ฐพ์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
@oakis ๋ค์ ๋จ๊ณ๊ฐ ์ ์๊ฒ
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
๋๋ก๋ AndroidManifest.xml์ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
์ ์ถ๊ฐ ํ ํ์๋ ์ฌ์ ํ ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
๋น ๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
)
if (granted == PermissionsAndroid.RESULTS.GRANTED) {
// WHATEVER WAY YOU WANT THEM TO KNOW THAT THEY HAVE GRANTED THE PERMISSION //MAY BE USING BASIC ALERT OR TOASTANDROID
}
else {
//SAME AS ABOVE
}
} catch (error) {
//catch the error
alert(error);
}
enableHighAccuracy
๋์ ์ ๊ฑฐ, ๊ฑฐ์ง์ผ๋ก maximumAge
ํ๊ณ ์ฆ๊ฐ timeOut
. {enableHighAccuracy: true, timeout: 100000,}
์ ๊ฐ์ ๊ฒ์ด ์ข์ต๋๋ค.๋๋ ์ด๊ฒ์ด ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ฅผ ์ํด enableHighAccuracy๋ฅผ true๋ก ์ค์ ํ๋ฉด API 23์์ ์๋ํ์ง๋ง API 26์์ false๋ก ์ค์ ํด์ผํฉ๋๋ค.
(๋ด๊ฐ ํ
์คํธํ๋ ์ ์ผํ ๊ฒ์
๋๋ค)
ํธ์ง : ๋๋ react-native-geolocation-service ์ค์น๋ฅผ ๋๋ด๊ณ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค ๐ฅ
์๋ ํ์ธ์,
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๊ณ ์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค.
AndroidManifest.xml์ ์๋ uses-feature
ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋๋ฐ ์ฑ์ด highAccuracy: true
์ ๋๋ก ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
<uses-feature android:name="android.hardware.location.gps" />
highAccuracy: high
์ ์ค์ ํ๋ฉด React Native๊ฐ NETWORK_PROVIDER ๋์ GPS_PROVIDER๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค. Android ๊ฐ๋ฐ์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด API 21 ์ด์์ ๋์์ผ๋กํ๋ ์ฑ์ GPS_PROVIDER๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด AndroidManifest.xml์์ด ํ๊ทธ๋ฅผ ํฌํจํด์ผํฉ๋๋ค.
์ฃผ์ : ์ฑ์ด Android 5.0 (API ๋ ๋ฒจ 21) ์ด์์ ๋์์ผ๋กํ๋ ๊ฒฝ์ฐ ์ฑ์ด ๋งค๋ํ์คํธ ํ์ผ์์ android.hardware.location.network ๋๋ android.hardware.location.gps ํ๋์จ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ฑ์ NETWORK_PROVIDER ๋๋ GPS_PROVIDER์์ ์์น ์ ๋ฐ์ดํธ๋ฅผ๋ฐ์ต๋๋ค. ์ฑ์ด ์ด๋ฌํ ์์น ์ ๊ณต ์ ์ฒด ์์ค ์ค ํ๋์์ ์์น ์ ๋ณด๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ ์ฑ์ด ์ฑ ๋งค๋ํ์คํธ์์ ์ด๋ฌํ ํ๋์จ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํจ์ ์ ์ธํด์ผํฉ๋๋ค. Android 5.0 (API 21) ์ด์ ๋ฒ์ ์ ์คํํ๋ ๊ธฐ๊ธฐ์์ ACCESS_FINE_LOCATION ๋๋ ACCESS_COARSE_LOCATION ๊ถํ ์์ฒญ์๋ ์์น ํ๋์จ์ด ๊ธฐ๋ฅ์ ๋ํ ๋ฌต์์ ์์ฒญ์ด ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ถํ์ ์์ฒญํด๋ Android 5.0 (API ๋ ๋ฒจ 21) ์ด์์์ ์์น ํ๋์จ์ด ๊ธฐ๋ฅ์ด ์๋์ผ๋ก ์์ฒญ๋์ง๋ ์์ต๋๋ค.
https://developer.android.com/guide/topics/location/strategies#Permission
LocationManager๊ฐ NETWORK_PROVIDER๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ highAccuracy: false
๋ฅผ ์ค์ ํ ๋ AndroidManifest.xml์ android.hardware.location.network
๋ฅผ ํฌํจ ํ ํ์๊ฐ์๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์์ ๋ฐ๋ผ ํ๊ทธ๊ฐ ํ์ํฉ๋๋ค.
์ด ์๋ฃจ์ ์ด ํจ๊ณผ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ช ๊ฐ์ง ์คํ์ํ๋๋ฐ ์๊ฐ ์ ํ์ด Google์ ์์น ์๋น์ค๊ฐ ๊ธฐ๊ธฐ์์ ํ์ฑํ๋์ด ์๋์ง ์ฌ๋ถ์ ๊ด๋ จ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฅ์น์์ ์์น ์๋น์ค๋ฅผ ์ผค ๋ "์์น ์ ํ๋๋ฅผ ๊ฐ์ ํ์๊ฒ ์ต๋๊น?"๋ผ๋ ๊ฒฝ๊ณ ์์๊ฐ ํ์๋ฉ๋๋ค. Google์ ์์น ์๋น์ค๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๊ณ Google์ ์์น ๋ฐ์ดํฐ๋ ์ ์ก๋๋ค๋ ํ
์คํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฅ์น ๋๋ ์๋ฎฌ๋ ์ดํฐ์์ ๋ฐ์ํฉ๋๋ค. ์ฐ๋ฆฌ ๋๋ถ๋ถ์ ์ด๋ฏธ ์ผ๋ฐ ์ฅ์น์์์ด ๊ธฐ๋ฅ์ ํ์ฑํํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด ๊ธฐ๋ฅ์ด ํ์ฑํ๋์ง ์์ ๊ฒฝ์ฐ ์ฅ์น๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ๋๋ง๋ค ์ ์์น๋ฅผ ๊ฐ์ ธ์์ผํฉ๋๋ค ( maximumAge
์ค์ ์ ์ํด ์ ์ด ๋จ). ํ๋์ ์์น๋ฅผ ์์ฒญํ์ง ์์๊ณ timeout
๊ฐ์ด ์ ์์น๋ฅผ ๊ฐ์ ธ ์ค๊ธฐ์ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ navigator.geolocation.getCurrentPosition
๋ ์๊ฐ ์ ํ์ ๋ฐํํฉ๋๋ค.
๋ํ ๊ธฐ๊ธฐ์์ Google์ง๋๋ฅผ ํ ๋ฒ ์ด๋ฉด์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ ๊ฒ์ ๋ณด์์ต๋๋ค (๋ค์ ์ ์์น๋ฅผ ๊ฐ์ ธ์ด).
๋ค์ ๋งํ์ง๋ง ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ค๋ช / ์๋ฃจ์ ์ด๋ผ๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์ด ์ค๋ ๋์ ๋ด ๊ด์ฐฐ ๋ด์ฉ์ ์ถ๊ฐํ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค.
์ ์ ๋ ๋ชจ๋ ์ค ํ๋์์ ์ฝ์ด๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ ์คํธ๋ฆผํ๋ ๋ฐ ๊ด์ฌ์ด์๋ ์ฌ๋์ด ์์ต๋๊น?
๋ฉฐ์น ์ ์ RN ์์น ์ ๋ณด ๋ชจ๋๊ณผ ํธํ๋์ง๋ง ๊ฐ์ฅ ํจ์จ์ ์ธ Android ์ฉ Google ์์น API๋ฅผ ์ฌ์ฉํ๋ react-native-cross-geolocation ์ ๊ฒ์ํ์ต๋๋ค. ๊ทธ ๋๋ฌธ์ ๋ด ๋ชจ๋์ด RN ์ฝ์ด์ ํตํฉ ํ ์์๋ ํ๋ณด๊ฐ ์๋๋ผ๊ณ ์๊ฐํ์ง๋ง ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ ์ฌ๋์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
react-native-geolocation-service ์ด ํจํค์ง๋ ์ตํฉ ๋ ์์น API๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์์น๋ฅผ ๊ฐ์ ธ ์ค๊ฑฐ๋ ์์น๋ฅผ๋ณด๊ธฐ ์ํด ์ ์๋ํฉ๋๋ค. @hramos ๋ฐ @reyalpsirc ์๋ํด์ฃผ์ธ์.
@hramos ์ตํฉ ์์น๋ Google Play ์๋น์ค์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ๋ผ์ด์ ์ค๊ฐ
๋๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ์๋ํ์ง๋ง ์ผ๊ด์ฑ์ด ์๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. ์ ์ฉํ ์ ๋ณด๋ฅผ ์ฐพ์์ต๋๋ค.
๋์ ์ ํ๋๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ gps + ๋คํธ์ํฌ (์ด๋ ํต์ ์ฌ ์๋น์ค)๋ฅผ ํตํด ์์น๋ฅผ ์ฐพ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฑ ์์ค ๊ถํ์ ํ์ธํ ํ ๋ด ์ฅ์น์์ ์ด๋ ํต์ ์ฌ ์๋น์ค์ ์์น ๊ถํ์ด ๋นํ์ฑํ๋์์ต๋๋ค. ๊ทธ๊ฒ์ ํ์ฑํํ๊ณ navigator.geolocation.getCurrentPosition ()์์ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ฉด ์ ์๊ฒ ํจ๊ณผ์ ์
๋๋ค.
์ํ
-๊ธฐ๊ธฐ์ ์ค์ -> ๋ณด์ ๋ฐ ์์น-> ์์น-> ์ฑ ์์ค ๊ถํ์ผ๋ก ์ด๋ํฉ๋๋ค.
-ํต์ ์ฌ ์๋น์ค์ ๋ํ ์์น ๊ถํ ํ์ฑํ
-getCurrentPosition์์ ์์น ๊ตฌ์ฑ (์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์) ์ ๊ฑฐ
-์ฅ์น๋ฅผ ๋ค์ ์์ํ์ญ์์ค
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
๊ด๋ จ์ฑ์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ https://snack.expo.io/SkJqg8gYm์ ํ ์์ ๋๋ค
{enableHighAccuracy: true, timeout: 10000, maximumAge: 0}
๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฑด๋ ๋ฐ๊ฑฐ๋ 10000 ๊ฐ ๋ฏธ๋ง์ ๊ฐ์ ์ ๊ณตํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์์ ์ธ ๊ฐ์ง ๋งค๊ฐ ๋ณ์๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ฉด ์ต์ํ ์๋ฎฌ๋ ์ดํฐ์์ ๋ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
_AndroidManifest.xml_ ์์ด ๊ถํ์ ์ถ๊ฐ
<_uses-permission i = "6"/>
<_uses-permission i = "8"/>
<_permission_ i = "10"/> _android : name = "android.permission.ACCESS_COARSE_LOCATION"_
_android : protectionLevel = "signature"_ />
<_permission_ i = "13"/> _android : name = "android.permission.ACCESS_FINE_LOCATION"_
_android : protectionLevel = "signature"_ />
์๋
ํ์ธ์ ๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค "์์ฒญ ์๊ฐ ์ด๊ณผ"์์ ์ฃผ์ด์ง ๋ชจ๋ ๊ฐ๋ฅํ ํด๊ฒฐ์ฑ
์ ์๋ํ์ง๋ง ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ง๋ง ์ต๊ทผ ์์ด ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ๋ ํ๋์ ๋ชจ๋์ ๋ฐ๊ฒฌํ์ต๋๋ค.
https://www.npmjs.com/package/react-native-geolocation-service
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ๋ค .....
@vishalTechnoFreek ๋ react-native-cross-geolocation๋ ์์ต๋๋ค.
ํ์ฌ RN ์ง๋ฆฌ์ ์์น์ ์์ ํ ํธํ๋์ง๋ง ์๋ก์ด Google API๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด API๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ๋ชจ๋๋ฅผ ์ฌ์ฉํ ์ง ๊ฑฑ์ ํ ํ์๊ฐ ์์ผ๋ฉฐ ์๋น์ค๊ฐ ์๋์ผ๋ก ์ต์์ ์ต์ ์ ๊ฐ์งํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ฅ์ ์ RN์ด์ด ๋ฌธ์ ๋ฅผ ์์ ํ ๋ ์ํ๋ ๊ฒฝ์ฐ ์ฑ์ ์ํฅ์์ฃผ์ง ์๊ณ ์ ๊ฑฐ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
ํ์์ ๊ฒฝ์ฐ @manurana ๊ฐ Google์ง๋ ์ฑ์ (๋ค์ด๋ก๋ํ๊ณ ) ์ฌ๋ ๊ฒ์ ๋ํด ์ธ๊ธ ํ ๋ค์ Expo๋ก ๋์๊ฐ์ ํธ๋ฆญ์ ์ํํ์ต๋๋ค.
์ ๋ Genymotion๊ณผ Android 5๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ํ Genymotion ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์์น๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฝ์ผ๋ ค๋ฉด Genymotion์์ง๋ ์ฐฝ์ ์ด์ด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ํ์ง๋ง ๊ธฐ๋ณธ Geny์ ์์น๋ก
enableHighAccuracy
์true
๋๋false
์ค์ ํด๋ ์๋ํ์ง ์์ต๋๋ค.
๋ค์ดํฐ๋ธ ๋ชจ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํดgetCurrentPosition
์ ๋ํ ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ตํ๋ฉด ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค.
์๋ช ์ ์์ธ ๐ ์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
์ฌ๋ฌ๋ถ,
๋๋ ๊ฐ์ ์ค๋ฅ์ ์ง๋ฉดํ์ง๋ง ๋๋ฃ๋ค๊ณผ ๋ช ๋ฒ์ ์ฌ์๋ ํ์ ์ด์ํ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค (ํ์ง๋ง GPS์ ๋ํด ์๊ฐํ๋ค๋ฉด ์ ์์ ๋๋ค).๋ฌผ๋ฆฌ์ ์ฅ์น๋ฅผ ์ฌ์ฉํ์ฌ "์ฌ๋ฌด์ค ๋ด๋ถ" ํ ์คํธ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ GPS ๋ก์ผ์ดํฐ๋ ๋ฒฝ๊ณผ ๊ฐ์ ์ธ๋ถ ๋ฌผ์ฒด ๋๋ "์ค๋ด"์์์ด ์์ ์ ์ํํ๋ ค๋ ๊ฐ๋จํ ์ด์ ์ ์ํด ๋ฐฉํด๋ฅผ๋ฐ์ ์ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ค์ธ์์ ์คํํด์ผํฉ๋๋ค. .
๊ทธ ํ ์ฌ๋ฌด์ค์์ ๋๊ฐ์ ํ ์คํธ๋ฅผ ๋ค์ ์คํํ๊ณ ์ฅ์น๊ฐ ๊ณํ๋๋ก ์๋ตํฉ๋๋ค (์์ฒญ ์๊ฐ ์ด๊ณผ ์ค๋ฅ๊ฐ ์์ ๋์ง ์์).
๋ด ์ ์์ "enableHighAccuracy"๋ฅผ true๋ก ์ค์ ํ์ฌ ์ง๋ฆฌ์ ์์น๋ฅผ ์๋ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์คํจํ๋ฉด (์ฌ๋ฌด์ค์์๋ ์คํจ ํ ์ ์์) false๋ก ๋ค์ ์๋ํ์ญ์์ค. ์ ๊ฒฝ์ฐ์๋ ์๋ํฉ๋๋ค.
์ด๊ฒ์ด ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ง๋ง enableHighAccuracy
์ false
๊ฒ์ ๋์๊ฒ ์ ํฉํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์๋ฒฝ ํด ๋ณด์ด๋์ด ์๋ฃจ์
์ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
์ฌ๋ฌ ์์ฒญ์์ ๋น์ทํ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค (๊ณ์ ํ์ฌ ์์น ์ฌ์ฉ ์ ํ) ์์น ์์ฒญ์ ๋ํ ์ฌ ์๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ ํํ ๋ฌธ์ ๋ ์๋์ง๋ง ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์์ต๋๋ค.
import retry from 'retry'
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
const operation = retry.operation({ retries: 2 });
operation.attempt(() => {
navigator.geolocation.getCurrentPosition(
(response) => { resolve(response) },
(error) => {
if (operation.retry(error)) {
return;
}
reject(error)
},
{ timeout: 2000, enableHighAccuracy: true, maximumAge: 100 },
);
})
} else {
reject(new Error('Location access denied'))
}
https://www.npmjs.com/package/react-native-geolocation-service
์ด ํจํค์ง๋ ๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์์ ๊ฑฐ์ ๋ชจ๋ ์ ์์ด ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
์๋ ํ์ธ์, ์๋ ์ ๋ ๋ฏธ์คํฐ๋ฆฌ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ฒ์์ผ๋ก ์์น๋ฅผ ์์ฒญํ๊ณ "maximunAge"๋ฅผ ์ฌ์ฉํ ๋ ์ด์ ์์น๊ฐ ์บ์๋์ง ์์์ผ๋ฏ๋ก ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ์์ฒญ์ ๋งจ ์ฒ์์ ์์น๋ "maximunAge"๊ฐ ์์ต๋๋ค.
๊ฐ๋จํ ๋๋ต์ ๋น์ ์ด์๋ ๊ณณ์์ ๋ฒ์ด๋ ์ด๋ฆฐ ๊ณต๊ฐ์ผ๋ก ๊ฐ์ ๋ค์ ์๋ํ๋ ๊ฒ์ ๋๋ค.
๋จ์ํ ๊ณผํ.
GPS ์๋น์ค๋ ๋๊บผ์ด ๋ฒฝ๊ณผ ์๋์ฐจ์ ์ํฅ์๋ฐ์ต๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค. ์๋ฌด๊ฒ๋ ํธ์ง ํ ํ์๊ฐ ์์ต๋๋ค !!!
์ ๊ฒฝ์ฐ์๋ maximumAge๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
๋๋จํ ๊ฐ์ฌํฉ๋๋ค! ์์ !
์๋
ํ์ธ์,
์ด๋ค ์๋ฃจ์
๋ ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค.
์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก {enableHighAccuracy : false} ๋ง ์ฌ์ฉํ์ฌ navigator.geolocation์ ์ฌ์ฉํฉ๋๋ค.
iOS์์๋ ์ ์๋ํ๊ณ Android์์๋ ํน์ ์ฅ์น์์ ์๋ํ์ง ์์ต๋๋ค.
Android 7, 8, 9์์ ์ฒดํฌ์ธํ์ต๋๋ค. Android 7์ด ์ค์น๋ Lenovo ์ ํ์์๋ ์๋ํ์ง ์์ง๋ง Android 7์ด ์ค์น๋ ๋ค๋ฅธ ์ฅ์น์์๋ ์๋ํฉ๋๋ค.
๋๊ตฌ๋ ์ง์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๋ค ์ ์์ด๋ผ๋ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฌ
@akhilsanker ์๋ง๋ react-native-fused-location ๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ณผ ์
์๋ ํ์ธ์ @reyalpsirc ,
๋ต์ฅ์ ๋ณด๋ด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์๊ฐ ๋ด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
iOS์๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๋๋ถ๋ถ์ Android ๊ธฐ๊ธฐ์์ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค. ๋๋ ์ ํ๋ ์๊ฐ ์ ํ์ด ์์ผ๋ฉฐ ๋น์ ์ด ์ ์ํ ๊ฒ์ฒ๋ผ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ค์ธ ๊ฒ์
๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์๊ฐ ๋ด ์ค์ ๊ณ ๋ง์.
๊ฐ์ฌํฉ๋๋ค.
์ฃ์กํฉ๋๋ค @akhilsanker, ๋ด๊ฐ ํ ๋ชจ๋ ์ฌ์ฉ์ ์๋๋ก์ด๋์ ๋ํ iOS ๋ฐ FusedLocation์ ๋ํ์ ๊ณ ์ ์์น ์ ๋ณด๋ฅผ ๋ฐ์์ด์๋ค.
maximumAge:0
ํจ๊ณผ์ ์ด์์ต๋๋ค.
{ enableHighAccuracy: true, timeout: 60000,
maximumAge:0
}
์๋ง๋ @GersonM ์ด ์ณ์ต๋๋ค ...
์์น ์ ๋ณด ๋ชจ๋์ ๋ง์คํฐ์ RN์์ ์ ๊ฑฐ๋์์ผ๋ฉฐ 0.60์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. https://github.com/react-native-community/react-native-geolocation์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ๋ณด๊ณ
2019 ๋ , 3 ๊ฐ์ ์๋ก ๋ค๋ฅธ ์์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ณด์์ง๋ง Android์์๋ ์๋ํ์ง ์์ต๋๋ค. ๋๋ ๋งํ.
2019 ๋ , 3 ๊ฐ์ ์๋ก ๋ค๋ฅธ ์์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ณด์์ง๋ง Android์์๋ ์๋ํ์ง ์์ต๋๋ค. ๋๋ ๋งํ.
react-native-geolocation-service๊ฐ ์ ๋๋ก ์๋ํฉ๋๋ค.
ํจํค์ง๊ฐ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ํด๋น ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๋ฌธ์ ํฐ์ผ์ ๋ง๋ญ๋๋ค. ๋ฌธ์ ๋ ์ ์ ๋ก ํด๊ฒฐ๋์ง ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ์ ๊ฐ์ ํ์ธ์.
iwangsyah์ ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค. <permission>
__and__ <uses-permission>
๋ฉํ ํ๊ทธ๊ฐ ๋ชจ๋ ํ์ํ์ต๋๋ค.
https://www.npmjs.com/package/react-native-geolocation-service
์ด ํจํค์ง๋ ๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์์ ๊ฑฐ์ ๋ชจ๋ ์ ์์ด ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
enableHighAccuracy
์true
๋๋false
์ค์ ํด๋ ์๋ํ์ง ์์ต๋๋ค.๋ค์ดํฐ๋ธ ๋ชจ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด
getCurrentPosition
์ ๋ํ ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ตํ๋ฉด ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค.