Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTLocationSimulator

FTLocationSimulator allows simulating Core Location in the iPhone simulator on the desktop. It sends fake Core Location updates taken from a KML file that describes a predefined route.

Besides the simulated Core Location updates, it also updates the blue userLocation view on MapKit views.

The sample project shows how to integrate FTLocationSimulator into an existing app, in this case Apple's "Breadcrumb" sample application.

Integration Steps

In a nutshell, these are the necessary steps:

  1. Add the FTLocationSimulator directory to your project

  2. Add -licucore to "Other Linker flags" in the project/target settings (this is needed for RegExKitLite)

  3. #ifdef all occurences of "CLLocationManager" like the following:

     #ifdef FAKE_CORE_LOCATION
    self.locationManager = [[[FTLocationSimulator alloc] init] autorelease];
    #else
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    #endif
    

    Only the alloc/init call has to be ifdef'ed. All further occurences of your locationManager object don't need to be changed since FTLocationSimulator uses the same interface as CLLocationManager.

  4. #include "FTLocationSimulator.h" where necessary.

  5. If you're using MapKit, set the mapView property with your MKMapView and set it to nil if you're done with the map. Then, put the following into your MKMapViewDelegate:

     - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isMemberOfClass:[MKUserLocation class]]) {
    #ifdef FAKE_CORE_LOCATION
    return self.locationManager.fakeUserLocationView;
    #else
    return nil;
    #endif
    }
    // Your code for regular annotation views
    }
    
  6. Adjust FAKE_CORE_LOCATION_UPDATE_INTERVAL in FTLocationSimulator.h if the location updates are too fast.

  7. Change the fakeLocations.kml if needed (currently, it includes a route from Cupertino to San Francisco). To create a new fakeLocations.kml, use Google Earth and create a route. Send the route via email and take the "Route.kmz" file out of the draft mail. The kmz format is zipped kml. So unzip that file using "unzip Route.kml" on the command line.

    The parser is not a generic KML parser but is only able to parse these specific Google Earth KML files.

Implemented methods and properties

From CLLocationManager:

  • delegate
  • location (for polling updates)
  • distanceFilter
  • -startUpdatingLocations
  • -stopUpdatingLocations

CLLocationManagerDelegate:

  • -locationManager:didUpdateToLocation:fromLocation: (is sent by FTLocationSimulator)

CLLocation objects:

  • coordinate
  • location
  • timestamp

Known Issues

  • In Google's KML files the distance between waypoints varies. For straight roads it's larger than for curvy roads. FTLocationSimulator does not consider this difference, so the speed on the KML route varies.
  • The faked userLocation view does not incorporate the GPS halo animation.
  • heading, course, altitude, speed and accuracy are not implemented (some of them might be technically possible)

Collaboration

We're happy if someone wants to contribute to the project or work on some of the issues. Just fork the project and send us a pull request.

Have fun!

-Ortwin

About

Simulate Core Location in the iPhone Simulator

Resources

Stars

1 star

Watchers

17 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTLocationSimulator

FTLocationSimulator allows simulating Core Location in the iPhone simulator on the desktop. It sends fake Core Location updates taken from a KML file that describes a predefined route.

Besides the simulated Core Location updates, it also updates the blue userLocation view on MapKit views.

The sample project shows how to integrate FTLocationSimulator into an existing app, in this case Apple's "Breadcrumb" sample application.

Integration Steps

