React-native-onesignal: onIds ๋ฌธ์ œ

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

์•ˆ๋…•ํ•˜์„ธ์š” ์ €๋Š” Main.js์— ํฌํ•จ๋œ OneSignalController๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

class OneSignalController extends Component {
    props: Props

    constructor(props) {
        super(props);
    }
    componentWillMount() {
        OneSignal.addEventListener('opened', this.onOpened);
        OneSignal.addEventListener('ids', this.onIds);
    }

    componentWillUnmount() {
        OneSignal.removeEventListener('opened', this.onOpened);
        OneSignal.removeEventListener('ids', this.onIds);
    }

    onIds = (device) => {
        this.props.dispatch_set_device_id(device.userId);
    }

    render() {
        return null;
    }
}

redux-persist ํ•˜๊ณ  rehydration ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์•ฑ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚ด index.android.js ์—์„œ ์ด๊ฒƒ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

...
        this.state = { rehydrated: false };
    }

    componentWillMount() {
      Storage.restoreData(store, {}, () => {
        this.setState({ rehydrated: true });
        });
    }

    render() {
        return (
            this.state.rehydrated === true
            ? <Provider store={store}>
                <View style={styles.container}>
                    <Main />
                </View>
            </Provider>
            : null
        );
    }

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ oneSignal์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋” ์ด์ƒ onIds ๊ธฐ๋Šฅ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Help Wanted

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

๋ฐฉ๊ธˆ ์ด lib๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋„ redux-persist๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”! ๊ทธ๋ฆฌ๊ณ  ์•ฝ๊ฐ„์˜ ํŒŒ๊ธฐ ํ›„์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด redux-persist์™€ ๊ด€๋ จ ์ด ์žˆ๋‹ค๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ids ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ง€์—ฐ๋œ ๊ตฌ๋… .

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ index.xxx.js ์— ๋ฐ”๋กœ ๋„ฃ์œผ๋ฉด(์ฆ‰, ์•ฑ ์‹œ์ž‘ ์ดˆ๊ธฐ์—) ์•ฑ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

//... other imports
import OneSignal from "react-native-onesignal";

OneSignal.addEventListener('ids', (device) => {
    console.log("[OneSignal]>>ids: ", device);
});

// ....

AppRegistry.registerComponent ....

