2016-02-29 6 views
0

В последнее приложение, которое я разрабатываю для пользователя, необходимо. Чтобы получить местоположение пользователя, мы используем диспетчер местоположений. К сожалению, это работает только в том случае, если у пользователя есть службы определения местоположения и дает разрешение на доступ к нему.Получение местоположения пользователя без основного местоположения (геолокация Google Карт?)

Если пользователь не дает разрешения, мы оставляем только пару ip-сервисов, которые не очень точны. Я пытаюсь найти способ, с помощью которого я могу иметь приблизительное местоположение пользователя без разрешенных служб определения местоположения и что лучше ip-сервисы.

Единственный перспективный API - это Google Maps Geolocation API, в котором утверждается, что он может получить местоположение пользователя, используя сотовые башни и Wi-Fi-узлы.

Я попытался найти библиотеку или способ, которым я могу использовать это на iOS и, желательно, Swift без успеха. Может ли кто-нибудь помочь?

+1

Если вы в основном вломились в данные о местоположении пользователя после того, как отказались предоставить его вам, ваше приложение не попадет в хранилище приложений. Если вы хотите получить информацию общего назначения, используйте локали, установленные пользователем. – Quantaliinuxite

+0

Если службы определения местоположения отключены, то лучшее, что вы сделаете в iOS, - это IP-адрес. API Google требует подробных сведений о видимых сотовых башнях и/или Wi-Fi-сетях, которые вы не можете получить на iOS, поэтому он также просто вернется к ip и, как сказал @Quantaliinuxite, если пользователь захочет, чтобы ваше приложение имело свое местоположение, это вам – Paulw11

+0

@Quantaliinuxite Я не ищу, чтобы ворваться в данные о местоположении пользователя, так как я знаю, что от приложения будет отказано. Я просто пытался найти, есть ли лучшее решение, чем IP-адрес. API Google Geolocation выглядел многообещающим, но поскольку вы не можете получить требуемые данные (как сказал Paulw11), чтобы он функционировал, то он не может быть использован. – zirinisp

ответ

0

К сожалению, этого не сделать, поскольку операционная система не предоставляет доступа к каким-либо альтернативным методам определения местоположения пользователя (сотовые башни и т. Д.).

Если честно, это имеет смысл, как если бы пользователь хотел, чтобы приложение имело доступ к его местоположению, он дал бы нам разрешение.

Именно поэтому Google Geolocation API не может работать на iOS.

Единственным обходным решением является использование IP-адреса, но точность там почти по всей стране.

0

Я использую часовой пояс пользователя, чтобы получить приблизительное местоположение, которое я использую только для настройки темы приложения и стиля карты (это навигационное приложение) на основе восходящего или солнечного.

Я использую функцию ниже и имею таблицу поиска «plist». Координаты в таблице поиска являются центральными координатами для этого часового пояса. Таким образом, если пользователь находится вне своего часового пояса, он даст вам «неправильное» местоположение.

func getLastKnownLocationFromTimeZone() { 
    var timeZonesArray: NSMutableArray! 
    if let path = Bundle.main.path(forResource: "NSTimeZoneCoordinates", ofType: "plist") { 
     timeZonesArray = NSMutableArray(contentsOfFile: path) 
     for timeZoneDictionary in timeZonesArray { 
      if let tzDic = timeZoneDictionary as? NSDictionary { 
       if let timeZoneName = tzDic["NSTimeZoneName"] as? String { 
        if timeZoneName == TimeZone.autoupdatingCurrent.identifier { 
         let lat = tzDic["Lat"] as! String 
         let lon = tzDic["Lon"] as! String 
         lastKnownLocation = CLLocation(latitude: lat.doubleValue(), longitude: lon.doubleValue()) 
         return 
        } 
       } 
      } 
     } 

    } 
} 

PLIST образец:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array> 
    <dict> 
     <key>Lat</key> 
     <string>5.316667</string> 
     <key>Lon</key> 
     <string>-4.033333</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Abidjan</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>5.55</string> 
     <key>Lon</key> 
     <string>-0.2</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Accra</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>8.980603</string> 
     <key>Lon</key> 
     <string>38.757761</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Addis_Ababa</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>36.752887</string> 
     <key>Lon</key> 
     <string>3.042048</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Algiers</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>15.333333</string> 
     <key>Lon</key> 
     <string>38.933333</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Asmara</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>12.65</string> 
     <key>Lon</key> 
     <string>-8</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Bamako</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>4.366667</string> 
     <key>Lon</key> 
     <string>18.583333</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Bangui</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>13.453056</string> 
     <key>Lon</key> 
     <string>-16.5775</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Banjul</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>11.881655</string> 
     <key>Lon</key> 
     <string>-15.617794</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Bissau</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>-15.786111</string> 
     <key>Lon</key> 
     <string>35.005833</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Blantyre</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>-4.267778</string> 
     <key>Lon</key> 
     <string>15.291944</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Brazzaville</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>-3.383333</string> 
     <key>Lon</key> 
     <string>29.366667</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Bujumbura</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>30.119799</string> 
     <key>Lon</key> 
     <string>31.537</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Cairo</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>33.57311</string> 
     <key>Lon</key> 
     <string>-7.589843</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Casablanca</string> 
    </dict> 
    <dict> 
     <key>Lat</key> 
     <string>35.889387</string> 
     <key>Lon</key> 
     <string>-5.321346</string> 
     <key>NSTimeZoneName</key> 
     <string>Africa/Ceuta</string> 

К сожалению, это слишком долго, чтобы вставить весь PLIST здесь. Если вы хотите, оставить комментарий.

+0

Почему голос? Дает решение вопроса, не так ли? – guido