In a nutshell, these are the necessary steps:

  1. Add the FTLocationSimulator directory to your project

  2. Add -licucore to "Other Linker flags" in the project/target settings (this is needed for RegExKitLite)

  3. #ifdef all occurences of "CLLocationManager" like the following:

     #ifdef FAKE_CORE_LOCATION
    self.locationManager = [[[FTLocationSimulator alloc] init] autorelease];
    #else
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    #endif
    

    Only the alloc/init call has to be ifdef'ed. All further occurences of your locationManager object don't need to be changed since FTLocationSimulator uses the same interface as CLLocationManager.

  4. #include "FTLocationSimulator.h" where necessary.

  5. If you're using MapKit, set the mapView property with your MKMapView and set it to nil if you're done with the map. Then, put the following into your MKMapViewDelegate:

     - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isMemberOfClass:[MKUserLocation class]]) {
    #ifdef FAKE_CORE_LOCATION
    return self.locationManager.fakeUserLocationView;
    #else
    return nil;
    #endif
    }
    // Your code for regular annotation views
    }
    
  6. Adjust FAKE_CORE_LOCATION_UPDATE_INTERVAL in FTLocationSimulator.h if the location updates are too fast.

  7. Change the fakeLocations.kml if needed (currently, it includes a route from Cupertino to San Francisco). To create a new fakeLocations.kml, use Google Earth and create a route. Send the route via email and take the "Route.kmz" file out of the draft mail. The kmz format is zipped kml. So unzip that file using "unzip Route.kml" on the command line.

    The parser is not a generic KML parser but is only able to parse these specific Google Earth KML files.

Implemented methods and properties

From CLLocationManager:

  • delegate
  • location (for polling updates)
  • distanceFilter
  • -startUpdatingLocations
  • -stopUpdatingLocations

CLLocationManagerDelegate:

  • -locationManager:didUpdateToLocation:fromLocation: (is sent by FTLocationSimulator)

CLLocation objects:

  • coordinate
  • location
  • timestamp

Known Issues

  • In Google's KML files the distance between waypoints varies. For straight roads it's larger than for curvy roads. FTLocationSimulator does not consider this difference, so the speed on the KML route varies.
  • The faked userLocation view does not incorporate the GPS halo animation.
  • heading, course, altitude, speed and accuracy are not implemented (some of them might be technically possible)

Collaboration

We're happy if someone wants to contribute to the project or work on some of the issues. Just fork the project and send us a pull request.

Have fun!

-Ortwin

About

Simulate Core Location in the iPhone Simulator

Resources

Stars

1 star

Watchers

17 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTLocationSimulator

FTLocationSimulator allows simulating Core Location in the iPhone simulator on the desktop. It sends fake Core Location updates taken from a KML file that describes a predefined route.

Besides the simulated Core Location updates, it also updates the blue userLocation view on MapKit views.

The sample project shows how to integrate FTLocationSimulator into an existing app, in this case Apple's "Breadcrumb" sample application.

Integration Steps

In a nutshell, these are the necessary steps:

  1. Add the FTLocationSimulator directory to your project

  2. Add -licucore to "Other Linker flags" in the project/target settings (this is needed for RegExKitLite)

  3. #ifdef all occurences of "CLLocationManager" like the following:

     #ifdef FAKE_CORE_LOCATION
    self.locationManager = [[[FTLocationSimulator alloc] init] autorelease];
    #else
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    #endif
    

    Only the alloc/init call has to be ifdef'ed. All further occurences of your locationManager object don't need to be changed since FTLocationSimulator uses the same interface as CLLocationManager.

  4. #include "FTLocationSimulator.h" where necessary.

  5. If you're using MapKit, set the mapView property with your MKMapView and set it to nil if you're done with the map. Then, put the following into your MKMapViewDelegate:

     - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isMemberOfClass:[MKUserLocation class]]) {
    #ifdef FAKE_CORE_LOCATION
    return self.locationManager.fakeUserLocationView;
    #else
    return nil;
    #endif
    }
    // Your code for regular annotation views
    }
    
  6. Adjust FAKE_CORE_LOCATION_UPDATE_INTERVAL in FTLocationSimulator.h if the location updates are too fast.

  7. Change the fakeLocations.kml if needed (currently, it includes a route from Cupertino to San Francisco). To create a new fakeLocations.kml, use Google Earth and create a route. Send the route via email and take the "Route.kmz" file out of the draft mail. The kmz format is zipped kml. So unzip that file using "unzip Route.kml" on the command line.

    The parser is not a generic KML parser but is only able to parse these specific Google Earth KML files.

