React-native: Android์˜ ์ง€๋ฆฌ์  ์œ„์น˜ 'enableHighAccuracy'๋Š” ํ•ญ์ƒ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 05์›” 10์ผ  ยท  239์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react-native

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์—์„œ ๊ณ ์ •๋ฐ€ ๋ชจ๋“œ๊ฐ€ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

Geolocation Bug Help Wanted Android Ran Commands Locked

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

enableHighAccuracy ์„ true ๋˜๋Š” false ์„ค์ •ํ•ด๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด getCurrentPosition ์— ๋Œ€ํ•œ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  239 ๋Œ“๊ธ€

@ acapop77 ๊ถŒํ•œ์ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑํ™”๋œ๋‹ค๋Š” ๊ฒƒ๋„ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

RN 0.25.1์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ์ €์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋†’๊ณ  ๋‚ฎ์€ ์ •ํ™•๋„๋กœ ์ง€์†๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์นจ๋‚ด ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€๋งŒ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹Œ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค-stock android avd-emulator๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  1. ์•ˆ๋“œ๋กœ์ด๋“œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์žฅ์น˜์—์„œ "์„ค์ •> ์œ„์น˜"(์‹ค์ œ ์žฅ์น˜ ์—์„œ์ฒ˜๋Ÿผ)๋กœ ์ด๋™ํ•˜๊ณ  ๋ชจ๋“œ๋ฅผ ๋†’์€ ์ •ํ™•๋„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  3. "ํ™•์žฅ ๋œ ์ปจํŠธ๋กค"๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์‹ญ์‹œ์˜ค ( "..."๋กœ ํ‘œ์‹œ๋จ). ๋‹ค์Œ์œผ๋กœ ์œ„์น˜ ์„น์…˜์—์„œ GPS ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ๋ฐ์ดํ„ฐ์™€ ์•„๋ž˜์— "๋ณด๋‚ด๊ธฐ"๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. "๋ณด๋‚ด๊ธฐ"๋ฅผ ํด๋ฆญํ•˜๊ณ  ํ™•์žฅ ๋œ ์ปจํŠธ๋กค ๋ฉ”๋‰ด๋ฅผ ๋‹ซ์œผ์‹ญ์‹œ์˜ค.
  4. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ๋กœ๋“œํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค- 'ํ•œ ๋ฒˆ๋งŒ ๊ธฐ๋ฐ˜'. ์•ฑ์„ ๋‹ค์‹œ๋กœ๋“œ ํ•  ๋•Œ๋งˆ๋‹ค 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๋กœ ์„ค์ •ํ•ด๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์œ„์น˜๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์„ค์ •์„ ์—ด๊ณ  ์œ„์น˜๋ฅผ ๋ณด๋‚ผ ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์Šคํฌ๋ฆฐ ์ƒท ํ™•์ธ).

์ž๋™์œผ๋กœ๋ฐ›์„ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

screen shot 2016-08-21 at 6 42 52 pm

์ œ ๊ฒฝ์šฐ์—๋Š” 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๋Š” ํ˜„์žฌ ๋ถˆ์•ˆ์ • ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์„ ์•Œ์•„ ๋ƒˆ์Šต๋‹ˆ๋‹ค.

  1. ์•ˆ๋“œ๋กœ์ด๋“œ ์žฅ์น˜์˜ ์„ค์ •์€ - ์œ„์น˜ ์žฅ์น˜๋Š”, ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•˜์ง€ ๋ง์•„์•ผ enableHighAccuracy: true getCurrentPosition์—
  2. ์„ค์ •-์œ„์น˜๊ฐ€ ๋†’์€ ์ •ํ™•๋„์ด๋ฏ€๋กœ 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๋ฅผ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ๋‚ญ๋น„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚œ ๋…ธ๋ ฅ ํ–ˆ์–ด:

  • enableHighAccuracy : false
  • ์˜ต์…˜ ์ธ์ˆ˜ ์ œ๊ฑฐ
  • ๊ถŒํ•œ ํ™•์ธ ๋ฐ ์š”์ฒญ android> = 23
  • FINE ๋ฐ COARSE ๋ชจ๋‘ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค.

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๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ˆ, "enableHighAccuracy : true"์‹œ๋„๊ฐ€ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ "๊ฑฐ์นœ"๊ฒฐ๊ณผ (ํŠนํžˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฌดํ•œ๋Œ€ ์ธ ๊ฒฝ์šฐ) ์ „์— ๋ฐ˜ํ™˜๋˜์–ด ์†์‹ค / ๋ฎ์–ด ์“ฐ๊ธฐ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์•ฝ๊ฐ„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์˜์‹ฌ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ •๋ง๋กœ ๊ทธ๋ ‡๊ฒŒ ์กฐ์‹ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํŠน์ • ์‚ฌ๋ก€๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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 ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ฃผ์„์ด ์žˆ์ง€๋งŒ ๋†’์€ ์ •ํ™•๋„, ๋ฐฐํ„ฐ๋ฆฌ ์ ˆ์•ฝ ๋˜๋Š” ์žฅ์น˜ ์ „์šฉ ์˜ต์…˜์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€๋ฆฌ์  ์œ„์น˜์˜ ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์‹ค์ œ ์žฅ์น˜์— ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

