0

我的应用程序要求用户的 iPhone 连接到第 3 方硬件设备,该设备广播一个 SSID,其中包含产品名称(始终相同),后跟一个单元号(即 ProductName_123);本质上是一个俘虏网络。在允许用户与我的应用程序交互之前,我确保 iPhone 当前已连接到适当的 SSID。我使用以下方法(出于隐私原因,我对产品名称进行了混淆):

- (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;
    }    
}

在我的 iPhone 无线网络设置中,我为我的测试设备声明了一个静态 IP,这加快了连接过程,因为避免了 DHCP。但是,通常我会打开应用程序并提示我的“未连接”警报,这是由上述返回 false 的方法触发的。考虑到我使用当前 SSID 更新视图中的文本字段,我觉得这非常奇怪,尽管显示了警报,但这通常是正确的。

我的问题如下:有没有更可靠的方法来实现我的目标?我做错了吗?为了获得更可靠的结果,我可以更改我的方法的某些部分吗?

谢谢!如果需要任何其他信息,请随时询问!

4

1 回答 1

0

我的解决方案是再次运行该方法,直到计数器达到 20。如果计数器达到 20 并且 SSID 仍然不匹配,则假设用户未连接到硬件设备并进入“等待 WiFi 连接”循环. 这可能不是最优雅的,但它确实有效。

于 2012-10-14T23:14:01.787 回答