Implemented methods and properties

From CLLocationManager:

  • delegate
  • location (for polling updates)
  • distanceFilter
  • -startUpdatingLocations
  • -stopUpdatingLocations

CLLocationManagerDelegate:

  • -locationManager:didUpdateToLocation:fromLocation: (is sent by FTLocationSimulator)

CLLocation objects:

  • coordinate
  • location
  • timestamp

Known Issues

  • In Google's KML files the distance between waypoints varies. For straight roads it's larger than for curvy roads. FTLocationSimulator does not consider this difference, so the speed on the KML route varies.
  • The faked userLocation view does not incorporate the GPS halo animation.
  • heading, course, altitude, speed and accuracy are not implemented (some of them might be technically possible)

Collaboration

We're happy if someone wants to contribute to the project or work on some of the issues. Just fork the project and send us a pull request.

Have fun!

-Ortwin

About

Simulate Core Location in the iPhone Simulator

Resources

Stars

1 star

Watchers

17 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTLocationSimulator

FTLocationSimulator allows simulating Core Location in the iPhone simulator on the desktop. It sends fake Core Location updates taken from a KML file that describes a predefined route.

Besides the simulated Core Location updates, it also updates the blue userLocation view on MapKit views.

The sample project shows how to integrate FTLocationSimulator into an existing app, in this case Apple's "Breadcrumb" sample application.

Integration Steps

In a nutshell, these are the necessary steps:

  1. Add the FTLocationSimulator directory to your project

  2. Add -licucore to "Other Linker flags" in the project/target settings (this is needed for RegExKitLite)

  3. #ifdef all occurences of "CLLocationManager" like the following:

     #ifdef FAKE_CORE_LOCATION
    self.locationManager = [[[FTLocationSimulator alloc] init] autorelease];
    #else
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    #endif
    

    Only the alloc/init call has to be ifdef'ed. All further occurences of your locationManager object don't need to be changed since FTLocationSimulator uses the same interface as CLLocationManager.

  4. #include "FTLocationSimulator.h" where necessary.

  5. If you're using MapKit, set the mapView property with your MKMapView and set it to nil if you're done with the map. Then, put the following into your MKMapViewDelegate:

     - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isMemberOfClass:[MKUserLocation class]]) {
    #ifdef FAKE_CORE_LOCATION
    return self.locationManager.fakeUserLocationView;
    #else
    return nil;
    #endif
    }
    // Your code for regular annotation views
    }
    
  6. Adjust FAKE_CORE_LOCATION_UPDATE_INTERVAL in FTLocationSimulator.h if the location updates are too fast.

  7. Change the fakeLocations.kml if needed (currently, it includes a route from Cupertino to San Francisco). To create a new fakeLocations.kml, use Google Earth and create a route. Send the route via email and take the "Route.kmz" file out of the draft mail. The kmz format is zipped kml. So unzip that file using "unzip Route.kml" on the command line.

    The parser is not a generic KML parser but is only able to parse these specific Google Earth KML files.

Implemented methods and properties

From CLLocationManager:

  • delegate
  • location (for polling updates)
  • distanceFilter
  • -startUpdatingLocations
  • -stopUpdatingLocations

CLLocationManagerDelegate:

  • -locationManager:didUpdateToLocation:fromLocation: (is sent by FTLocationSimulator)

CLLocation objects:

  • coordinate
  • location
  • timestamp

Known Issues

  • In Google's KML files the distance between waypoints varies. For straight roads it's larger than for curvy roads. FTLocationSimulator does not consider this difference, so the speed on the KML route varies.
  • The faked userLocation view does not incorporate the GPS halo animation.
  • heading, course, altitude, speed and accuracy are not implemented (some of them might be technically possible)

Collaboration

We're happy if someone wants to contribute to the project or work on some of the issues. Just fork the project and send us a pull request.

Have fun!

-Ortwin

About

Simulate Core Location in the iPhone Simulator

Resources

Stars

1 star

Watchers

17 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTLocationSimulator

FTLocationSimulator allows simulating Core Location in the iPhone simulator on the desktop. It sends fake Core Location updates taken from a KML file that describes a predefined route.

Besides the simulated Core Location updates, it also updates the blue userLocation view on MapKit views.

The sample project shows how to integrate FTLocationSimulator into an existing app, in this case Apple's "Breadcrumb" sample application.

Integration Steps

In a nutshell, these are the necessary steps:

  1. Add the FTLocationSimulator directory to your project

  2. Add -licucore to "Other Linker flags" in the project/target settings (this is needed for RegExKitLite)

  3. #ifdef all occurences of "CLLocationManager" like the following:

     #ifdef FAKE_CORE_LOCATION
    self.locationManager = [[[FTLocationSimulator alloc] init] autorelease];
    #else
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    #endif
    

    Only the alloc/init call has to be ifdef'ed. All further occurences of your locationManager object don't need to be changed since FTLocationSimulator uses the same interface as CLLocationManager.

  4. #include "FTLocationSimulator.h" where necessary.

  5. If you're using MapKit, set the mapView property with your MKMapView and set it to nil if you're done with the map. Then, put the following into your MKMapViewDelegate:

     - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isMemberOfClass:[MKUserLocation class]]) {
    #ifdef FAKE_CORE_LOCATION
    return self.locationManager.fakeUserLocationView;
    #else
    return nil;
    #endif
    }
    // Your code for regular annotation views
    }
    
  6. Adjust FAKE_CORE_LOCATION_UPDATE_INTERVAL in FTLocationSimulator.h if the location updates are too fast.

  7. Change the fakeLocations.kml if needed (currently, it includes a route from Cupertino to San Francisco). To create a new fakeLocations.kml, use Google Earth and create a route. Send the route via email and take the "Route.kmz" file out of the draft mail. The kmz format is zipped kml. So unzip that file using "unzip Route.kml" on the command line.

    The parser is not a generic KML parser but is only able to parse these specific Google Earth KML files.

Implemented methods and properties

From CLLocationManager:

  • delegate
  • location (for polling updates)
  • distanceFilter
  • -startUpdatingLocations
  • -stopUpdatingLocations

CLLocationManagerDelegate:

  • -locationManager:didUpdateToLocation:fromLocation: (is sent by FTLocationSimulator)

CLLocation objects:

  • coordinate
  • location
  • timestamp

Known Issues

  • In Google's KML files the distance between waypoints varies. For straight roads it's larger than for curvy roads. FTLocationSimulator does not consider this difference, so the speed on the KML route varies.
  • The faked userLocation view does not incorporate the GPS halo animation.
  • heading, course, altitude, speed and accuracy are not implemented (some of them might be technically possible)

Collaboration

We're happy if someone wants to contribute to the project or work on some of the issues. Just fork the project and send us a pull request.

Have fun!

-Ortwin

About

Simulate Core Location in the iPhone Simulator

Resources

Stars

1 star

Watchers

17 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTLocationSimulator

FTLocationSimulator allows simulating Core Location in the iPhone simulator on the desktop. It sends fake Core Location updates taken from a KML file that describes a predefined route.

Besides the simulated Core Location updates, it also updates the blue userLocation view on MapKit views.

The sample project shows how to integrate FTLocationSimulator into an existing app, in this case Apple's "Breadcrumb" sample application.

Integration Steps