location-mode-100621707-large

์ œ ๊ฒฝ์šฐ์—๋Š” 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 ๋ฏธ์•ˆํ•˜์ง€๋งŒ ๋‚ด ์•ฑ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ๊ทธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ๋Š” android> = 6.0์€ ๋Ÿฐํƒ€์ž„ ์ค‘์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด ์œ ๋ž˜ ์งˆ๋ฌธ์€ ์ž์„ธํ•œ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค ์งˆ๋ฌธ
  • React Native์˜ PermissionsAndroid ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ถŒํ•œ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
์•„๋ฌด๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๋‹ค.
์กฐ์–ธํ•˜์‹ญ์‹œ์˜ค.
๊ณ ๋งˆ์›Œ

์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ •๋ง ๋„์›€์ด๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์‹ค์‹œ๊ฐ„ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 3 ๊ฐœ์˜ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Gingerbread๋ฅผ ์‹คํ–‰ํ•˜๋Š” 30 ๊ฐœ ์ด์ƒ์˜ ์‹ค์ œ Android ๊ธฐ๊ธฐ์—์„œ Nougat๊นŒ์ง€ QAํ–ˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ชจ๋‘ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ ์ดํ›„ ์‹ค์ œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ๋ณด๊ณ ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@adriancuco ๋Š” ๊ตฌํ˜„ ๋ฐ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • RN ๋ฒ„์ „?
  • ์–ด๋–ค Android ๋ฒ„์ „์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์–ด๋–ค ์žฅ์น˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ตฌํ˜„ ๋˜๋Š” ์žฅ์น˜ ๊ตฌ์„ฑ์ด ๋ณต์žก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

raldred,

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ž˜๋ชป!
์ž์‚ดํ•˜๊ธฐ ์ „์— ๋‚˜๋Š” ๋ฉฐ์น  ์ „์— ์ฝ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚ด ํœด๋Œ€ ์ „ํ™”์˜ ์œ„์น˜ ์„ค์ •์„ ํ™•์ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ๋ฐฉ๊ธˆ 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)

raldred,

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ž˜๋ชป!
์ž์‚ดํ•˜๊ธฐ ์ „์— ๋‚˜๋Š” ๋ฉฐ์น  ์ „์— ์ฝ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚ด ํœด๋Œ€ ์ „ํ™”์˜ ์œ„์น˜ ์„ค์ •์„ ํ™•์ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ๋ฐฉ๊ธˆ GPS๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ; (
๊ทธ๋ž˜์„œ GPS, Wifi ๋“ฑ ๋ชจ๋“  ๊ฒƒ์„ ํ™œ์„ฑํ™”ํ–ˆ๊ณ  ์ด์ œ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๊ณ ๋งˆ์›Œ

โ€”
๋Œ“๊ธ€์„ ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-312881724 ์—์„œ ๋ณด๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

@ m-sayari ๋‹น์‹ ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋„์›€์ด ๋  ์ •๋ณด๋ฅผ ์กฐ๊ธˆ ๋” ์ฃผ๋ ค๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • RN ๋ฒ„์ „
  • Android ๋นŒ๋“œ ๋Œ€์ƒ ๋ฒ„์ „
  • Android ๊ธฐ๊ธฐ ๋ฒ„์ „
  • ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ธฐ๊ธฐ.

๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ตฌํ˜„ / ์„ค์ •์— ํŠน์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ ์•ฑ์—์„œ ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! 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์—๋ณด๊ณ  ๋œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • RN ๋ฒ„์ „ : 0.47
  • RN ๊ธฐ๋ณธ๊ฐ’์— ๋‚จ์•„์žˆ๋Š” Android ๋นŒ๋“œ ๋Œ€์ƒ ๋ฒ„์ „ :
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
  • Android ๊ธฐ๊ธฐ ๋ฒ„์ „ : 6.0.1, 7.0
  • ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ธฐ๊ธฐ :

    • Android 6.0.1์ด ์„ค์น˜๋œ Nexus 5

    • Android 6.0.1์ด ์„ค์น˜๋œ Xiaomi Redmi 3S

    • Android 7.0์ด ์„ค์น˜๋œ Android ์—๋ฎฌ๋ ˆ์ดํ„ฐ

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 ์œ„์น˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„ํ™œ์„ฑํ™”๋˜๋ฉด ๋„คํŠธ์›Œํฌ ๊ณต๊ธ‰์ž์—์„œ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • maximumAge๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๋ฒˆ ์ƒˆ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๊ณ  (๋ฐฐํ„ฐ๋ฆฌ ๋ฐ ์‹œ๊ฐ„ ์†Œ๋ชจ์ ) ์บ์‹œ ๋œ ์œ„์น˜์— ์˜์กด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ GPS ์ œ๊ณต์ž๋Š” ๋„คํŠธ์›Œํฌ ์ œ๊ณต ์—…์ฒด๋ณด๋‹ค ๋Š๋ฆฌ๋ฉฐ ์œ„์น˜์— ๋”ฐ๋ผ ํ•ญ์ƒ ์ž‘๋™ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค (GPS๊ฐ€ ํœด๋Œ€ ์ „ํ™”์— ๋„๋‹ฌ ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒ ํ•จ). ๋„คํŠธ์›Œํฌ ๊ณต๊ธ‰์ž๋Š” ๋” ๋น ๋ฅด๊ณ  ์ ‘๊ทผ์„ฑ์ด ๋†’์ง€๋งŒ ์ ˆ์ถฉ์•ˆ์œผ๋กœ ์ •ํ™•๋„๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค (์ตœ์•…์˜ ๊ฒฝ์šฐ 2000 ๋ฏธํ„ฐ).

highAccuracy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด GPS๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ ์  ๋” ์ •ํ™• ํ•ด์ง€๋ฉด์„œ ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค. ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋‚ด ๊ฐ์‹œ์ž๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์œ„์น˜๋ฅผ ๋น„๊ตํ•˜๊ณ  ํ•ญ์ƒ ๋” ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ RN ๊ตฌํ˜„์˜ ๋ฌธ์ œ๋Š” GPS ๊ณต๊ธ‰์ž ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๊ณต๊ธ‰์ž์— ์˜์กดํ•˜์ง€๋งŒ ๋‘˜ ๋‹ค์˜ ์ ˆ์ถฉ์•ˆ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ JS ๋˜๋Š” Native์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Android์—์„œ๋งŒ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ•˜๊ณ  ์œ„์น˜๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Android Emulator๋ฅผ ํ†ตํ•ด ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ต์…˜์„ ์ž…๋ ฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
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);
    }
);

