@josuelmm/capacitor-background-geolocation 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/JosuelmmCapacitorBackgroundGeolocation.podspec +34 -0
  2. package/LICENSE +17 -0
  3. package/NOTICE.md +32 -0
  4. package/Package.swift +45 -0
  5. package/README.md +402 -0
  6. package/android/build.gradle +79 -0
  7. package/android/proguard-rules.pro +1 -0
  8. package/android/src/main/AndroidManifest.xml +83 -0
  9. package/android/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
  10. package/android/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
  11. package/android/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
  12. package/android/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
  13. package/android/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
  14. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
  15. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
  16. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
  17. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
  18. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
  19. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/BackgroundGeolocationPlugin.java +898 -0
  20. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/ConfigMapper.java +303 -0
  21. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/HeadlessTaskRegistry.java +34 -0
  22. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/JsEvaluatorTaskRunner.java +63 -0
  23. package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +699 -0
  24. package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +103 -0
  25. package/android/src/main/java/com/marianhello/bgloc/Config.java +1155 -0
  26. package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
  27. package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +362 -0
  28. package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
  29. package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +45 -0
  30. package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
  31. package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +238 -0
  32. package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
  33. package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
  34. package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
  35. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
  36. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +1088 -0
  37. package/android/src/main/java/com/marianhello/bgloc/data/ConfigJsonMapper.java +211 -0
  38. package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
  39. package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
  40. package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
  41. package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +27 -0
  42. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
  43. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +71 -0
  44. package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
  45. package/android/src/main/java/com/marianhello/bgloc/data/SessionLocationDAO.java +18 -0
  46. package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +406 -0
  47. package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
  48. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +94 -0
  49. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +227 -0
  50. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +122 -0
  51. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +550 -0
  52. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +189 -0
  53. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionContract.java +74 -0
  54. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionLocationDAO.java +169 -0
  55. package/android/src/main/java/com/marianhello/bgloc/driving/DrivingEventsDetector.java +265 -0
  56. package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
  57. package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
  58. package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
  59. package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
  60. package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
  61. package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
  62. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
  63. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
  64. package/android/src/main/java/com/marianhello/bgloc/http/UrlTemplateResolver.java +115 -0
  65. package/android/src/main/java/com/marianhello/bgloc/oem/BatteryOemHelper.java +214 -0
  66. package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +218 -0
  67. package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +385 -0
  68. package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +685 -0
  69. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
  70. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
  71. package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
  72. package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +175 -0
  73. package/android/src/main/java/com/marianhello/bgloc/sensor/SensorFusionDetector.java +199 -0
  74. package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
  75. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +1531 -0
  76. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
  77. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
  78. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
  79. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +156 -0
  80. package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
  81. package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
  82. package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
  83. package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +311 -0
  84. package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
  85. package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +301 -0
  86. package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
  87. package/android/src/main/java/com/marianhello/logging/DBLogReader.java +208 -0
  88. package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
  89. package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
  90. package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
  91. package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
  92. package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
  93. package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
  94. package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
  95. package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
  96. package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
  97. package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
  98. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
  99. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
  100. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
  101. package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
  102. package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  103. package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  104. package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  105. package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  106. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  107. package/android/src/main/res/values/strings.xml +15 -0
  108. package/android/src/main/res/xml/authenticator.xml +7 -0
  109. package/android/src/main/res/xml/syncadapter.xml +9 -0
  110. package/dist/esm/definitions.d.ts +1052 -0
  111. package/dist/esm/definitions.js +142 -0
  112. package/dist/esm/definitions.js.map +1 -0
  113. package/dist/esm/index.d.ts +8 -0
  114. package/dist/esm/index.js +23 -0
  115. package/dist/esm/index.js.map +1 -0
  116. package/dist/esm/web.d.ts +92 -0
  117. package/dist/esm/web.js +242 -0
  118. package/dist/esm/web.js.map +1 -0
  119. package/dist/plugin.cjs.js +415 -0
  120. package/dist/plugin.cjs.js.map +1 -0
  121. package/dist/plugin.js +418 -0
  122. package/dist/plugin.js.map +1 -0
  123. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin-Bridging-Header.h +18 -0
  124. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.m +52 -0
  125. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.swift +750 -0
  126. package/ios/Tests/BackgroundGeolocationPluginTests/BackgroundGeolocationPluginTests.swift +12 -0
  127. package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
  128. package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
  129. package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
  130. package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
  131. package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
  132. package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
  133. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
  134. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
  135. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
  136. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
  137. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
  138. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
  139. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
  140. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
  141. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
  142. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
  143. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
  144. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
  145. package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
  146. package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
  147. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
  148. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +340 -0
  149. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +88 -0
  150. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +1193 -0
  151. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +46 -0
  152. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +283 -0
  153. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
  154. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
  155. package/ios/common/BackgroundGeolocation/MAURConfig.h +99 -0
  156. package/ios/common/BackgroundGeolocation/MAURConfig.m +636 -0
  157. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +53 -0
  158. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +54 -0
  159. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
  160. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +550 -0
  161. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
  162. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +124 -0
  163. package/ios/common/BackgroundGeolocation/MAURLocation.h +73 -0
  164. package/ios/common/BackgroundGeolocation/MAURLocation.m +392 -0
  165. package/ios/common/BackgroundGeolocation/MAURLocationContract.h +38 -0
  166. package/ios/common/BackgroundGeolocation/MAURLocationContract.m +39 -0
  167. package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
  168. package/ios/common/BackgroundGeolocation/MAURLocationManager.m +305 -0
  169. package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
  170. package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
  171. package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
  172. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +53 -0
  173. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +367 -0
  174. package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
  175. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
  176. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +138 -0
  177. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
  178. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +335 -0
  179. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
  180. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
  181. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +52 -0
  182. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +520 -0
  183. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
  184. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
  185. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.h +41 -0
  186. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.m +137 -0
  187. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.h +29 -0
  188. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.m +31 -0
  189. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.h +25 -0
  190. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.m +153 -0
  191. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
  192. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
  193. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.h +31 -0
  194. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.m +107 -0
  195. package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
  196. package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
  197. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
  198. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
  199. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
  200. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
  201. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
  202. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
  203. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
  204. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
  205. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
  206. package/ios/common/BackgroundGeolocation/module.modulemap +16 -0
  207. package/package.json +82 -0