๊ทธ๋Ÿฌ๋‚˜ redux-persist rehydration => ์ฝœ๋ฐฑ์— ์ž‘๋ณ„ ์ธ์‚ฌ๋ฅผ ํ•œ ํ›„ OneSignal.addEventListener('ids' ... ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด.

FIX ๋Š” ํ˜„์žฌ (ํ˜„์žฌ react-native-onesignal ๋ฆด๋ฆฌ์Šค 3.0.3) ์ˆ˜์ •ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ids ์ด๋ฒคํŠธ๋ฅผ js ์ธก์œผ๋กœ ๋‹ค์‹œ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋„๋ก ๋„ค์ดํ‹ฐ๋ธŒ ์ธก( android ๋ฐ ios )์„ ๋งŒ๋“œ๋Š” OneSignal.configure() ๋ผ๋Š” ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ js ์ธก ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ 'ids'์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•œ ์งํ›„์— ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค.

// ... after store rehydration complete ...

OneSignal.addEventListener('ids', (device) => {
   // ... do whatever with device
});

OneSignal.configure();  // add this to trigger `ids` event

๋„ค์ดํ‹ฐ๋ธŒ ์ธก์—์„œ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‚ด ํ‰๊ฐ€์— ๋”ฐ๋ฅด๋ฉด ๋‘ ๋ฒˆ ์ด์ƒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์•ˆ์ „ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋‚ด๋ถ€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ๋” ์ด์ƒ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋งค๋ฒˆ ids ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค.

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

๋‚ด๋ถ€ ๊ตฌ๋…์ž ๋Œ€๊ธฐ์—ด์ด ์žˆ๋Š” react-native-onesignal lib์— ์˜ํ•ด ์ด๊ฒƒ์ด ๋” ์ž˜ ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก์ด ์ง€์—ฐ๋˜๋Š” ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋•Œ๋•Œ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” onIds์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ redux-persist์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

OneSignal ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ Doc์€ ์–ด์จŒ๋“  null์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๋ฒˆ ์‹œ๋„ํ•  ๋•Œ๋งˆ๋‹ค ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๊ฐ€ ํ˜„์žฌ ์–ผ๋งˆ๋‚˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๋ฐ OneSignal.requestPermissions()๋ฅผ ํ†ตํ•ด ๊ถŒํ•œ์„ ์ˆ˜๋ฝํ•œ ํ›„ "onIds" ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ 10์ดˆ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ ๊ณ ์นจ(๋ฐ๋ชจ ํ”„๋กœ์ ํŠธ ๋™์ž‘)ํ•  ๋•Œ๋งˆ๋‹ค ์—ฌ์ „ํžˆ ID๋ฅผ ๋ฐ›๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ ๋‚ด์˜ ๋‹ค๋ฅธ ์œ„์น˜์— ๋™์ผํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฐ์น˜ํ–ˆ์ง€๋งŒ ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์€ ์›์ธ์— ๋Œ€ํ•œ "๋“ฑ๋ก๋œ" ์ด๋ฒคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์•ฑ์„ ๋‹ซ์•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ด ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค๋ฒˆ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ์ˆ˜๋ฝํ•  ๋•Œ 5๋ฒˆ ์ค‘ 1๋ฒˆ(ํ‰๊ท ) ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๊ฐ€ ๊ดœ์ฐฎ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ์— ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์—ด ๋•Œ ID๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ด lib๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋„ redux-persist๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”! ๊ทธ๋ฆฌ๊ณ  ์•ฝ๊ฐ„์˜ ํŒŒ๊ธฐ ํ›„์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด redux-persist์™€ ๊ด€๋ จ ์ด ์žˆ๋‹ค๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ids ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ง€์—ฐ๋œ ๊ตฌ๋… .

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ index.xxx.js ์— ๋ฐ”๋กœ ๋„ฃ์œผ๋ฉด(์ฆ‰, ์•ฑ ์‹œ์ž‘ ์ดˆ๊ธฐ์—) ์•ฑ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

//... other imports
import OneSignal from "react-native-onesignal";

OneSignal.addEventListener('ids', (device) => {
    console.log("[OneSignal]>>ids: ", device);
});

// ....

AppRegistry.registerComponent ....

๊ทธ๋Ÿฌ๋‚˜ redux-persist rehydration => ์ฝœ๋ฐฑ์— ์ž‘๋ณ„ ์ธ์‚ฌ๋ฅผ ํ•œ ํ›„ OneSignal.addEventListener('ids' ... ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด.

FIX ๋Š” ํ˜„์žฌ (ํ˜„์žฌ react-native-onesignal ๋ฆด๋ฆฌ์Šค 3.0.3) ์ˆ˜์ •ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ids ์ด๋ฒคํŠธ๋ฅผ js ์ธก์œผ๋กœ ๋‹ค์‹œ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋„๋ก ๋„ค์ดํ‹ฐ๋ธŒ ์ธก( android ๋ฐ ios )์„ ๋งŒ๋“œ๋Š” OneSignal.configure() ๋ผ๋Š” ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ js ์ธก ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ 'ids'์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•œ ์งํ›„์— ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค.

// ... after store rehydration complete ...

OneSignal.addEventListener('ids', (device) => {
   // ... do whatever with device
});

OneSignal.configure();  // add this to trigger `ids` event

๋„ค์ดํ‹ฐ๋ธŒ ์ธก์—์„œ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‚ด ํ‰๊ฐ€์— ๋”ฐ๋ฅด๋ฉด ๋‘ ๋ฒˆ ์ด์ƒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์•ˆ์ „ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋‚ด๋ถ€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ๋” ์ด์ƒ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋งค๋ฒˆ ids ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค.

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

๋‚ด๋ถ€ ๊ตฌ๋…์ž ๋Œ€๊ธฐ์—ด์ด ์žˆ๋Š” react-native-onesignal lib์— ์˜ํ•ด ์ด๊ฒƒ์ด ๋” ์ž˜ ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก์ด ์ง€์—ฐ๋˜๋Š” ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

OneSignal.configure()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด; ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ „์— ์ด๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด redux-persist์ธ์ง€์กฐ์ฐจ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ์œผ๋กœ onIds ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๋ถˆ๊ทœ์น™ํ•œ ๋™์ž‘์œผ๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์•ฑ ์‹คํ–‰์—์„œ ์กฐ๊ธˆ ๋‚˜์ค‘์— ๋กœ๋“œ๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์— ๊ตฌ์„ฑ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋•Œ๋•Œ๋กœ ํ•˜๋‚˜์˜ onIds ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋•Œ๋กœ๋Š” ๋‘ ๊ฐœ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(์›๋ž˜ ์ด๋ฒคํŠธ๊ฐ€ ๊ฐ€๋” ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—).

๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜๊ณ  ํ˜„์žฌ Android, React Native 0.38์—์„œ ๋””๋ฒ„๊น… ์ค‘์ด๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์ด redux ์ง€์† ๋ฌธ์ œ๋ผ๊ณ  ์ œ์•ˆํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ตฌ์„ฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์ด ์—†๋‹ค๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€๋” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ๊ฐœํ•  ๋•Œ๋งˆ๋‹ค ๋‚ด API๋ฅผ ๋‘ ๋ฒˆ ๋ˆ„๋ฅด๋Š” ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ถ€์ •์ ์ธ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(๋น„ํšจ์œจ์„ฑ ์ œ์™ธ) ์ด๊ฒƒ์€ ์ €์—๊ฒŒ ์ „๋ฌธ ๋ถ„์•ผ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์ €๋„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ƒ์‚ฐ์ค‘์ž…๋‹ˆ๋‹ค. ;) ์˜ˆ, API๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. :(

์•ˆ๋…•ํ•˜์„ธ์š” @edo1493 ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. API๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ฑ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ (๊ฐœ๋ฐœ์ž ๋ชจ๋“œ) ์ด๋ฒคํŠธ๋Š” 35์ดˆ ํ›„์—๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
์ด๊ฒƒ์€ ์•ฑ์„ ์ฒ˜์Œ ๋กœ๋“œํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
ํ”Œ๋žซํผ: ์•ˆ๋“œ๋กœ์ด๋“œ

์•„๋งˆ๋„ @jkasten2 ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@edo1493 onIds ๋Š” OneSignal ์„œ๋ฒ„์—์„œ ํ”Œ๋ ˆ์ด์–ด/์‚ฌ์šฉ์ž ID๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, userId ๋Š” null ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ APN/FCM์ด ์ œ ์‹œ๊ฐ„์— ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด pushToken ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์—ฐ๊ฒฐ๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ ๊ธฐ๋ก์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์—์„œ setLogLevel ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Android์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ iOS์—์„œ logcat๊ณผ Xcode ๋กœ๊ทธ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ์ฃผ๋ชฉํ• ๋งŒํ•œ ๋ฌธ์ œ๋Š” redux-persist ์™€ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ด๋Š” OneSignal ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณ„์ธต์˜ ๋ฌธ์ œ๋ฅผ ์˜๋ฏธํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค. @avishayil redux-persist ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ์ง€์ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณต์œ ํ•˜๋ฉด ๋””๋ฒ„๊น…๋„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jkasten2 ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ redux-persist๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์žฌํ˜„ํ•  ์‹œ๊ฐ„์„ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์‚ฌ๋žŒ๋“ค ์ค‘ ํ•œ ๋ช…์ด ๋ฌธ์ œ๊ฐ€ ์žฌํ˜„๋œ redux-persist๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ repo๋ฅผ ๊ณต์œ ํ•˜๋ฉด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

redux๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@rcugut ๊ฐ์‚ฌ OneSignal.configure() ์ฆ‰์‹œ ์ˆ˜์ •ํ•˜์„ธ์š”! ์ €๋„ redux-persist ! ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

.configure๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ react-persist๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด OneSignal.configure() ํ•ดํ‚น๋„ ์ž‘๋™ํ•˜์ง€๋งŒ OneSignal.removeEventListener("ids", this.onIds) ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@junedomingo์™€ ๊ฐ™์€ ์ผ์— ์ง๋ฉด

Android์—์„œ๋Š” ์•ฑ์„ ์ฒ˜์Œ ๋กœ๋“œํ•  ๋•Œ 35์ดˆ ํ›„์— ids ์ด๋ฒคํŠธ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Android์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉฐ ์ด๋ฒคํŠธ๋Š” ๋ฌธ์ œ ์—†์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ onIds() ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” iOS์—์„œ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ „ํ›„์— OneSignal.configure() ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ˆ˜๋ถ„ ๋ณด์ถฉ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์ด๋‚˜ ํ›„์—(์˜ˆ, redux-persist ) ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฌ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@jkasten2 ids ๋ฆฌ์Šค๋„ˆ์— ๋Œ€ํ•ด @junedomingo๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด ๋ฐฉ๋ฒ•์˜ ์™ธ๋ถ€์™€ ๋‚ด๋ถ€์— ๋กœ๊ทธ๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

     OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
            public void idsAvailable(String userId, String registrationId) {
                final WritableMap params = Arguments.createMap();

                params.putString("userId", userId);
                params.putString("pushToken", registrationId);

                sendEvent("OneSignal-idsAvailable", params);
            }
        });

