React-native-onesignal: [CRASH] [ANDROID] getDeviceState์˜ NullPointerException

์— ๋งŒ๋“  2021๋…„ 02์›” 06์ผ  ยท  28์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: OneSignal/react-native-onesignal

๊ธฐ์ˆ :
RNOneSignal.getDeviceState ์—์„œ ์‹œ์ž‘๋œ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜ ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ์ถ”์ ์€ ์•„๋ž˜์— ์ฒจ๋ถ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  Android SDK ๋ฒ„์ „ ๋ฐ ์ œ์กฐ์—…์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ
"react-native-onesignal": "^4.0.2",
react: 17.0.1 => 17.0.1 react-native: 0.64.0-rc.2 => 0.64.0-rc.2

๋ฌธ์ œ ์žฌํ˜„ ๋‹จ๊ณ„ :
๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์—ˆ์œผ๋ฉฐ Google Play์˜ ์ถฉ๋Œ ๋Œ€์‹œ ๋ณด๋“œ์—๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐํƒ€ :

  at com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:4)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:147)
  at com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:21)
  at com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
  at android.os.Handler.handleCallback (Handler.java:883)
  at android.os.Handler.dispatchMessage (Handler.java:100)
  at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java)
  at android.os.Looper.loop (Looper.java:237)
  at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run (MessageQueueThreadImpl.java:37)
  at java.lang.Thread.run (Thread.java:919)
Android Possible Bug

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

@ diego-paired ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ OneSingal ์ดˆ๊ธฐํ™” ํ›„ getDeviceState() ํ˜ธ์ถœ์„ ์ง€์—ฐํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค (2 ์ดˆ ์ง€์—ฐ ์ถ”๊ฐ€).

ํŒ ๊ณ ๋งˆ์›Œ

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

+1.

java.lang.NullPointerException: at com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:4) at java.lang.reflect.Method.invoke (Method.java) at com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:147) at com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:21) at com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java) at android.os.Handler.handleCallback (Handler.java:873) at android.os.Handler.dispatchMessage (Handler.java:99) at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java) at android.os.Looper.loop (Looper.java:224) at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run (MessageQueueThreadImpl.java:37) at java.lang.Thread.run (Thread.java:764)

Howdy Diego,
์ด ๋ฌธ์ œ๋ฅผ ์‹ ๊ณ  ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ค‘์ธ ์ฝ”๋“œ๋ฅผ ํฌํ•จ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ํ™˜๊ฒฝ ์ •๋ณด (์˜ˆ : ์žฅ์น˜ ์ œ์กฐ์—…์ฒด ๋ฐ ๋ชจ๋ธ, OS ๋“ฑ)๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฑด๋ฐฐ

Howdy Diego,
์ด ๋ฌธ์ œ๋ฅผ ์‹ ๊ณ  ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ค‘์ธ ์ฝ”๋“œ๋ฅผ ํฌํ•จ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ํ™˜๊ฒฝ ์ •๋ณด (์˜ˆ : ์žฅ์น˜ ์ œ์กฐ์—…์ฒด ๋ฐ ๋ชจ๋ธ, OS ๋“ฑ)๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฑด๋ฐฐ

๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Google Play ์ฝ˜์†”์—์„œ ๋งค์ฃผ ์•ฝ 50 ํšŒ์˜ ์ถฉ๋Œ ์†๋„๋กœ๋ณด๊ณ ๋˜๊ณ  ์žˆ์ง€๋งŒ ์žฌํ˜„ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

image

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

