Dmitry
И да, в registerComponent прокинут store и Provider ?
Peter
Navigation.registerComponent( "ReactNativeReduxExample.Hometab", () => Hometab, store, Provider );
Peter
const createStoreWithMiddleware = applyMiddleware(thunk)(createStore); const reducer = combineReducers(reducers); const store = createStoreWithMiddleware(reducer);
Peter
вызываю консоль логом
Peter
и вижу пропс проброшен
Peter
но значение undefined
Peter
хотя вот
Peter
const initialState = Immutable({ root: undefined, users: "user123", isLoading: false });
Peter
а, надо было в mapState не state.prop а state.root.prop обращаться
Peter
вопрос закрыт
Vlad
Привет всем! А есть ли тут люди, которые делали приложения с реферальной системой? Чтобы можно было привлекать друзей в приложение и получать за это бонусные баллые?
Dmitry
А вот вам задачка, хорошего решения я пока не нашел, поэтому довольствуюсь плохим, но более менее рабочим. Итак, есть некий REST API, который возвращает массив сообщений. Запрашиваем, получаем, кладем в стор и работаем с ними. Как результат имеем всегда свежие данные. Далее, я хочу сделать возможность оффлайн просмотра последних N сообщение и кладу их в AsyncStorage. Перед запросом на сервер кидаю в стор данные из AsyncStorage, а свежие данные докидываю, когда прилетят. Пока все просто и понятно. Далее, сообщения могут быть изменены на сервере и тогда в запросе прилетят обновленные сообщения, тут мы просто их мерджим. А далее самое сложное (на мой взгляд), сообщения могут быть удалены на сервере, тогда в запросе их не будет и нужно, а они лежат в AsyncStorage. Сейчас в запросе прилетают все сообщения с флагами deleted и по нему удаляются из AsyncStorage, но тогда приложения всегда тянет лишние данные, которых может быть очень много. Для решения был сделан polling для отправки события удаления сообщения на сервере к приложению и по нему эти сообщения удаляются из AsyncStorage и тут возникает новая проблема. У одного получателя может быть несколько устройств с приложениями и своми кэшами, которые могут быть оффлайн на момент получения уведомления от сервера. Можно было помечать доставленные уведомления от сервера к конкретному приложению, но текущая реализация нигде не хранит уведомления, они создаются в момент, какого-то события, отправляются один раз и, в случае не получения уведомления (оффлайн), получатель второй раз его уже не получит. Может быть, кто-то сталкивался с такими задачи на правктике или имеет свои мысли на этот счет, с удовольствием обсужу варианты)
Arsenii
возможно можно сравнивать ид которе пришли с сервера и удалять из стора все которые не нашлись в ответе?
Dmitry
возможно можно сравнивать ид которе пришли с сервера и удалять из стора все которые не нашлись в ответе?
в ответе может не быть сообщений, которые не были изменены или удалены, тогда из кэша удалятся сообщения, которые должны остаться там
Vladimir
А как выглядит метод запроса удаленных, какие параметры?
Dmitry
Возможно, что единственным способом будет хранить все уведомления под все устройства в БД с флагами о получении и так синхронизировать
Dmitry
А как выглядит метод запроса удаленных, какие параметры?
Принудительно удаленные не запрашиваются
Vladimir
Они пушатся?
Dmitry
Они пушатся?
Да, они прилетают с сервера в момент события и только. Понятно, что можно при входе запрашивать удаленные, т.к. в онлайне они событиями удалятся, но так ты не можешь контролировать, какие именно из них ты уже удалил у себя и будешь всегда тянуть с сервера все удаленные
Vladimir
Возможно, стоит получать «историю» изменения сообщений, легковесный запрос, не привязанный к конкретному устройству, там лишь нужен некий id для получения истории (дата, номер последнего и т.п)
Vladimir
В EWS, Gmail всё примерно так, в IMAP чуть упрощённее. Но это почта. В мессенджерах повеселее протоколы, наверное, можно их курить.
Arsenii
возможно поможет отпрпавка пушей, и приложение будет их обрабатывать? но не показывать. Вот только не уверен что в ios обычные пуши так могут. Voip могут, так делал
Vladimir
У телеграмма открыт код вроде как
Dmitry
возможно поможет отпрпавка пушей, и приложение будет их обрабатывать? но не показывать. Вот только не уверен что в ios обычные пуши так могут. Voip могут, так делал
В онлайне так и есть, но ни iOS ни Android не гарантируют достувку пушей, плюс ты можешь его смахнуть и приложение о нем не узнает
Arsenii
в андроиде можно получить и обработать, даже не показав вот в ios не уверен, но помоему там на 30 сек запускается апп при voip пуше. а если сделать фоновую процесс (через то что в RN есть) и ходить на сервер раз в час или как система пустит, за списком удаленных. в запрос добавить время с которого надо начинать список
Vladimir
В iOS есть silent push
Gena
А вот вам задачка, хорошего решения я пока не нашел, поэтому довольствуюсь плохим, но более менее рабочим. Итак, есть некий REST API, который возвращает массив сообщений. Запрашиваем, получаем, кладем в стор и работаем с ними. Как результат имеем всегда свежие данные. Далее, я хочу сделать возможность оффлайн просмотра последних N сообщение и кладу их в AsyncStorage. Перед запросом на сервер кидаю в стор данные из AsyncStorage, а свежие данные докидываю, когда прилетят. Пока все просто и понятно. Далее, сообщения могут быть изменены на сервере и тогда в запросе прилетят обновленные сообщения, тут мы просто их мерджим. А далее самое сложное (на мой взгляд), сообщения могут быть удалены на сервере, тогда в запросе их не будет и нужно, а они лежат в AsyncStorage. Сейчас в запросе прилетают все сообщения с флагами deleted и по нему удаляются из AsyncStorage, но тогда приложения всегда тянет лишние данные, которых может быть очень много. Для решения был сделан polling для отправки события удаления сообщения на сервере к приложению и по нему эти сообщения удаляются из AsyncStorage и тут возникает новая проблема. У одного получателя может быть несколько устройств с приложениями и своми кэшами, которые могут быть оффлайн на момент получения уведомления от сервера. Можно было помечать доставленные уведомления от сервера к конкретному приложению, но текущая реализация нигде не хранит уведомления, они создаются в момент, какого-то события, отправляются один раз и, в случае не получения уведомления (оффлайн), получатель второй раз его уже не получит. Может быть, кто-то сталкивался с такими задачи на правктике или имеет свои мысли на этот счет, с удовольствием обсужу варианты)
При такой постановке - REST API... хорошего (прям реал-тайм) решения не будет. Нужна возможность пуша со стороны сервера (не мобильного, а просто послать клиенту что-то без поллинга)... Вот вам кратко мой вариант: 0. Для простоты - "канал сообщений" (список) один глобальный, все клиенты равноправны. Мы оптимизируем время обновления и трафик. Мы не оптимизируем время разработки и не подстраиваимся под существующие решения. 1. Транспорт WebSockets, енкодинг произвольный, допустим json. 2. Сообщение на сервере, помимо прочего имеет атрибуты: id, таймштамп создания, таймштамп изменения, флаг "удалено". 3. После загрузки и установки соединения, клиент делает запрос: "сервер, дай мне список последних N сообщений, у меня есть сообщения с ID1 по ID2, последний раз я получал их во время T", сервер на это шлет a. если диапазон последних N сообщений не пересекается с ID1-ID2, то список с флагом, что кеш надо почистить. b. если диапазон пересекается, то: список новых сообщений, список обновившихся с момента T из диапазона ID1-ID2 сообщений, в том числе удаленных (для экономии трафика, можно слать удаленные отдельным списком айдишников) Т.е. ответ сервера, это: список изменившихся сообщений и флаг сброса кеша 4. С момента соединения, сервер так же абсолютно независимо от п.3 до момента дисконнекта шлет отдельными командами обновления на каждое новое, модифицированное или удаленное сообщение всем приконнекченным клиентам... 5. Клиент, получив ответ на 3, мержит к себе в модель данных изменения, при необходимости стирает кеш (м.б. клиент последний раз год назад открывали) и разблокирует UI (в том смысле, что показать кеш можно было и раньше, но давать менять что-то не надо бы). 6. Клиент с самого начала слушает индивидуальные обновления от сервера, по каждому соотвественно обновляет модель.
Dmitry
Спасибо за участие. К сожалению сейчас нет возможности использовать сокеты, поэтому и приходится работать с пуллингом
Dmitry
При такой постановке - REST API... хорошего (прям реал-тайм) решения не будет. Нужна возможность пуша со стороны сервера (не мобильного, а просто послать клиенту что-то без поллинга)... Вот вам кратко мой вариант: 0. Для простоты - "канал сообщений" (список) один глобальный, все клиенты равноправны. Мы оптимизируем время обновления и трафик. Мы не оптимизируем время разработки и не подстраиваимся под существующие решения. 1. Транспорт WebSockets, енкодинг произвольный, допустим json. 2. Сообщение на сервере, помимо прочего имеет атрибуты: id, таймштамп создания, таймштамп изменения, флаг "удалено". 3. После загрузки и установки соединения, клиент делает запрос: "сервер, дай мне список последних N сообщений, у меня есть сообщения с ID1 по ID2, последний раз я получал их во время T", сервер на это шлет a. если диапазон последних N сообщений не пересекается с ID1-ID2, то список с флагом, что кеш надо почистить. b. если диапазон пересекается, то: список новых сообщений, список обновившихся с момента T из диапазона ID1-ID2 сообщений, в том числе удаленных (для экономии трафика, можно слать удаленные отдельным списком айдишников) Т.е. ответ сервера, это: список изменившихся сообщений и флаг сброса кеша 4. С момента соединения, сервер так же абсолютно независимо от п.3 до момента дисконнекта шлет отдельными командами обновления на каждое новое, модифицированное или удаленное сообщение всем приконнекченным клиентам... 5. Клиент, получив ответ на 3, мержит к себе в модель данных изменения, при необходимости стирает кеш (м.б. клиент последний раз год назад открывали) и разблокирует UI (в том смысле, что показать кеш можно было и раньше, но давать менять что-то не надо бы). 6. Клиент с самого начала слушает индивидуальные обновления от сервера, по каждому соотвественно обновляет модель.
Как гарантировать целостность, если например с ID1 по IDn есть пропущенные сообщения. По ним не получить актуальную информацию
Gena
А с обычным протоколом HTTP, я не знаю как такое сделать нормально, дело в том, что вот этот запрос на последние сообщения довольно тяжелый для сервера. С поллингом, сервер ляжет от таких запросов, но логически это по прежнему рабочая схема должна быть.
Dmitry
На самом деле...
Dmitry
Пока я расписывал всю эту историю, похоже что пришёл к решению
Dmitry
Достаточно хранить историю событий, которые произошли в оффлайне и отдавать ее при входе в онлайн
Vit
Рассказываю рассказываю уже сам понял а они...
Dmitry
Рассказываю рассказываю уже сам понял а они...
Где-то читал - «Мой кот прекрасно разбирается в программировании. Стоит рассказать ему проблему, как тут же находится решение.»
Vit
Ну это "желтая уточка")
Vit
https://ru.wikipedia.org/wiki/Метод_утёнка
Vit
Работает кстати))
Dmitry
Факт
Dmitry
А кто нибудь вообще пытался проксировать сокеты через NGINX? Я Билый час потратил так и не завелось
Dmitry
Спасибо, перепроверю, но по-моему у меня при схожем конфиге не завелось...
елек
чому у меня в тулзах нету андоид эмулятора, хотя и показано что он установлен?
чей ты
чому у меня в тулзах нету андоид эмулятора, хотя и показано что он установлен?
Была такая проблема , вам нужно открыть в студи не корень проекта , а <project_root>/android
елек
Была такая проблема , вам нужно открыть в студи не корень проекта , а <project_root>/android
всмысле не корень проекта , а <project_root>/android? я сейчас просто собираюсь открыть эмулятор у меня нет никакого проекта сейчас по андроид студио. открываю я студию как обычно через в линуксе `<my_path>/android-studio/bin/studio.sh`
елек
не понел что мне сделать
Никита
без запуска студии запускаю эмулятор в таком стиле: emulator -avd Pixel_API_27
елек
интересно в каких тулзах вы хотите увидеть эмулятор? если даже проект не открыли
мне импортировать иуда что проект на реакт нативе, чтобы запустить эмулятор?
Ololo
без запуска студии запускаю эмулятор в таком стиле: emulator -avd Pixel_API_27
а что бы со студии открыть, надо проект сам открыть
елек
ок понел
Ololo
обычный на андроиде вроде, там уже есть готовые
Никита
допустим, я предпочитаю лишний раз студию не открывать - больно долго, учитывая что обычно мне от нее надо только gradle обновить. Билдить предпочитаю через консоль
елек
наверно полносью студия не установилась
елек
хотя у меня есть <mypath>Android/Sdk/emulator/>
елек
странно что не дали возможность запустить эмулятор без создания нового проекта
чей ты
хотя у меня есть <mypath>Android/Sdk/emulator/>
start-nexus.sh #!/bin/bash cd $HOME/Android/Sdk/tools/ ./emulator @nexus-5-23 &
елек
елек
кроме ndk
елек
но все равно эмулятора не видно
елек
что это значит?
Сергій
вот
елек
вот
огромное спасибо
елек
(странно что в тулзах не было)
Сергій
(странно что в тулзах не было)
зависит от версии студии
Сергій
да и у тебя похоже андроид сдк не засетаплен
Сергій
так как нету пункта Android
елек
да и у тебя похоже андроид сдк не засетаплен
что это значит? я установил на линукс как по инструкции
елек
Сергій
какая версия студии?