30์ดˆ ํ›„์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค!
์–ด๋–ค ์•„์ด๋””์–ด/์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

OneSignal.setRequiresUserPrivacyConsent(true)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ;
๋™์˜ํ•  ๋•Œ๊นŒ์ง€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!
OneSignal.provideUserConsent(true);

๋˜ํ•œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ OneSignal.configure()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
ํฌ๋ง์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ผํ•ฉ๋‹ˆ๋‹ค!!!

๊ฐ™์€ ๋ฌธ์ œ
๋ฒ„์ „: v3.3.1
ํ”Œ๋žซํผ: iOS

์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด userId๋Š” null์ด๋ฉฐ 29์ดˆ ํ›„์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ userId๋กœ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์„ ์ƒˆ๋กœ ์„ค์น˜ํ•œ ํ›„ ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.
Screen Shot 2019-08-05 at 3 04 59 PM

์•„์ง๋„ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๋ฒคํŠธ๋Š” Android์˜ ํด๋ฆฌ์–ด ๋ถ€ํŒ…์—์„œ ~30์ดˆ ํ›„์—๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

@damathryx ์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์ฒซ ๋ฒˆ์งธ ์ถœ์‹œ ๋ฌธ์ œ์—์„œ ๋™์ผํ•œ userId null์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์…จ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š” ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ฉ

๋‚˜๋ฅผ ์œ„ํ•ด ํ‘ธ์‹œ ์•Œ๋ฆผ์€ .configure ์—†์ด Android์—์„œ ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ ID๊ฐ€ ์ œ๋Œ€๋กœ ํŠธ๋ฆฌ๊ฑฐ๋˜๊ณ  ์žฅ์น˜ ์ •๋ณด๊ฐ€ ์ˆ˜์‹ ๋˜์ง€๋งŒ ์•Œ๋ฆผ ์ž์ฒด๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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