info ์‹œ์Šคํ…œ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ์ค‘ ...
์ฒด๊ณ„:
์šด์˜์ฒด์ œ : macOS 10.15.7
CPU : (4) x64 Intel (R) Core (TM) i5-5257U CPU @ 2.70GHz
๋ฉ”๋ชจ๋ฆฌ : 36.86MB / 8.00GB
์…ธ : 5.7.1-/ bin / zsh
๋ฐ”์ด๋„ˆ๋ฆฌ :
๋…ธ๋“œ : 10.22.0-~ / .nvm / versions / node / v10.22.0 / bin / node
์›์‚ฌ : 1.22.4-/ usr / local / bin / yarn
npm : 6.14.6-~ / .nvm / versions / node / v10.22.0 / bin / npm
์›Œ์น˜ ๋งจ : 4.9.0-/ usr / local / bin / watchman
๊ด€๋ฆฌ์ž :
CocoaPods : 1.10.0-/ usr / local / bin / pod
SDK :
iOS SDK :
ํ”Œ๋žซํผ : iOS 13.6, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
Android SDK :
API ๋ ˆ๋ฒจ : 23, 25, 26, 28, 29
๋นŒ๋“œ ๋„๊ตฌ : 28.0.3, 29.0.2, 29.0.3
Android NDK : ์ฐพ์„ ์ˆ˜ ์—†์Œ
์‹ญ์˜ค ์ผ:
์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค : 3.6 AI-192.7142.36.36.6308749
Xcode : 11.6 / 11E708-/ usr / bin / xcodebuild
์–ธ์–ด :
์ž๋ฐ” : 1.8.0_242-/ usr / bin / javac
ํŒŒ์ด์ฌ : 2.7.16-/ usr / bin / python
npm ํŒจํ‚ค์ง€ :
@ react-native-community / cli : ์ฐพ์„ ์ˆ˜ ์—†์Œ
๋ฐ˜์‘ : 16.13.1 => 16.13.1
๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ : 0.63.3 => 0.63.3
react-native-macos : ์ฐพ์„ ์ˆ˜ ์—†์Œ
npmGlobalPackages :
react-native : ์ฐพ์„ ์ˆ˜ ์—†์Œ

"๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ": "0.63.3",
"react-native-onesignal": "^ 4.0.1",

์น˜๋ช…์ ์ธ ์˜ˆ์™ธ : java.lang.NullPointerException
null ๊ฐœ์ฒด ์ฐธ์กฐ์—์„œ ๊ฐ€์ƒ ๋ฉ”์„œ๋“œ 'org.json.JSONObject com.onesignal.OSDeviceState.toJSONObject ()'ํ˜ธ์ถœ ์‹œ๋„

com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:239)
java.lang.reflect.Method.invoke (Method.java)
com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:372)
com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:151)
com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
android.os.Handler.handleCallback (Handler.java:883)
android.os.Handler.dispatchMessage (Handler.java:100)
com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:27)
android.os.Looper.loop (Looper.java:241)
com.facebook.react.bridge.queue.MessageQueueThreadImpl $ 4.run (MessageQueueThreadImpl.java:226)
java.lang.Thread.run (Thread.java:919)

์‰ฝ๊ฒŒ ๋ณต์ œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ ์Šค ๋‹ˆํŽซ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

๊ฑด๋ฐฐ

๋ฟก๋ฟก

OneSignal.getDeviceState () ํ˜ธ์ถœ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

const getDeviceState =  async () => {
     const deviceState = await OneSignal.getDeviceState();
     console.log({ deviceState });
}

์˜ˆ์™ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Fatal Exception: java.lang.NullPointerException
Attempt to invoke virtual method 'org.json.JSONObject com.onesignal.OSDeviceState.toJSONObject()' on a null object reference

com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:239)
java.lang.reflect.Method.invoke (Method.java)
com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:372)
com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:151)
com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
android.os.Handler.handleCallback (Handler.java:883)
android.os.Handler.dispatchMessage (Handler.java:100)
com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:27)
android.os.Looper.loop (Looper.java:241)
com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run (MessageQueueThreadImpl.java:226)
java.lang.Thread.run (Thread.java:919)

OneSignal ๋ฐ React Native ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"react-native": "0.63.3",
"react-native-onesignal": "^4.0.1",
````

The react native info:

