Как управлять статусом Online/Offline/Away в фоновом режиме PUBNUB + IOS?

70
8

Мы хотим реализовать Online/Offline с использованием инфраструктуры Pubnub в iOS, но приложение не работает в фоновом режиме более 10 минут. Мы попытались реализовать это, включив функцию местоположения и ее работу. Но клиент не хочет включать службу определения местоположения для этой цели. Итак, как нам удастся сделать запуск в фоновом режиме бесконечным? (QUE 1)

И если мы хотим поставить Online/Offline/Away в наш код

Где мы должны показывать, Online: Когда пользователь открывает приложение в автономном режиме: когда пользователь закрывает приложение из фона или удаляет приложение Away: когда пользователь нажимает кнопку "домой" и приложение находится в фоновом режиме.

Как мы это реализуем (Специальное состояние AWAY & Offline)? (QUE 2)

Есть ли другой способ управления Online/Offline/Away? (Без Pubnub) (QUE 3) Если да, пожалуйста, опишите путь.

Как мы будем управлять Online/Offline/Away с помощью веб-службы? Когда мы называем это веб-сервисами? (QUE 4)

Мы используем почти 3-4-летний базовый код. Так что мы должны добавить какой-либо другой параметр в plist, чтобы включить приложение в фоновом режиме на большее время? (QUE 5)

Пожалуйста, направляйте нас.

спросил(а) 2020-04-04T00:58:30+03:00 5 месяцев, 4 недели назад
1
Решение
69

С PubNub Presence у вас есть лучший способ предоставить эту функцию в вашем приложении, но из-за того, что приложение iOS управляет приложением, вы можете или не иметь возможность обновлять этот статус (зависит от того, как приложение настроено на запуск).

Но очень просто, включив Presence для ваших ключей PubNub, когда клиент подписывается на канал, событие join отправляется всем другим подписчикам, которые слушают присутствие на этом канале.

Когда приложение переходит в фоновый режим, если у вас есть возможность сделать это, вы можете позвонить отказаться от leave подписки по всем каналам клиент подписался на и leave событие будет отправлен всем абонентам, что/те каналы, слушающие наличие событий.

И если приложение должно быть убито или перейти на задний план, где у вас нет возможности позвонить от unsubscribe, когда приложение отключено/отключено дольше, чем настроенный период биения, тогда timeout (эквивалент события leave) будет отправляется всем абонентам, которые прослушивают события присутствия.

Сердцебиение по умолчанию составляет 5 минут, но вы можете настроить его на более низкую настройку, например, 60 секунд (или короче для случаев использования, которые требуют этого, но не ниже 15 секунд).

Если вы хотите, чтобы ваш сервер прослушивал события присутствия, вы захотите использовать наши веб-камеры присутствия (документы скоро появятся). См. qaru.site/questions/2151527/....

ответил(а) 2020-04-04T01:10:32.351199+03:00 5 месяцев, 4 недели назад
41

Существует два сценария:

    Пользователь ставит приложение в фоновом режиме Пользователь закрывает приложение.

Что вам нужно сделать, так это получить уведомление, когда происходят эти события:

[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(appWillResignActive)
name:UIApplicationWillResignActiveNotification
object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillTerminate)
name:UIApplicationWillTerminateNotification
object:nil];

Теперь, в соответствующих методах, установите состояние с помощью PubNub API


-(void)appWillResignActive
{
// Sample dictionary
NSDictionary *dicState = @{ @"userName" : senderName, // Optional
@"status" : @"Away", // Or whatever
@"isTyping" : @FALSE // Optional
};

[AppDel.client setState: dicState
forUUID: senderId // current user UUID
onChannel: KPubNubChannelName // channel name
withCompletion: ^(PNClientStateUpdateStatus *status)
{
NSLog(@"%@", status);
}];
}

Когда состояние будет обновлено на PubNub, все подписчики этого канала будут уведомлены, то есть будет вызван метод follwing:

- (void)client:(PubNub *)client didReceivePresenceEvent:(PNPresenceEventResult *)event 
{
if (![event.data.channel isEqualToString:event.data.subscription])
{
// Presence event has been received on channel group stored in event.data.subscription.
}
else
{
// Presence event has been received on channel stored in event.data.channel.
}

if (![event.data.presenceEvent isEqualToString:@"state-change"]) {

NSLog(@"%@ \"%@'ed\"\nat: %@ on %@ (Occupancy: %@)", event.data.presence.uuid,
event.data.presenceEvent, event.data.presence.timetoken, event.data.channel,
event.data.presence.occupancy);
}
else {

NSLog(@"%@ changed state at: %@ on %@ to: %@", event.data.presence.uuid,
event.data.presence.timetoken, event.data.channel, event.data.presence.state);
}
}

Когда он будет вызван, вам придется соответствующим образом обновить свой источник данных, который будет отражать обновление состояния.

ответил(а) 2020-04-04T00:58:30+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема