Сохранение сокета открытым в приложении Swift для чата
У меня есть работающий чат-сервер в Php/Ratchet. Я использую Starscream в качестве моего клиента в Swift. Я успешно создал чат между пользователями, однако это работает только тогда, когда мое приложение открыто, потому что это когда сокет открыт. Как заставить мое приложение получать сообщения, даже если мое приложение не включено. Так что в основном есть способ держать розетки открытыми. Я где-то читал, что это запрещено Apple.
2 ответа
Похоже, вы отправляете сообщения с вашего клиента на телефон. Вам нужно отправлять сообщения на сервер, а сервер отправляет их на ваш телефон.
Если сервер не может успешно отправить сообщение на ваш телефон, он должен сохранить это сообщение и отправить сохраненные сообщения на телефон, когда он будет доступен.
Существуют системы очередей сообщений для подобных вещей. Смотрите, например, RabbitMQ. Также есть множество других, которые могут лучше работать с вашим технологическим стеком. Провести исследования.
Здесь клиент общается с сервером, сервер соединяется с RabbitMQ или любым другим способом, который вы выбираете, RabbitMQ отслеживает сообщения в очереди, и когда телефон подключается к сети, RabbitMQ отправляет сообщения в очередь на сервер, а сервер отправляет их Телефон.
PS Google "Очередь сообщений PHP".
Существует высокая вероятность того, что ваш процесс в какой-то момент будет остановлен системой, поэтому я бы не стал полагать, что приложение будет активным в фоновом режиме.
- Попробуйте найти решение для получения прошлых сообщений, когда клиент станет онлайн.
- Прочтите об Apple Push Notification Service, чтобы уведомлять пользователей о сообщениях, когда приложение не активно.
Вам необходимо синхронизироваться с сервером. Сделайте следующие шаги.
Выгрузить каждое сообщение в базе данных, т.е. разговор с обеих сторон с отметкой времени.
Когда приложение переходит в фоновый режим и выходит на передний план, очистите все сообщения, которые находятся на вашем экране / локальном массиве для отображения сообщений на экране, вызовите службу синхронизации, которая будет извлекать весь разговор, потому что определенно сервер будет иметь все сообщения, кормить вас экраном с этим сервисным ответом.
Система iOS будет получать вызовы сокетов на уровне ядра, но не будет передавать эти сообщения вашему приложению, поэтому вы не будете получать сообщения, пока приложение находится в фоновом режиме.
- Когда приложение убито, вы можете реализовать APNS от Apple.