In a nutshell, these are the necessary steps:

  1. Add the FTLocationSimulator directory to your project

  2. Add -licucore to "Other Linker flags" in the project/target settings (this is needed for RegExKitLite)

  3. #ifdef all occurences of "CLLocationManager" like the following:

     #ifdef FAKE_CORE_LOCATION
    self.locationManager = [[[FTLocationSimulator alloc] init] autorelease];
    #else
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    #endif
    

    Only the alloc/init call has to be ifdef'ed. All further occurences of your locationManager object don't need to be changed since FTLocationSimulator uses the same interface as CLLocationManager.

  4. #include "FTLocationSimulator.h" where necessary.

  5. If you're using MapKit, set the mapView property with your MKMapView and set it to nil if you're done with the map. Then, put the following into your MKMapViewDelegate:

     - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isMemberOfClass:[MKUserLocation class]]) {
    #ifdef FAKE_CORE_LOCATION
    return self.locationManager.fakeUserLocationView;
    #else
    return nil;
    #endif
    }
    // Your code for regular annotation views
    }
    
  6. Adjust FAKE_CORE_LOCATION_UPDATE_INTERVAL in FTLocationSimulator.h if the location updates are too fast.

  7. Change the fakeLocations.kml if needed (currently, it includes a route from Cupertino to San Francisco). To create a new fakeLocations.kml, use Google Earth and create a route. Send the route via email and take the "Route.kmz" file out of the draft mail. The kmz format is zipped kml. So unzip that file using "unzip Route.kml" on the command line.

    The parser is not a generic KML parser but is only able to parse these specific Google Earth KML files.

Implemented methods and properties

From CLLocationManager:

  • delegate
  • location (for polling updates)
  • distanceFilter
  • -startUpdatingLocations
  • -stopUpdatingLocations

CLLocationManagerDelegate:

  • -locationManager:didUpdateToLocation:fromLocation: (is sent by FTLocationSimulator)

CLLocation objects:

  • coordinate
  • location
  • timestamp

Known Issues

  • In Google's KML files the distance between waypoints varies. For straight roads it's larger than for curvy roads. FTLocationSimulator does not consider this difference, so the speed on the KML route varies.
  • The faked userLocation view does not incorporate the GPS halo animation.
  • heading, course, altitude, speed and accuracy are not implemented (some of them might be technically possible)

Collaboration

We're happy if someone wants to contribute to the project or work on some of the issues. Just fork the project and send us a pull request.

Have fun!

-Ortwin

About

Simulate Core Location in the iPhone Simulator

Resources

Stars

1 star

Watchers

17 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTLocationSimulator

FTLocationSimulator allows simulating Core Location in the iPhone simulator on the desktop. It sends fake Core Location updates taken from a KML file that describes a predefined route.

Besides the simulated Core Location updates, it also updates the blue userLocation view on MapKit views.

The sample project shows how to integrate FTLocationSimulator into an existing app, in this case Apple's "Breadcrumb" sample application.

Integration Steps

In a nutshell, these are the necessary steps:

  1. Add the FTLocationSimulator directory to your project

  2. Add -licucore to "Other Linker flags" in the project/target settings (this is needed for RegExKitLite)

  3. #ifdef all occurences of "CLLocationManager" like the following:

     #ifdef FAKE_CORE_LOCATION
    self.locationManager = [[[FTLocationSimulator alloc] init] autorelease];
    #else
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    #endif
    

    Only the alloc/init call has to be ifdef'ed. All further occurences of your locationManager object don't need to be changed since FTLocationSimulator uses the same interface as CLLocationManager.

  4. #include "FTLocationSimulator.h" where necessary.

  5. If you're using MapKit, set the mapView property with your MKMapView and set it to nil if you're done with the map. Then, put the following into your MKMapViewDelegate:

     - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isMemberOfClass:[MKUserLocation class]]) {
    #ifdef FAKE_CORE_LOCATION
    return self.locationManager.fakeUserLocationView;
    #else
    return nil;
    #endif
    }
    // Your code for regular annotation views
    }
    
  6. Adjust FAKE_CORE_LOCATION_UPDATE_INTERVAL in FTLocationSimulator.h if the location updates are too fast.

  7. Change the fakeLocations.kml if needed (currently, it includes a route from Cupertino to San Francisco). To create a new fakeLocations.kml, use Google Earth and create a route. Send the route via email and take the "Route.kmz" file out of the draft mail. The kmz format is zipped kml. So unzip that file using "unzip Route.kml" on the command line.

    The parser is not a generic KML parser but is only able to parse these specific Google Earth KML files.

Implemented methods and properties

