2010-08-09 4 views
2

Je suis en train de mettre en œuvre le mode d'arrière-plan pour l'application VoIP en utilisant les nouveaux mécanismes fournis par l'iPhone OS 4.xiPhone OS 4.x - sockets TCP fond ne répondent pas

Toujours sans succès ... reste d'application silencieux en mode d'arrière-plan lorsque certaines données arrivent du serveur via le socket TCP.

Selon la documentation, les suivants deux choses doivent être faites:

  1. Ajouter voip valeur pour Required background modes dans Info.plst fichier
  2. Set propriété kCFStreamNetworkServiceType de CFReadStreamRef objet à kCFStreamNetworkServiceTypeVoIP valeur

I utilise un socket BSD créé de manière externe pour instancier CFReadStreamRef avec la fonction CFStreamCreatePairWithSocket. La poignée du socket est correcte - vérifiée avec quelques tests. Donc j'obtiens un objet CFReadStreamRef correct, que je configurerai et ouvrirai plus tard.

Voici le morceau de code:

CFSocketNativeHandle socket = (CFSocketNativeHandle)socketHandle; 
CFStreamCreatePairWithSocket(kCFAllocatorDefault, socket, &sipSocketReadStream, nil); 
CFReadStreamSetProperty(sipSocketReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); 
NSInputStream *inputStream = (NSInputStream*)sipSocketReadStream; 
[inputStream setDelegate:self]; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
CFReadStreamOpen(sipSocketReadStream); 

S'il vous plaît noter - mon délégué pour NSInputStream reçoit avec succès l'événement Stream Opened. Mais tous les autres événements ne sont tout simplement pas venus - je m'attendais à recevoir un événement lorsqu'un certain trafic TCP a commencé à arriver.

Répondre

2

Vous devez vous assurer que vous avez UIBackgroundModes comme un tableau, avec l'option voip dans votre fichier plist:

<key>UIBackgroundModes</key> 
<array> 
    <string>voip</string> 
</array> 

En outre, voip tâches de fond ne PAS travail dans le simulateur, alors assurez-vous vous testez avec un vrai appareil. Si vous avez défini le UIBackgroundModes correctement et que vous avez défini le type de flux sur kCFStreamNetworkServiceTypeVoIP, ma seule conclusion est que vous effectuez probablement des tests avec le simulateur.

4

Je dois réitérer le sage conseil mentionné par Gilad. Les sockets TCP d'arrière-plan font NOT fonctionnent sur le simulateur. J'ai passé un certain temps à essayer d'aller au fond de ce problème, aspiré par la commodité du simulateur. En outre, et peut-être que c'est juste moi, je n'ai pas trouvé clair dans la documentation quelle valeur était la clé et quelle valeur était la propriété. Pour mémoire, voici comment je l'ai mis et cela fonctionne:

res = [oStream setProperty:NSStreamNetworkServiceTypeVoIP 
        forKey:NSStreamNetworkServiceType]; 

if(!res){ 
    // Error handling here 
} 
0

Je chose que vous manque [fluxEntrée ouvert] ouvrir le flux .Une fois que j'espère que vous appelez votre méthode de délégué. Après une connexion TCP réussie en mode VOIP, seul l'iOS garde votre socket en vie même en mode d'arrière-plan.

Questions connexes