循环连续收集附近接入点的Wifi强度

时间:2017-01-27 01:39:23

标签: ios location wifi signal-processing

假设我将iPhone连接到具有3个以上接入点的wifi网络。

我希望收集来自EACH接入点的wifi接入强度/信号/等所有可能的字段,并使用它进行三角测量,即使在后台也是如此。

SELECT * FROM point_records;

 id | user_id | point |     created_at      |     updated_at
----+---------+-------+---------------------+---------------------
  1 |       1 |   100 | 2017-01-27 09:39:47 | 2017-01-27 09:39:47
  3 |       2 |   100 |                     |
  4 |       2 |   100 |                     |
  5 |       3 |   100 |                     |
  6 |       3 |   100 |                     |
  7 |       3 |   100 |                     |

SELECT user_id, SUM(point) AS points FROM point_records GROUP BY(user_id) ORDER BY points desc;

 user_id | points
---------+--------
       3 |    300
       2 |    200
       1 |    100

我一直在阅读以前的SO答案和其他帖子,似乎暂时不允许在iOS上进行越狱,但现在可以再次使用了。

任何人都可以显示我如何执行此操作的代码段?所有iOS开发新手..

2 个答案:

答案 0 :(得分:2)

我已经回答了如何在此question中ping所有wifi网络;

 func getInterfaces() -> Bool {
    guard let unwrappedCFArrayInterfaces = CNCopySupportedInterfaces() else {
        print("this must be a simulator, no interfaces found")
        return false
    }
    guard let swiftInterfaces = (unwrappedCFArrayInterfaces as NSArray) as? [String] else {
        print("System error: did not come back as array of Strings")
        return false
    }
    for interface in swiftInterfaces {
        print("Looking up SSID info for \(interface)") // en0
        guard let unwrappedCFDictionaryForInterface = CNCopyCurrentNetworkInfo(interface) else {
            print("System error: \(interface) has no information")
            return false
        }
        guard let SSIDDict = (unwrappedCFDictionaryForInterface as NSDictionary) as? [String: AnyObject] else {
            print("System error: interface information is not a string-keyed dictionary")
            return false
        }
        for d in SSIDDict.keys {
            print("\(d): \(SSIDDict[d]!)")
        }
    }
    return true
}

您可能已在越狱应用中看到此功能,因为可以使用私有库执行此操作,这意味着在iOS商店中销售的应用如果使用它们将无法销售。

答案 1 :(得分:2)

自从我使用它以来已经有一段时间了,所以我再次进行了快速检查,现在我相当肯定你误解了你读过的东西。据我所知,Apple并没有突然恢复他们之前的决定,即限制公共框架扫描接入点,即特定的MAC地址和信号强度。

您可以查询网络(即ssid)的特定rssi(信号强度),但不能查询单个MAC地址。在iOS 5之前你可以使用私有API来做到这一点,然后你就可以在越狱设备上使用私有API来实现它,而且就是这样。

我没有自己的代码,手头的旧东西(在我们切换到使用iBeacons之前,我曾经这样做用于室内位置跟踪),所以我不能自己提供样本代码段。我的代码已过时且不再有效,但您可能会发现here

我真的很感兴趣你提到的消息来源,iOS 10现在再次允许这个。 Apple出于隐私考虑而关闭了这一点(至少官方称,虽然这可能部分也是如此,但这也意味着处理位置跟踪的开发人员现在需要完全依赖Apple的框架),所以我非常怀疑他们是否已经回归

另外,请注意,这肯定不是一件小事,特别是如果您是iOS开发的新手。我甚至没有解决背景问题,你可以放心地忘记这一点,因为无论你做什么,你都不会有在后台连续运行的扫描仪。这违背了iOS编程的核心原则。