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
возможно можно сравнивать ид которе пришли с сервера и удалять из стора все которые не нашлись в ответе?
Vladimir
А как выглядит метод запроса удаленных, какие параметры?
Dmitry
Возможно, что единственным способом будет хранить все уведомления под все устройства в БД с флагами о получении и так синхронизировать
Dmitry
Vladimir
Они пушатся?
Dmitry
Они пушатся?
Да, они прилетают с сервера в момент события и только. Понятно, что можно при входе запрашивать удаленные, т.к. в онлайне они событиями удалятся, но так ты не можешь контролировать, какие именно из них ты уже удалил у себя и будешь всегда тянуть с сервера все удаленные
Vladimir
Возможно, стоит получать «историю» изменения сообщений, легковесный запрос, не привязанный к конкретному устройству, там лишь нужен некий id для получения истории (дата, номер последнего и т.п)
Vladimir
В EWS, Gmail всё примерно так, в IMAP чуть упрощённее. Но это почта. В мессенджерах повеселее протоколы, наверное, можно их курить.
Arsenii
возможно поможет отпрпавка пушей, и приложение будет их обрабатывать? но не показывать. Вот только не уверен что в ios обычные пуши так могут. Voip могут, так делал
Dmitry
Vladimir
У телеграмма открыт код вроде как
Dmitry
Arsenii
в андроиде можно получить и обработать, даже не показав
вот в ios не уверен, но помоему там на 30 сек запускается апп при voip пуше.
а если сделать фоновую процесс (через то что в RN есть) и ходить на сервер раз в час или как система пустит, за списком удаленных. в запрос добавить время с которого надо начинать список
Vladimir
В iOS есть silent push
Dmitry
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
Gena
А с обычным протоколом HTTP, я не знаю как такое сделать нормально, дело в том, что вот этот запрос на последние сообщения довольно тяжелый для сервера. С поллингом, сервер ляжет от таких запросов, но логически это по прежнему рабочая схема должна быть.
Dmitry
На самом деле...
Dmitry
Пока я расписывал всю эту историю, похоже что пришёл к решению
Dmitry
Достаточно хранить историю событий, которые произошли в оффлайне и отдавать ее при входе в онлайн
Vit
Рассказываю рассказываю уже сам понял а они...
Vit
Ну это "желтая уточка")
Vit
https://ru.wikipedia.org/wiki/Метод_утёнка
Dmitry
Vit
Работает кстати))
Dmitry
Факт
Dmitry
А кто нибудь вообще пытался проксировать сокеты через NGINX? Я Билый час потратил так и не завелось
Demuz
Demuz
Dmitry
Спасибо, перепроверю, но по-моему у меня при схожем конфиге не завелось...
елек
чому у меня в тулзах нету андоид эмулятора, хотя и показано что он установлен?
елек
не понел что мне сделать
чей ты
Никита
без запуска студии запускаю эмулятор в таком стиле:
emulator -avd Pixel_API_27
елек
чей ты
Ololo
елек
ок понел
Ololo
обычный на андроиде вроде, там уже есть готовые
Никита
допустим, я предпочитаю лишний раз студию не открывать - больно долго, учитывая что обычно мне от нее надо только gradle обновить. Билдить предпочитаю через консоль
елек
елек
наверно полносью студия не установилась
елек
хотя у меня есть <mypath>Android/Sdk/emulator/>
чей ты
елек
странно что не дали возможность запустить эмулятор без создания нового проекта
елек
елек
елек
елек
кроме ndk
елек
но все равно эмулятора не видно
елек
что это значит?
Сергій
елек
елек
(странно что в тулзах не было)
Сергій
Сергій
да и у тебя похоже андроид сдк не засетаплен
Сергій
так как нету пункта Android
елек
Сергій
какая версия студии?