2016-04-14 7 views
0

Wenn didReceiveStatus nach dem Abonnieren eines Kanals aufgerufen wird, können die gerade abonnierten Kanäle nicht abgerufen werden.Ähnliche abonnierte Kanäle in didReceiveStatus in PubNub für iOS-Ziel abrufen C

PNSubscribeStatus.data.subscribedChannel oder PNSubscribeStatus.data.actualChannel sind immer null und PNSubscribeStatus.subscribedChannels gibt alle derzeit abonnierten Kanäle und nicht diejenigen, die die didReceiveStatus Rückruf ausgelöst.

Was machen wir hier falsch?

Antwort

0

In SDK 4.0 gibt didReceiveStatus eine PNStatus zurück, die gemäß der Klassendokumentation diese zusätzlichen Informationen nicht enthält, außer es liegt ein Fehler vor. Für unsere Anwendung verwenden wir diesen Handler, um den Verbindungsstatus zum PubNub-Server zu überwachen.

+0

Wir müssen nach dem Abonnement eine bestimmte Nachricht an den Kanal senden. Das Ziel ist, es aus dem Rückruf zu senden, so dass wir sicher sind, dass wir ähnliche Antworten von anderen Geräten erhalten haben. – ebelrose

+0

Ich bin sicher, dass Sie dies in Betracht gezogen haben, aber Sie könnten das wahrscheinlich vom Completion-Handler des Abonnenten einleiten Anruf. –

+0

Gibt es einen Abschluss-Handler mit dem Abonnement-Anruf? Kann das in der Dokumentation nicht sehen. - subscribeToChannels: withPresence: - subscribeToChannels: withPresence: clientState: – ebelrose

0

PubNub Nachricht empfangen Sender in iOS

sollten Sie in der Lage sein, den Kanal zu erhalten, die Sie die Nachricht erhalten auf, aber bekommen es hängt davon ab, ob Sie mit dem Kanal oder einer Kanalgruppe abonniert haben, der den Kanal enthält . Dies ist ein Beispielcode aus dem PubNub Objective-C for iOS SDK subscribe API Reference:

- (void)client:(PubNub *)client didReceiveMessage:(PNMessageResult *)message { 

    // Handle new message stored in message.data.message 
    if (message.data.actualChannel) { 

     // Message has been received on channel group stored in 
     // message.data.subscribedChannel 
    } 
    else { 

     // Message has been received on channel stored in 
     // message.data.subscribedChannel 
    } 
    NSLog(@"Received message: %@ on channel %@ at %@", message.data.message, 
      message.data.subscribedChannel, message.data.timetoken); 
} 

Wenn Sie andere Kanäle benötigen, die der Kunde abonniert hat, können Sie die where-now API nennen.

Wenn Sie mehr dynamisch sein über das, was der reply-to Kanal sein sollte, dann sind genau das Kanalname in der Nachricht, wenn es veröffentlicht wird, hat den Verlag unter der Annahme, Vorwissen über welchen Kanal das ist. Oder Sie können eine Just in Time Suche auf Ihrem Server, auf welchen Kanal zu antworten. Hier

+0

Hallo Craig, Das beantwortet unsere Frage nicht. Wir haben nicht gebeten, den Kanal beim Empfang einer Nachricht abzurufen, wir bitten darum, den Kanal von einem ** Subskriptionsrückruf ** aka didReceiveStatus abzurufen – ebelrose

0

ist PubNub Unterstützung Antwort auf diese:

Eigentlich status.data.subscribedChannel und status.data.actualChannel gewidmet Präsenzveranstaltungen und Empfangen von Nachrichten Rückrufe wo Informationen über Quellen der Veranstaltung wichtig ist.

In-Client: didReceiveStatus: Client gibt keine Informationen über bestimmten Kanal, auf dem Client abonniert wurde. Wenn der Client beginnt, diese Informationen zu verfolgen, gibt es keine Garantie dafür, dass er den erwarteten Wert zurückgibt (da der Entwickler einige Kanäle erwartet). In der vorherigen Version (3.x) wurden alle diese Informationen verfolgt, aber , weil es jederzeit geändert werden kann - Ergebnis war manchmal unvorhersehbar.

abonnieren können in Folge von Methoden (nacheinander) erfolgen wie: abonnieren A1, C1 abonnieren, abonnieren B1 und B2, C1 austragen und B1 - dies als Ergebnis wird sich mit einzelnen Aufruf von -client beenden : didReceiveStatus: mit resultierendem Satz von Kanälen.

Es ist immer am besten, nur zu überprüfen, ob Ihre Kanäle in s_tatus.subscribedChannels_ ist.

Meine Kommentare: Der Punkt der asynchronen Prozess aufweist, ist nicht genau diese Methoden als Folge zu denken ... Wir können nicht die Garantie haben, die Abonnements in der exakt gleichen Reihenfolge wie der Zeichnungsantrag gemacht werden, es sei denn Wir blockieren andere Abonnementanforderungen, bis die vorherige abgeschlossen ist.