From CLLocationManager:

  • delegate
  • location (for polling updates)
  • distanceFilter
  • -startUpdatingLocations
  • -stopUpdatingLocations

CLLocationManagerDelegate:

  • -locationManager:didUpdateToLocation:fromLocation: (is sent by FTLocationSimulator)

CLLocation objects:

  • coordinate
  • location
  • timestamp

Known Issues

  • In Google's KML files the distance between waypoints varies. For straight roads it's larger than for curvy roads. FTLocationSimulator does not consider this difference, so the speed on the KML route varies.
  • The faked userLocation view does not incorporate the GPS halo animation.
  • heading, course, altitude, speed and accuracy are not implemented (some of them might be technically possible)

Collaboration

We're happy if someone wants to contribute to the project or work on some of the issues. Just fork the project and send us a pull request.

Have fun!

-Ortwin

About

Simulate Core Location in the iPhone Simulator

Resources

Stars

1 star

Watchers

17 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTLocationSimulator

FTLocationSimulator allows simulating Core Location in the iPhone simulator on the desktop. It sends fake Core Location updates taken from a KML file that describes a predefined route.

Besides the simulated Core Location updates, it also updates the blue userLocation view on MapKit views.

The sample project shows how to integrate FTLocationSimulator into an existing app, in this case Apple's "Breadcrumb" sample application.

Integration Steps

In a nutshell, these are the necessary steps:

  1. Add the FTLocationSimulator directory to your project

  2. Add -licucore to "Other Linker flags" in the project/target settings (this is needed for RegExKitLite)

  3. #ifdef all occurences of "CLLocationManager" like the following:

     #ifdef FAKE_CORE_LOCATION
    self.locationManager = [[[FTLocationSimulator alloc] init] autorelease];
    #else
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    #endif
    

    Only the alloc/init call has to be ifdef'ed. All further occurences of your locationManager object don't need to be changed since FTLocationSimulator uses the same interface as CLLocationManager.

  4. #include "FTLocationSimulator.h" where necessary.

  5. If you're using MapKit, set the mapView property with your MKMapView and set it to nil if you're done with the map. Then, put the following into your MKMapViewDelegate:

     - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isMemberOfClass:[MKUserLocation class]]) {
    #ifdef FAKE_CORE_LOCATION
    return self.locationManager.fakeUserLocationView;
    #else
    return nil;
    #endif
    }
    // Your code for regular annotation views
    }
    
  6. Adjust FAKE_CORE_LOCATION_UPDATE_INTERVAL in FTLocationSimulator.h if the location updates are too fast.

  7. Change the fakeLocations.kml if needed (currently, it includes a route from Cupertino to San Francisco). To create a new fakeLocations.kml, use Google Earth and create a route. Send the route via email and take the "Route.kmz" file out of the draft mail. The kmz format is zipped kml. So unzip that file using "unzip Route.kml" on the command line.

    The parser is not a generic KML parser but is only able to parse these specific Google Earth KML files.

Implemented methods and properties

From CLLocationManager:

  • delegate
  • location (for polling updates)
  • distanceFilter
  • -startUpdatingLocations
  • -stopUpdatingLocations

CLLocationManagerDelegate:

  • -locationManager:didUpdateToLocation:fromLocation: (is sent by FTLocationSimulator)

CLLocation objects:

  • coordinate
  • location
  • timestamp

Known Issues

  • In Google's KML files the distance between waypoints varies. For straight roads it's larger than for curvy roads. FTLocationSimulator does not consider this difference, so the speed on the KML route varies.
  • The faked userLocation view does not incorporate the GPS halo animation.
  • heading, course, altitude, speed and accuracy are not implemented (some of them might be technically possible)

Collaboration

We're happy if someone wants to contribute to the project or work on some of the issues. Just fork the project and send us a pull request.

Have fun!

-Ortwin

About

Simulate Core Location in the iPhone Simulator

Resources

Stars

1 star

Watchers

17 watching

Forks

Releases

Packages

Contributors

Languages