@@ -0,0 +1,20 @@
1
+ //
2
+ // MAURUncaughtExceptionLogger.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 11/04/2018.
6
+ // Copyright © 2018 mauron85. All rights reserved.
7
+ //
8
+
9
+ #ifndef MAURUncaughtExceptionLogger_h
10
+ #define MAURUncaughtExceptionLogger_h
11
+
12
+ typedef struct
13
+ {
14
+ void (*setEnabled)(bool isEnabled);
15
+ bool (*isEnabled)(void);
16
+ } MAHUncaughtExceptionLogger;
17
+
18
+ MAHUncaughtExceptionLogger* mah_get_uncaught_exception_logger(void);
19
+
20
+ #endif /* MAURUncaughtExceptionLogger_h */
@@ -0,0 +1,62 @@
1
+ //
2
+ // MAURUncaughtExceptionLogger.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 12/04/2018.
6
+ // Based on https://github.com/kstenerud/KSCrash
7
+ //
8
+ // TODO: consider use of https://plcrashreporter.org
9
+ // TODO: consider use of https://github.com/kstenerud/KSCrash
10
+ // TODO: trap SIGSEGV, SIGBUS, … signals
11
+ // https://creativeinaustria.wordpress.com/2008/10/20/crash-reporter-for-iphone-applications-part-2/
12
+
13
+ #import <Foundation/Foundation.h>
14
+ #import "MAURUncaughtExceptionLogger.h"
15
+ #import "MAURLogging.h"
16
+
17
+ static volatile bool g_isEnabled = 0;
18
+
19
+ /** The exception handler that was in place before we installed ours. */
20
+ static NSUncaughtExceptionHandler* g_previousUncaughtExceptionHandler;
21
+
22
+ void uncaughtExceptionHandler(NSException *exception) {
23
+ if (g_isEnabled) {
24
+ // TODO: store stack trace separately
25
+ DDLogError(@"CRASH: %@ Stack Trace: %@", exception, [exception callStackSymbols]);
26
+ }
27
+ if (g_previousUncaughtExceptionHandler != NULL) {
28
+ g_previousUncaughtExceptionHandler(exception);
29
+ }
30
+ }
31
+
32
+ static void setEnabled(bool isEnabled)
33
+ {
34
+ if (isEnabled != g_isEnabled) {
35
+ g_isEnabled = isEnabled;
36
+ if (isEnabled) {
37
+ DDLogDebug(@"Backing up original handler.");
38
+ g_previousUncaughtExceptionHandler = NSGetUncaughtExceptionHandler();
39
+
40
+ DDLogDebug(@"Setting new handler.");
41
+ NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
42
+ }
43
+ else {
44
+ DDLogDebug(@"Restoring original handler.");
45
+ NSSetUncaughtExceptionHandler(g_previousUncaughtExceptionHandler);
46
+ }
47
+ }
48
+ }
49
+
50
+ static bool isEnabled()
51
+ {
52
+ return g_isEnabled;
53
+ }
54
+
55
+ MAHUncaughtExceptionLogger* mah_get_uncaught_exception_logger(void)
56
+ {
57
+ static MAHUncaughtExceptionLogger logger = {
58
+ .setEnabled = setEnabled,
59
+ .isEnabled = isEnabled
60
+ };
61
+ return &logger;
62
+ }
@@ -0,0 +1,31 @@
1
+ //
2
+ // MAURUrlTemplateResolver.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Resolves placeholders like {lat}, {lon}, {timestamp_iso}, {device_id}, ...
6
+ // in a URL template using a single MAURLocation and an optional queryParams dictionary.
7
+ //
8
+ // Placeholders not found in the location/queryParams are left as-is so partial templates
9
+ // (e.g. only static keys for batch mode) keep working.
10
+ //
11
+
12
+ #ifndef MAURUrlTemplateResolver_h
13
+ #define MAURUrlTemplateResolver_h
14
+
15
+ #import <Foundation/Foundation.h>
16
+
17
+ @class MAURLocation;
18
+
19
+ @interface MAURUrlTemplateResolver : NSObject
20
+
21
+ /**
22
+ * Resolve placeholders in `template` using values from `location` and `queryParams`.
23
+ * Either may be nil. Returns the resolved URL (or the original template if no placeholders).
24
+ */
25
+ + (NSString *)resolve:(NSString *)urlTemplate
26
+ location:(MAURLocation *)location
27
+ queryParams:(NSDictionary *)queryParams;
28
+
29
+ @end
30
+
31
+ #endif /* MAURUrlTemplateResolver_h */
@@ -0,0 +1,107 @@
1
+ //
2
+ // MAURUrlTemplateResolver.m
3
+ // BackgroundGeolocation
4
+ //
5
+
6
+ #import "MAURUrlTemplateResolver.h"
7
+ #import "MAURLocation.h"
8
+
9
+ @implementation MAURUrlTemplateResolver
10
+
11
+ + (NSString *)resolve:(NSString *)urlTemplate
12
+ location:(MAURLocation *)location
13
+ queryParams:(NSDictionary *)queryParams
14
+ {
15
+ if (urlTemplate == nil || urlTemplate.length == 0) return urlTemplate;
16
+
17
+ NSDictionary *ctx = [self buildContext:location queryParams:queryParams];
18
+
19
+ NSError *error = nil;
20
+ NSRegularExpression *regex = [NSRegularExpression
21
+ regularExpressionWithPattern:@"\\{([a-zA-Z0-9_]+)\\}"
22
+ options:0
23
+ error:&error];
24
+ if (regex == nil) return urlTemplate;
25
+
26
+ NSMutableString *result = [NSMutableString stringWithString:urlTemplate];
27
+ NSArray *matches = [regex matchesInString:urlTemplate
28
+ options:0
29
+ range:NSMakeRange(0, urlTemplate.length)];
30
+
31
+ // Iterate in reverse so ranges don't shift.
32
+ for (NSTextCheckingResult *match in [matches reverseObjectEnumerator]) {
33
+ NSString *key = [urlTemplate substringWithRange:[match rangeAtIndex:1]];
34
+ NSString *value = ctx[key];
35
+ if (value != nil) {
36
+ NSString *encoded = [self urlEncode:value];
37
+ [result replaceCharactersInRange:[match range] withString:encoded];
38
+ }
39
+ // else: leave the placeholder as-is.
40
+ }
41
+ return result;
42
+ }
43
+
44
+ + (NSDictionary *)buildContext:(MAURLocation *)loc queryParams:(NSDictionary *)queryParams
45
+ {
46
+ NSMutableDictionary *ctx = [NSMutableDictionary dictionary];
47
+
48
+ // queryParams first; location-derived values can override below.
49
+ if (queryParams != nil) {
50
+ for (id key in queryParams) {
51
+ id value = queryParams[key];
52
+ if (value != nil && value != [NSNull null]) {
53
+ ctx[key] = [NSString stringWithFormat:@"%@", value];
54
+ }
55
+ }
56
+ }
57
+
58
+ if (loc != nil) {
59
+ if (loc.latitude != nil) {
60
+ ctx[@"latitude"] = [loc.latitude stringValue];
61
+ ctx[@"lat"] = [loc.latitude stringValue];
62
+ }
63
+ if (loc.longitude != nil) {
64
+ ctx[@"longitude"] = [loc.longitude stringValue];
65
+ ctx[@"lon"] = [loc.longitude stringValue];
66
+ }
67
+ if (loc.time != nil) {
68
+ long long ms = (long long)([loc.time timeIntervalSince1970] * 1000.0);
69
+ ctx[@"time"] = [NSString stringWithFormat:@"%lld", ms];
70
+ ctx[@"timestamp"] = [NSString stringWithFormat:@"%lld", ms];
71
+ ctx[@"timestamp_iso"] = [self isoUtc:loc.time];
72
+ }
73
+ if (loc.speed != nil) ctx[@"speed"] = [loc.speed stringValue];
74
+ if (loc.altitude != nil) ctx[@"altitude"] = [loc.altitude stringValue];
75
+ if (loc.heading != nil) ctx[@"bearing"] = [loc.heading stringValue];
76
+ if (loc.accuracy != nil) ctx[@"accuracy"] = [loc.accuracy stringValue];
77
+ if (loc.provider != nil) ctx[@"provider"] = loc.provider;
78
+ }
79
+
80
+ return ctx;
81
+ }
82
+
83
+ + (NSString *)urlEncode:(NSString *)s
84
+ {
85
+ if (s == nil) return @"";
86
+ NSCharacterSet *allowed = [NSCharacterSet URLQueryAllowedCharacterSet];
87
+ NSString *enc = [s stringByAddingPercentEncodingWithAllowedCharacters:allowed];
88
+ // URLQueryAllowedCharacterSet leaves "+" and "&" unescaped which is unsafe in values.
89
+ enc = [enc stringByReplacingOccurrencesOfString:@"&" withString:@"%26"];
90
+ enc = [enc stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
91
+ return enc != nil ? enc : s;
92
+ }
93
+
94
+ + (NSString *)isoUtc:(NSDate *)date
95
+ {
96
+ static NSDateFormatter *fmt = nil;
97
+ static dispatch_once_t onceToken;
98
+ dispatch_once(&onceToken, ^{
99
+ fmt = [[NSDateFormatter alloc] init];
100
+ fmt.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'";
101
+ fmt.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
102
+ fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
103
+ });
104
+ return [fmt stringFromDate:date];
105
+ }
106
+
107
+ @end
@@ -0,0 +1,102 @@
1
+ /*
2
+ Copyright (c) 2011, Tony Million.
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
+ POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ #import <Foundation/Foundation.h>
29
+ #import <SystemConfiguration/SystemConfiguration.h>
30
+
31
+ //! Project version number for MacOSReachability.
32
+ FOUNDATION_EXPORT double ReachabilityVersionNumber;
33
+
34
+ //! Project version string for MacOSReachability.
35
+ FOUNDATION_EXPORT const unsigned char ReachabilityVersionString[];
36
+
37
+ /**
38
+ * Create NS_ENUM macro if it does not exist on the targeted version of iOS or OS X.
39
+ *
40
+ * @see http://nshipster.com/ns_enum-ns_options/
41
+ **/
42
+ #ifndef NS_ENUM
43
+ #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
44
+ #endif
45
+
46
+ extern NSString *const kReachabilityChangedNotification;
47
+
48
+ typedef NS_ENUM(NSInteger, NetworkStatus) {
49
+ // Apple NetworkStatus Compatible Names.
50
+ NotReachable = 0,
51
+ ReachableViaWiFi = 2,
52
+ ReachableViaWWAN = 1
53
+ };
54
+
55
+ @class Reachability;
56
+
57
+ typedef void (^NetworkReachable)(Reachability * reachability);
58
+ typedef void (^NetworkUnreachable)(Reachability * reachability);
59
+ typedef void (^NetworkReachability)(Reachability * reachability, SCNetworkConnectionFlags flags);
60
+
61
+
62
+ @interface Reachability : NSObject
63
+
64
+ @property (nonatomic, copy) NetworkReachable reachableBlock;
65
+ @property (nonatomic, copy) NetworkUnreachable unreachableBlock;
66
+ @property (nonatomic, copy) NetworkReachability reachabilityBlock;
67
+
68
+ @property (nonatomic, assign) BOOL reachableOnWWAN;
69
+
70
+
71
+ +(instancetype)reachabilityWithHostname:(NSString*)hostname;
72
+ // This is identical to the function above, but is here to maintain
73
+ //compatibility with Apples original code. (see .m)
74
+ +(instancetype)reachabilityWithHostName:(NSString*)hostname;
75
+ +(instancetype)reachabilityForInternetConnection;
76
+ +(instancetype)reachabilityWithAddress:(void *)hostAddress;
77
+ +(instancetype)reachabilityForLocalWiFi;
78
+
79
+ -(instancetype)initWithReachabilityRef:(SCNetworkReachabilityRef)ref;
80
+
81
+ -(BOOL)startNotifier;
82
+ -(void)stopNotifier;
83
+
84
+ -(BOOL)isReachable;
85
+ -(BOOL)isReachableViaWWAN;
86
+ -(BOOL)isReachableViaWiFi;
87
+
88
+ // WWAN may be available, but not active until a connection has been established.
89
+ // WiFi may require a connection for VPN on Demand.
90
+ -(BOOL)isConnectionRequired; // Identical DDG variant.
91
+ -(BOOL)connectionRequired; // Apple's routine.
92
+ // Dynamic, on demand connection?
93
+ -(BOOL)isConnectionOnDemand;
94
+ // Is user intervention required?
95
+ -(BOOL)isInterventionRequired;
96
+
97
+ -(NetworkStatus)currentReachabilityStatus;
98
+ -(SCNetworkReachabilityFlags)reachabilityFlags;
99
+ -(NSString*)currentReachabilityString;
100
+ -(NSString*)currentReachabilityFlags;
101
+
102
+ @end