Question

My application requires the user's iPhone to be connected to a 3rd party hardware device which broadcasts an SSID containing the Product Name (always the same) followed by a Unit Number (i.e. ProductName_123); essentially a Captive Network. Before allowing users to interact with my application, I ensure that the iPhone is currently connected to an appropriate SSID. I do so with the following method (I have obfuscated the product name for privacy reasons):

- (BOOL) connectedToHardwareDevice
{

    /* Retrieve Interface Information */
    CFArrayRef myArray = CNCopySupportedInterfaces();
    CFDictionaryRef captiveNtwrkDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));

    /* Put network information into an iterable dictionary */
    NSDictionary *dict = ( NSDictionary*) captiveNtwrkDict;
    NSString* ssid = [dict objectForKey:@"SSID"];

    /* Look for the Hardware Device name in the SSID */
    rangeOfString:@"ProductName"].location == NSNotFound || ssid == NULL)
    {      
        return false;
    }
   else
    {        
        return true;
    }    
}

In my iPhone Wireless Network settings, I have declared a static IP for my testing device, which hastens the connection procedure as DHCP is avoided. However, often times I will open the application and be prompted with my "Not Connected" alert, which is triggered by the aforementioned method returning false. I find this exceptionally strange, considering I update a text field in a view with the current SSID, which will usually be correct despite the alert being shown.

My questions are as follows: Is there a more reliable means to achieve my goal? Am I going about this incorrectly? Is there some part of my method I could change in order to have more reliable results?

Thank you! If any additional information is required, please don't hesitate to ask!

Était-ce utile?

La solution

My solution is to run the method again until a counter hits 20. If the counter hits 20 and the SSID is still not a match, then assume the user isn't connected to the hardware device and enter the "wait for WiFi connection" loop. This may not be the most graceful, but it works.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top