Qu’est-ce que la définition de NSStreamNetworkServiceTypeBackground «fait sous le capot»?

J’ai une application interne (non destinée à la dissortingbution en magasin sur le iPhone, donc non soumise à l’approbation de Apple) qui doit conserver une poignée de sockets TCP et UDP liés pendant son fonctionnement.

Lors des tests, j’ai remarqué un comportement étrange avec mon socket lié: il se ferme chaque fois que l’appareil se met en veille. Cela se produit, par exemple, lorsque vous appuyez sur le bouton d’alimentation situé en haut du téléphone et que je ne le souhaite vraiment pas. Sans compter que cela ressemble à une violation flagrante du contrat d’API de socket BSD.

Le code du socket est entièrement écrit en C, vous n’utilisez donc pas les bibliothèques Objective-C nsstream .

J’ai remarqué qu’il y avait différentes manières de garder les sockets ouvertes pour des choses telles que la VoIP, la diffusion de musique en continu, etc. La documentation nsstream elle-même répertorie une propriété NSStreamNetworkServiceTypeBackground qui semble pouvoir aider mon application à garder son socket ouvert lorsque le téléphone se met en veille. La partie inférieure de la documentation Apple répertorie les propriétés suivantes:

Constantes

NSStreamNetworkServiceTypeVoIP
Spécifie que le stream fournit un service VoIP.

NSStreamNetworkServiceTypeVideo
Spécifie que le stream fournit un service vidéo.

NSStreamNetworkServiceTypeBackground
Spécifie que le stream fournit un service en arrière-plan.

NSStreamNetworkServiceTypeVoice
Spécifie que le stream fournit un service vocal.

Mais comme le code réseau de mon application n’utilise pas les API Objective-C, j’ai besoin de savoir: comment les constantes ci-dessus sont-elles implémentées? Peut-être qu’il y a une option de socket non documentée que je peux utiliser pour obtenir le même résultat? En gros, je dois juste dire au kernel de ne pas toucher à ma socket quand le périphérique est en veille.

edit : comme alternative au reverse engineering des appels du kernel, il existe peut-être un moyen de passer mes descripteurs de fichier de socket au code Objective-C où ces options peuvent être appliquées.

Si vous utilisez CFStream pour la mise en réseau, vous pouvez procéder comme suit:

 NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream; NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream; 

Après cela, vous pouvez utiliser les constantes que vous avez déjà trouvées avec ObjC NSInputStream et NSOutputStream . ( NSInputStream et NSOutputStream étendent tous deux NSStream .)

clientSocket c socket et doit déjà avoir été connecté, utilisez ensuite l’object c:

 @property (nonatomic, strong) NSInputStream *inputStream ; @property (nonatomic, strong) NSOutputStream *outputStream ; CFReadStreamRef readStreamRef = nil ; CFWriteStreamRef writeStreamRef = nil ; CFStreamCreatePairWithSocket(NULL, clientSocket, &readStreamRef, &writeStreamRef) ; // the socket must have already been connected. _inputStream = (__bridge_transfer NSInputStream *)readStreamRef ; _outputStream = (__bridge_transfer NSOutputStream *)writeStreamRef ; [_inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ; [_outputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ; [_inputStream open] ; [_outputStream open]