[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Linphone-developers] Network reachability callback problem in Linph
From: |
Albrecht Andrzejewski |
Subject: |
Re: [Linphone-developers] Network reachability callback problem in Linphone iPhone |
Date: |
Fri, 6 Jul 2012 16:20:01 +0200 |
Ivan, are you saying that you manage to have NetworkReachability callbacks
calls in background mode by using NSStream API instead of the old C socket API ?
Le 5 juil. 2012 à 08:55, IVAN FERNANDEZ a écrit :
> Hi again,
>
> I've been around this issue for some days, and finally the problem looks to
> be closely related with the NSStreamNetworkServiceTypeVoIp connection mode,
>
> Looks like a suspended app only could listen to connectivity changes once it
> has established an active NSStreamNetworkServiceTypeVoIp connection with the
> remote server.
>
> That explains why Reachability sample is not responding to the connectivity
> changes in background mode (no NSStreamNetworkServiceTypeVoIp connection
> within the app) and why the voip app neither responds if wifi's off on first
> launch...
>
> So, looks like some kind of workaround will be needed for this one...
>
>
> 2012/6/28 IVAN FERNANDEZ <address@hidden>
> Hi,
>
> I've spent several days with this issue but I haven't found a complete
> solution... for some reason that I can't understand, network changes control
> for Linphone based on SCNetworkReachability API only works if there is a
> valid wifi connection when the app is launched (for the moment, I'm only
> interested in only wifi mode)
>
> In order to simplificate and avoid some problems on changes between wwan/wifi
> connection, I've finally replaced the SCNetworkReachability API operations in
> Linphone code.
>
> For my workaround, I used the Reachability class provided by Apple (v2.2),
> with the following changes on LinphoneManager.m code:
>
> -(void) setupNetworkReachabilityCallback: (const char*) nodeName
> withContext:(SCNetworkReachabilityContext*) ctx {
>
> //add changes observer
>
> [[NSNotificationCenter defaultCenter] addObserver: self selector:
> @selector(reachabilityChanged:) name: kReachabilityChangedNotification
> object: nil];
>
> internetReachable = [[Reachability reachabilityForInternetConnection]
> retain];
>
> [internetReachable startNotifier];
>
> //launch initial check
>
> [self reachabilityChanged: nil];
>
> }
>
>
> - (void)reachabilityChanged:(NSNotification *)notice {
>
> // called after network status changes
>
> LinphoneProxyConfig* proxy;
>
> linphone_core_get_default_proxy([LinphoneManager getLc], &proxy);
>
> BOOL isWifiOnly = [[NSUserDefaults standardUserDefaults]
> boolForKey:@"wifi_only_preference"];
>
>
>
> NetworkStatus internetStatus = [internetReachable
> currentReachabilityStatus];
>
> if (internetStatus == ReachableViaWiFi) {
>
> NSLog(@"Internet accesible via wifi...");
>
> linphone_core_set_network_reachable([LinphoneManager getLc],true);
>
> if (proxy) linphone_proxy_config_expires(proxy, DEFAULT_EXPIRES);
>
> }
>
> else if (internetStatus != NotReachable && !isWifiOnly) {
>
> NSLog(@"Internet accesible via wwan...");
>
> linphone_core_set_network_reachable([LinphoneManager getLc],true);
>
> if (proxy) linphone_proxy_config_expires(proxy, DEFAULT_EXPIRES);
>
> }
>
> else
>
> [[LinphoneManager instance] kickOffNetworkConnection];
>
> }
>
>
>
> For the moment, this workaround is working great if wifi is up when you
> launch the app. But if the app is launched without wifi connection -> then
> goes background -> then wifi goes up, the app will not register untill it is
> relaunched or the re-register timer (600s) expires (before that all works as
> espected).
>
> I've tried dozens of solutions, combinations, test... but that's the better
> approach I could get... Anyone can see a better solution to the problem?
>
> What do you think about that code replacement? Could it bring some other
> problems on other scenarios?
>
> Thanks in advanced,
>
> IvánF
>
>
>
> 2012/6/23 Jehan Monnier <address@hidden>
> Hi,
> Very interesting indeed.
> Let us know the outcomes of your further findings.
> Cheers
>
> Jehan
> www.linphone.org
>
>
>
>
>
>
> Le 20 juin 2012 à 13:48, IVAN FERNANDEZ a écrit :
>
>> Hi,
>>
>> I'm facing an strange problem with the callback that detects network changes
>> in Linphone code.
>>
>> The problem is that the callback is being called correctly when the wifi
>> goes off, but it is not called again when the wifi goes on.
>>
>> I'm running two test (iPhone 4 iOS 5.1.1, Linphone 1.1.2 with TLS enabled):
>>
>> 1. Wifi set to ON: I run Linphone from xcode ->wait the registration in the
>> server -> then I go to the settings and switch off wifi -> the callback is
>> called -> ALL IS GREAT -> then I switch wifi on again... -> the callback is
>> not called -> ;-/
>>
>> 2. Wifi set to OFF: I run Linphone from xcode -> no connection so the
>> registration can not be done -> then I go to the settings and switch on wifi
>> -> the callback is not called -> ;-/
>>
>> Let's take a look to the callback:
>>
>> void networkReachabilityCallBack(SCNetworkReachabilityRef target,
>> SCNetworkReachabilityFlags flags, void* nilCtx) {
>>
>> ms_message("Network connection flag [%x]",flags);
>>
>>
>> LinphoneManager* lLinphoneMgr = [LinphoneManager instance];
>>
>> SCNetworkReachabilityFlags
>> networkDownFlags=kSCNetworkReachabilityFlagsConnectionRequired
>> |kSCNetworkReachabilityFlagsConnectionOnTraffic;
>>
>>
>> if ([LinphoneManager getLc] != nil) {
>>
>> LinphoneProxyConfig* proxy;
>>
>> linphone_core_get_default_proxy([LinphoneManager getLc], &proxy);
>>
>>
>>
>> struct NetworkReachabilityContext* ctx = nilCtx ? ((struct
>> NetworkReachabilityContext*)nilCtx) : 0;
>>
>>
>> if ((flags == 0) | (flags & networkDownFlags)) {
>>
>>
>>
>> [lLinphoneMgr kickOffNetworkConnection];
>>
>> //COMMENTING THE FOLLOWING LINE THE PROBLEM IS PARCIALLY
>> SOLVED !!!!!!!!!!!!
>>
>> linphone_core_set_network_reachable([LinphoneManager
>> getLc],false);
>>
>> lLinphoneMgr.connectivity = none;
>>
>>
>> } else {
>>
>>
>>
>> Connectivity newConnectivity;
>>
>> BOOL isWifiOnly = [[NSUserDefaults standardUserDefaults]
>> boolForKey:@"wifi_only_preference"];
>>
>> if (!ctx || ctx->testWWan)
>>
>> newConnectivity = flags & kSCNetworkReachabilityFlagsIsWWAN
>> ? wwan:wifi;
>>
>> else
>>
>> newConnectivity = wifi;
>>
>>
>>
>> if (newConnectivity == wwan && proxy && isWifiOnly &&
>> (lLinphoneMgr.connectivity == newConnectivity || lLinphoneMgr.connectivity
>> == none)) {
>>
>> linphone_proxy_config_expires(proxy, 0);
>>
>> } else if (proxy){
>>
>> linphone_proxy_config_expires(proxy, DEFAULT_EXPIRES);
>> //might be better to save the previous value
>>
>> }
>>
>>
>> if (lLinphoneMgr.connectivity == none) {
>>
>> linphone_core_set_network_reachable([LinphoneManager
>> getLc],true);
>>
>> } else if (lLinphoneMgr.connectivity != newConnectivity) {
>>
>> // connectivity has changed
>>
>> linphone_core_set_network_reachable([LinphoneManager
>> getLc],false);
>>
>> if (newConnectivity == wwan && proxy && isWifiOnly) {
>>
>> linphone_proxy_config_expires(proxy, 0);
>>
>> }
>>
>> linphone_core_set_network_reachable([LinphoneManager
>> getLc],true);
>>
>> }
>>
>> lLinphoneMgr.connectivity=newConnectivity;
>>
>> ms_message("new network connectivity of type
>> [%s]",(newConnectivity==wifi?"wifi":"wwan"));
>>
>> }
>>
>> if (ctx && ctx->networkStateChanged) {
>>
>> (*ctx->networkStateChanged)(lLinphoneMgr.connectivity);
>>
>> }
>>
>> }
>>
>> }
>>
>>
>>
>> The most curious thing is that if I comment the invocation to
>> "linphone_core_set_network_reachable" that I've pointed in the callback the
>> first test works great and the callback is called on both on/off wifi
>> changes (what makes me suspect that the problem can be caused by a silly
>> issue), but the second test remains failing.
>>
>> ¿Anyone has that point running? ¿Any ideas about why the callback is not
>> called any more at some point?
>>
>> PD: On Android, the same test with reachability works great on all the cases.
>>
>> Thanks in advanced..
>>
--------------------------
Albrecht Andrzejewski