```typescript
info Fetching system and libraries information...
System:
OS: macOS 10.15.7
CPU: (4) x64 Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
Memory: 36.86 MB / 8.00 GB
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 10.22.0 - ~/.nvm/versions/node/v10.22.0/bin/node
Yarn: 1.22.4 - /usr/local/bin/yarn
npm: 6.14.6 - ~/.nvm/versions/node/v10.22.0/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
Managers:
CocoaPods: 1.10.0 - /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms: iOS 13.6, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
Android SDK:
API Levels: 23, 25, 26, 28, 29
Build Tools: 28.0.3, 29.0.2, 29.0.3
Android NDK: Not Found
IDEs:
Android Studio: 3.6 AI-192.7142.36.36.6308749
Xcode: 11.6/11E708 - /usr/bin/xcodebuild
Languages:
Java: 1.8.0_242 - /usr/bin/javac
Python: 2.7.16 - /usr/bin/python
npmPackages:
@react-native-community/cli: Not Found
react: 16.13.1 => 16.13.1
react-native: 0.63.3 => 0.63.3
react-native-macos: Not Found
npmGlobalPackages:
react-native: Not Found

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

"๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ": "^ 0.63.4",
"react-native-onesignal": "^ 4.0.3"

"react-native-onesignal": "^ 3.9.3"์—์„œ "react-native-onesignal": "^ 4.0.3"๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

...
let device = await OneSignal.getDeviceState ();
...

Play ์Šคํ† ์–ด ์ถฉ๋Œ ๋กœ๊ทธ์—์„œ

java.lang.NullPointerException :
com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java)
java.lang.reflect.Method.invoke (Method.java)
com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java)
com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java)
com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
android.os.Handler.handleCallback (Handler.java:739)
android.os.Handler.dispatchMessage (Handler.java:95)
com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java)์—์„œ
android.os.Looper.loop (Looper.java:148)
com.facebook.react.bridge.queue.MessageQueueThreadImpl $ 4.run (MessageQueueThreadImpl.java)
java.lang.Thread.run (Thread.java:818)

Firebase ์ถฉ๋Œ ๋กœ๊ทธ

์น˜๋ช…์ ์ธ ์˜ˆ์™ธ : java.lang.NullPointerException : null ๊ฐœ์ฒด ์ฐธ์กฐ์—์„œ ๊ฐ€์ƒ ๋ฉ”์„œ๋“œ 'org.json.JSONObject com.onesignal.g0.a ()'ํ˜ธ์ถœ ์‹œ๋„
com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:4)
java.lang.reflect.Method.invoke (Method.java)์—์„œ

์•ˆ๋…•,
์ •๋ณด๋ฅผ ์ œ๊ณต ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฐ€์žฅ ๋„์›€์ด ๋  ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด. ์ด

const getDeviceState = async () => {
const deviceState = await OneSignal.getDeviceState ();
console.log ({deviceState});
}

์žฌํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ์–ด๋””์— ์‚ฌ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๋งฅ๋ฝ์ž…๋‹ˆ๋‹ค.

์˜ˆ : getDeviceState ๋Œ€ํ•œ ํ˜ธ์ถœ์ด OneSignal ์ดˆ๊ธฐํ™”์™€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” ์–ด๋–ค RN ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๊นŒ?

์ œ๊ณต๋œ ์Šคํƒ ์ถ”์ ์ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

getDeviceState ๊ฐ€ ๋„ˆ๋ฌด ๋นจ๋ฆฌ ํ˜ธ์ถœ๋˜๋ฉด ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. getDeviceState ๋ฅผ OneSignal ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅ๋˜๋Š” ์ฝ”๋“œ ์ง€์ ์œผ๋กœ ์ด๋™ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ : ๊ตฌ๋… ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

getDeviceState ๋Š” ํ˜ธ์ถœ ๋  ๋•Œ ์Šค๋ƒ… ์ƒท์„ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ƒํƒœ๋ฅผ ์บ์‹œํ•˜์ง€ ์•Š๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ฟก๋ฟก

์•ˆ๋…•ํ•˜์„ธ์š”, ์ง„์ž… ์  ์ธ App.tsx์—๋Š” ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const oneSignalIntialize = async () => {
  OneSignal.setAppId('xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx');
}

const App = () => {
  useEffect(() => {
    oneSignalIntialize();

  }, []);

return (
    <LoginFlow />
);

}

๋กœ๊ทธ์ธ ํ๋ฆ„ ํ›„์— ์ด๊ฒƒ์ด ์„ฑ๊ณตํ•˜๋ฉด ์‹œ์ž‘ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

const getDeviceState = async () => {
    const deviceState = await OneSignal.getDeviceState(); 
    console.log({ deviceState });
}

const WelcomeScreen = () => {
  useEffect(() => {
    getDeviceState();

  }, []);

return (
    <Components />
);

}

Screen Shot 2021-02-18 at 10 59 35

์•ˆ๋…•ํ•˜์„ธ์š” @renatobentorocha ,
์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
์—ฌ๊ธฐ์„œ useEffect ํ›„ํฌ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ธฐ๋ณธ ์•ฑ ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ SDK๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋งˆ์šดํŠธ๋˜๋Š” ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋น„๋™๊ธฐ ํ˜ธ์ถœ์ด์ง€๋งŒ ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ƒํƒœ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,.
useState ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™” ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,,.
@rgomezp ์—์„œ ์ œ์•ˆํ•œ ๋˜ ๋‹ค๋ฅธ ๊ถŒ์žฅ ์‚ฌํ•ญ์€
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,.
๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,.

์•ˆ๋…•ํ•˜์„ธ์š” @ tyang1 ์ฃผ๋ชฉ

Screen Shot 2021-02-22 at 09 07 47

addSubscriptionObserver ํ…Œ์ŠคํŠธํ•˜๊ณ  ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค

์ด๊ฒƒ๋„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒˆ์‹ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. @rgomezp ์•„๋งˆ๋„ ์Šค๋ ˆ๋”ฉ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋ฌด์ž‘์œ„๋กœ ๋ฐœ์ƒํ•˜์ง€๋งŒ ๊ฝค ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ ๋ณด๊ณ ์„œ์—์„œ ๋งŽ์€ ํ”์ ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

์•ˆ๋…•,
์Šคํƒ ์ถ”์ ์ด ๋ž˜ํผ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์Šค๋ ˆ๋”ฉ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ๋ฒ„๊ทธ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์ƒ๋„๋ฅผ ๋†’์ด๋ ค๋ฉด ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ์žฌํ˜„ ๋‹จ๊ณ„ ๋งŒ ์žˆ์œผ๋ฉด๋ฉ๋‹ˆ๋‹ค.

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ 98 %๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค๊ณ ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šด @renatobentorocha ์ž…๋‹ˆ๋‹ค.

@oferRounds @dijinshopwise ์ด๊ฒƒ๋„ ๋‹น์‹ ์ด๋ณด๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

+1

image

@rgomezp ๋Š” ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

async componentDidMount() {
        this._isMounted = true

        /* O N E S I G N A L   S E T U P */
        OneSignal.setAppId('***********************************')
        OneSignal.setLogLevel(0, 0)
        OneSignal.setRequiresUserPrivacyConsent(false)

        /* O N E S I G N A L  H A N D L E R S */
        OneSignal.setNotificationWillShowInForegroundHandler(notifReceivedEvent => {
            let notification = notifReceivedEvent.getNotification()

            const buttonOk = {
                text: 'OK', onPress: () => {
                    notifReceivedEvent.complete()
                },
            }

            Alert.alert(notification.title, notification.body, [buttonOk])

            if (notification.additionalData) {
                //
            }

        })
        OneSignal.setNotificationOpenedHandler(notification => {
            //
        })


        OneSignal.disablePush(true)

        const deviceState = await OneSignal.getDeviceState()

        if (Platform.OS === 'ios' && !deviceState.isSubscribed) {
            OneSignal.promptForPushNotificationsWithUserResponse(function(accepted) {
                //
            });
        }

        // ...
}

์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  Google Play์—์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState

์–ด๋– ํ•œ ์ œ์•ˆ? ์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ ์ˆ˜๋ฐฑ ๊ฑด์˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‰ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
image

@ diego-paired ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ OneSingal ์ดˆ๊ธฐํ™” ํ›„ getDeviceState() ํ˜ธ์ถœ์„ ์ง€์—ฐํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค (2 ์ดˆ ์ง€์—ฐ ์ถ”๊ฐ€).

@ diego-paired ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ OneSingal ์ดˆ๊ธฐํ™” ํ›„ getDeviceState() ํ˜ธ์ถœ์„ ์ง€์—ฐํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค (2 ์ดˆ ์ง€์—ฐ ์ถ”๊ฐ€).

ํŒ ๊ณ ๋งˆ์›Œ

์•ˆ๋…•ํ•˜์„ธ์š” @renatobentorocha ,
์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
์—ฌ๊ธฐ์„œ useEffect ํ›„ํฌ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ธฐ๋ณธ ์•ฑ ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ SDK๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋งˆ์šดํŠธ๋˜๋Š” ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋น„๋™๊ธฐ ํ˜ธ์ถœ์ด์ง€๋งŒ ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ƒํƒœ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,.
useState ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™” ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,.
@rgomezp ์—์„œ ์ œ์•ˆํ•œ ๋˜ ๋‹ค๋ฅธ ๊ถŒ์žฅ ์‚ฌํ•ญ์€
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,.
๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.
,,,,,,,,, ๋ฌด,,,,,,,,,,,,,,,.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@ diego-paired @ dan- ๊ฐœ๋ฐœ์ž

@rgomezp ์ œ์•ˆ์„ ๋”ฐ๋ž๊ณ  ์ง€๊ธˆ์€ ์ถฉ๋Œ์ด ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

OneSignal.addSubscriptionObserver(() => {
    OneSignal.getDeviceState().then((deviceState) => {
      console.log({deviceState})
    });
  });

ํ…Œ์ŠคํŠธ ์•ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ฒ„ํŠผ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒํ™ฉ 1

๏ปฟ๏ปฟlet getDeviceStateButton = this.renderButtonView(
"Get Device State",
isExternalUserIdLoading || isPrivacyConsentLoading,
() => {

console.log("Attempting to get device state");
this.setState({ isExternalUserIdLoading: true }, () => {
// OneSignal getDeviceState
let deviceState = OneSignal.getDeviceState();
console.log("deviceState: ", deviceState);
console.log("deviceState.isSubscribed: ", deviceState.isSubscribed);
this.setState({ isExternalUserIdLoading: false, isSubscribed: deviceState.isSubscribed });
console.log("this.state.isSubscribed after calling setState: ", this.state.isSubscribed);
console.log("deviceState.userId: ", deviceState.userId)
});
});

๋กœ๊ทธ ์‡ผ :

2021-03-25 20:06:14.589544-0700 jonexample[751:27269] [javascript] Attempting to get device state
2021-03-25 20:06:14.645290-0700 jonexample[751:27269] [javascript] 'deviceState: ', { _U: 0, _V: 0, _W: null, _X: null }
2021-03-25 20:06:14.647385-0700 jonexample[751:27269] [javascript] 'deviceState.isSubscribed: ', undefined
2021-03-25 20:06:14.647768-0700 jonexample[751:27269] [javascript] 'this.state.isSubscribed after calling setState: ', undefined
2021-03-25 20:06:14.647897-0700 jonexample[751:27269] [javascript] 'deviceState.userId: ', undefined

๊ทธ๋Ÿฌ๋‚˜ componentDidMount์— ์ œ๊ณต๋œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ :

์ƒํ™ฉ 2

async componentDidMount(){
๏ปฟ const deviceState = await OneSignal.getDeviceState();
this.setState({ isSubscribed : deviceState.isSubscribed});
console.log("componentDidMount deviceState: ", deviceState);
console.log("componentDidMount deviceState.isSubscribed: ", deviceState.isSubscribed);
console.log("componentDidMount deviceState.userId: ", deviceState.userId);
}

๋กœ๊ทธ์—๋Š” ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

2021-03-25 20:14:46.521099-0700 jonexample[1326:55465] [javascript] 'componentDidMount deviceState: ', { userId: '92aa2978-3f53-454e-b1a6-652c43f0dba4',
2021-03-25 20:14:46.521328-0700 jonexample[1326:55465] [javascript] 'componentDidMount deviceState.isSubscribed: ', true
2021-03-25 20:14:46.521435-0700 jonexample[1326:55465] [javascript] 'componentDidMount deviceState.userId: ', '92aa2978-3f53-454e-b1a6-652c43f0dba4'

@rgomezp ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค 1 ์˜ˆ์ƒ ๋™์ž‘์ž…๋‹ˆ๊นŒ?

@ diego-paired @renatobentorocha @ dan-developer๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜ˆ์ œ๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์œ„์˜ ๋‘ ์ƒํ™ฉ์ด ๋ชจ๋‘ ๋งž๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ  ์žฌํ˜„ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค.

@ jfishman1 ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. getDeviceState ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ then .

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด SDK์—์„œ์ด๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํ‘œ๋ฉด ์ฒ˜๋ฆฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ๋ณด๋‹ค ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝํ•  ์ˆ˜์žˆ๋Š” ์‚ฌํ•ญ์„ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด์ด ๋ฌธ์ œ์˜ ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ์žˆ๋Š” ์›์ธ์€ ์ปจํ…์ŠคํŠธ๊ฐ€๋กœ๋“œ๋˜๊ธฐ ์ „์— ์žฅ์น˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ ์˜ค๋ ค๊ณ ํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ธก ๋•Œ๋ฌธ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

if (appContext == null) {
         logger.error("OneSignal.initWithContext has not been called. Could not get OSDeviceState");
         return null;
      }

์ถœ์ฒ˜

ํ™•์ธํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ logcat์—์„œ OneSignal.initWithContext has not been called. Could not get OSDeviceState ๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค (์˜ˆ : Android Studio ์—ด๊ธฐ).

๊ทธ๋™์•ˆ Android ๋ธŒ๋ฆฌ์ง€์— ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถฉ๋Œ์‹œ ์ „์ฒด๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๋‹ค์Œ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.
์žฅ์น˜ ์ƒํƒœ๋ฅผ ๋„ˆ๋ฌด ์ผ์ฐ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๋„๋ก ๊ตฌ๋… ๋ณ€๊ฒฝ ๊ด€์ฐฐ์ž๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์žฅ์น˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์–‘ํ•ด ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.


# 1085์—์„œ :
ํƒ€์ด๋จธ๋ฅผ ํ†ตํ•ด ์žฅ์น˜ ์ƒํƒœ getter๋ฅผ ์ง€์—ฐํ•˜๋Š” ๋Œ€์‹  ๊ตฌ๋… ๊ด€์ฐฐ์ž์— getDeviceState ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋„ฃ์–ด๋ณด์‹ญ์‹œ์˜ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ตฌ๋…๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ :

OneSignal.addSubscriptionObserver(async (event) => {
    this.OSLog("OneSignal: subscription changed:", event);
    if (event.to.isSubscribed) {
        const state = await OneSignal.getDeviceState();
        // do something with the device state
    }
});

์—…๋ฐ์ดํŠธ : ์ด์ œ ์ตœ์‹  ๋ฒ„์ „ 4.0.7์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  4.0.7 ์ €์žฅ์†Œ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์žฅ์†Œ์—์„œ ๋ฌผ์–ด๋ณด๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ผ๋ถ€ iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฐ Android ์žฅ์น˜์—์„œ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์™€ ๊ฐ™์€ deviceState๋กœ ์ด๋Ÿฌํ•œ ํ•„๋“œ ๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. userId ํ•„๋“œ๋„ ์—†์Šต๋‹ˆ๋‹ค.

{"rootTag":21,"initialProps":{}}
 WARN  {"hasNotificationPermission": false, "isEmailSubscribed": false, "isPushDisabled": false, "isSMSSubscribed": false, "isSubscribed": false, "notificationPermissionStatus": 0}
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