์ด๊ฒƒ์€ ๋‹น์‹ ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ •์ด ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์˜ ๋ฆด๋ฆฌ์Šค์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๊นŒ?

์ œ์•ˆ ๋œ ์†”๋ฃจ์…˜ ( ์˜ˆ : ์˜ˆ , ์˜ˆ ๋ฐ ์˜ˆ ) ์ค‘ ์ผ๋ถ€๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์–ด๋Š ๊ฒƒ๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๊ณ  ๋งํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ

  • Android 6.x
  • ๋ฐ˜์‘ 16.1.0
  • React-Native 16.50.3

์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

  • Android ํœด๋Œ€ ์ „ํ™”์—๋Š” _SIM ์นด๋“œ๊ฐ€ ์—†์œผ๋ฉฐ _ _ ํšŒ์‚ฌ ์†Œ์œ  _์ด๋ฉฐ WIFI์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ 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์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž˜๋ชป๋œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ / ์ „ํ™” ๊ตฌ์„ฑ
  • GPS๋กœ ๋ฎ์—ฌ ์žˆ์ง€ ์•Š์€ ์ง€์—ญ (์˜ˆ : ๊ฑด๋ฌผ์ด๋‚˜ ํฐ ๊ฑด๋ฌผ์ด์žˆ๋Š” ๊ฑฐ๋ฆฌ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ)
  • ํƒ€์ž„ ์•„์›ƒ์ด ๋„ˆ๋ฌด ์ด๋ฅด๋‹ค

์ด ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ต์…˜์—†์ด ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ ์˜ค๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๊นŒ? (๊ทธ ์œ„์น˜๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค)

์‹ค์ œ 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 ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์ €์—๊ฒŒ

  1. Gradle์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค.
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
    }

  1. android / build.gradle์˜ ์ €์žฅ์†Œ์— "google ()"์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋•Œ๋กœ๋Š” AndroidManifest.xml์— <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ์„ ์ถ”๊ฐ€ ํ•œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋น ๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์˜ ์ฒซ ํ™”๋ฉด์„ ๋งˆ์šดํŠธ ํ•  ๋•Œ ์‚ฌ์šฉ์ž์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    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); }
  2. ์•ˆ ํ•จ์œผ๋กœ ์„ค์ • 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์— ์œ„์น˜ ๋ฐ์ดํ„ฐ๋„ ์ „์†ก๋œ๋‹ค๋Š” ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒˆ ์žฅ์น˜ ๋˜๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์€ ์ด๋ฏธ ์ผ๋ฐ˜ ์žฅ์น˜์—์„œ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

9vgfb

์ด ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์žฅ์น˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค ( 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
์ด ํŒจํ‚ค์ง€๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์œ„์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์ œ์•ˆ์ด ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