From 664e6bdfc27d488877415f193951f730be20cad3 Mon Sep 17 00:00:00 2001 From: George <george.makhoul@kuwaitnet.com> Date: Wed, 25 Oct 2023 12:24:51 +0300 Subject: [PATCH] first commit --- .DS_Store | Bin 0 -> 6148 bytes LICENSE.txt | 202 ++++ README.md | 97 +- TraccarClient.xcodeproj/project.pbxproj | 920 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 122 +++ .../IDEFindNavigatorScopes.plist | 5 + .../UserInterfaceState.xcuserstate | Bin 0 -> 43851 bytes .../xcschemes/xcschememanagement.plist | 35 + TraccarClient/AppDelegate.swift | 176 ++++ TraccarClient/Base.lproj/Localizable.strings | 9 + .../Base.lproj/MainStoryboard.storyboard | 106 ++ TraccarClient/BatteryStatus.swift | 22 + TraccarClient/DatabaseHelper.swift | 48 + TraccarClient/DistanceCalculator.swift | 33 + .../AppIcon.appiconset/100.png | Bin 0 -> 6049 bytes .../AppIcon.appiconset/1024.png | Bin 0 -> 65721 bytes .../AppIcon.appiconset/114.png | Bin 0 -> 6936 bytes .../AppIcon.appiconset/120.png | Bin 0 -> 7390 bytes .../AppIcon.appiconset/144.png | Bin 0 -> 9037 bytes .../AppIcon.appiconset/152.png | Bin 0 -> 9622 bytes .../AppIcon.appiconset/167.png | Bin 0 -> 10625 bytes .../AppIcon.appiconset/180.png | Bin 0 -> 11415 bytes .../Images.xcassets/AppIcon.appiconset/20.png | Bin 0 -> 1016 bytes .../Images.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 1537 bytes .../Images.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 2282 bytes .../Images.xcassets/AppIcon.appiconset/50.png | Bin 0 -> 2776 bytes .../Images.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 3230 bytes .../Images.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 3346 bytes .../Images.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 3369 bytes .../Images.xcassets/AppIcon.appiconset/72.png | Bin 0 -> 4256 bytes .../Images.xcassets/AppIcon.appiconset/76.png | Bin 0 -> 4507 bytes .../Images.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 4634 bytes .../Images.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 5268 bytes .../AppIcon.appiconset/Contents.json | 1 + .../Brand.colorset/Contents.json | 38 + TraccarClient/Images.xcassets/Contents.json | 6 + TraccarClient/InAppSettings.bundle/Root.plist | 113 +++ .../de.lproj/Root.strings | 10 + .../en.lproj/Root.strings | 11 + .../es.lproj/Root.strings | 10 + .../fr.lproj/Root.strings | 10 + .../it.lproj/Root.strings | 10 + .../ja.lproj/Root.strings | 10 + .../ko.lproj/Root.strings | 10 + .../nl.lproj/Root.strings | 10 + .../pl.lproj/Root.strings | 10 + .../pt-BR.lproj/Root.strings | 10 + .../pt.lproj/Root.strings | 10 + .../ru.lproj/Root.strings | 10 + .../zh.lproj/Root.strings | 10 + TraccarClient/LaunchScreen.xib | 39 + TraccarClient/MainViewController.swift | 80 ++ TraccarClient/NetworkManager.swift | 82 ++ TraccarClient/Position.swift | 53 + TraccarClient/PositionProvider.swift | 127 +++ TraccarClient/ProtocolFormatter.swift | 65 ++ TraccarClient/RequestManager.swift | 29 + TraccarClient/StatusViewController.swift | 81 ++ TraccarClient/TraccarClient-Info.plist | 91 ++ TraccarClient/TraccarClient-Prefix.pch | 15 + .../TraccarClient.xcdatamodel/contents | 18 + TraccarClient/TrackingController.swift | 150 +++ TraccarClient/de.lproj/Localizable.strings | 9 + TraccarClient/de.lproj/MainStoryboard.strings | 7 + TraccarClient/en.lproj/MainStoryboard.strings | 3 + TraccarClient/es.lproj/Localizable.strings | 9 + TraccarClient/es.lproj/MainStoryboard.strings | 8 + TraccarClient/fr.lproj/Localizable.strings | 9 + TraccarClient/fr.lproj/MainStoryboard.strings | 7 + TraccarClient/it.lproj/Localizable.strings | 9 + TraccarClient/it.lproj/MainStoryboard.strings | 7 + TraccarClient/ja.lproj/Localizable.strings | 9 + TraccarClient/ja.lproj/MainStoryboard.strings | 7 + TraccarClient/ko.lproj/Localizable.strings | 9 + TraccarClient/ko.lproj/MainStoryboard.strings | 7 + TraccarClient/nl.lproj/Localizable.strings | 9 + TraccarClient/nl.lproj/MainStoryboard.strings | 7 + TraccarClient/pl.lproj/Localizable.strings | 9 + TraccarClient/pl.lproj/MainStoryboard.strings | 7 + TraccarClient/pt-BR.lproj/Localizable.strings | 9 + .../pt-BR.lproj/MainStoryboard.strings | 7 + TraccarClient/pt.lproj/Localizable.strings | 9 + TraccarClient/pt.lproj/MainStoryboard.strings | 7 + TraccarClient/ru.lproj/Localizable.strings | 9 + TraccarClient/ru.lproj/MainStoryboard.strings | 7 + TraccarClient/zh.lproj/Localizable.strings | 9 + TraccarClient/zh.lproj/MainStoryboard.strings | 7 + TraccarClientTests/CoreDataTests.swift | 36 + TraccarClientTests/DatabaseHelperTests.swift | 39 + TraccarClientTests/Info.plist | 24 + .../ProtocolFormatterTests.swift | 32 + TraccarClientTests/RequestManagerTests.swift | 33 + translate.py | 85 ++ 95 files changed, 3277 insertions(+), 77 deletions(-) create mode 100644 .DS_Store create mode 100644 LICENSE.txt create mode 100644 TraccarClient.xcodeproj/project.pbxproj create mode 100644 TraccarClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/IDEFindNavigatorScopes.plist create mode 100644 TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 TraccarClient.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 TraccarClient/AppDelegate.swift create mode 100644 TraccarClient/Base.lproj/Localizable.strings create mode 100644 TraccarClient/Base.lproj/MainStoryboard.storyboard create mode 100644 TraccarClient/BatteryStatus.swift create mode 100644 TraccarClient/DatabaseHelper.swift create mode 100644 TraccarClient/DistanceCalculator.swift create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/100.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/1024.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/114.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/120.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/144.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/152.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/167.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/180.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/20.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/29.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/40.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/50.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/57.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/58.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/60.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/72.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/76.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/80.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/87.png create mode 100644 TraccarClient/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TraccarClient/Images.xcassets/Brand.colorset/Contents.json create mode 100644 TraccarClient/Images.xcassets/Contents.json create mode 100644 TraccarClient/InAppSettings.bundle/Root.plist create mode 100644 TraccarClient/InAppSettings.bundle/de.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/en.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/es.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/fr.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/it.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/ja.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/ko.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/nl.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/pl.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/pt-BR.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/pt.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/ru.lproj/Root.strings create mode 100644 TraccarClient/InAppSettings.bundle/zh.lproj/Root.strings create mode 100644 TraccarClient/LaunchScreen.xib create mode 100644 TraccarClient/MainViewController.swift create mode 100644 TraccarClient/NetworkManager.swift create mode 100644 TraccarClient/Position.swift create mode 100644 TraccarClient/PositionProvider.swift create mode 100644 TraccarClient/ProtocolFormatter.swift create mode 100644 TraccarClient/RequestManager.swift create mode 100644 TraccarClient/StatusViewController.swift create mode 100644 TraccarClient/TraccarClient-Info.plist create mode 100644 TraccarClient/TraccarClient-Prefix.pch create mode 100644 TraccarClient/TraccarClient.xcdatamodeld/TraccarClient.xcdatamodel/contents create mode 100644 TraccarClient/TrackingController.swift create mode 100644 TraccarClient/de.lproj/Localizable.strings create mode 100644 TraccarClient/de.lproj/MainStoryboard.strings create mode 100644 TraccarClient/en.lproj/MainStoryboard.strings create mode 100644 TraccarClient/es.lproj/Localizable.strings create mode 100644 TraccarClient/es.lproj/MainStoryboard.strings create mode 100644 TraccarClient/fr.lproj/Localizable.strings create mode 100644 TraccarClient/fr.lproj/MainStoryboard.strings create mode 100644 TraccarClient/it.lproj/Localizable.strings create mode 100644 TraccarClient/it.lproj/MainStoryboard.strings create mode 100644 TraccarClient/ja.lproj/Localizable.strings create mode 100644 TraccarClient/ja.lproj/MainStoryboard.strings create mode 100644 TraccarClient/ko.lproj/Localizable.strings create mode 100644 TraccarClient/ko.lproj/MainStoryboard.strings create mode 100644 TraccarClient/nl.lproj/Localizable.strings create mode 100644 TraccarClient/nl.lproj/MainStoryboard.strings create mode 100644 TraccarClient/pl.lproj/Localizable.strings create mode 100644 TraccarClient/pl.lproj/MainStoryboard.strings create mode 100644 TraccarClient/pt-BR.lproj/Localizable.strings create mode 100644 TraccarClient/pt-BR.lproj/MainStoryboard.strings create mode 100644 TraccarClient/pt.lproj/Localizable.strings create mode 100644 TraccarClient/pt.lproj/MainStoryboard.strings create mode 100644 TraccarClient/ru.lproj/Localizable.strings create mode 100644 TraccarClient/ru.lproj/MainStoryboard.strings create mode 100644 TraccarClient/zh.lproj/Localizable.strings create mode 100644 TraccarClient/zh.lproj/MainStoryboard.strings create mode 100644 TraccarClientTests/CoreDataTests.swift create mode 100644 TraccarClientTests/DatabaseHelperTests.swift create mode 100644 TraccarClientTests/Info.plist create mode 100644 TraccarClientTests/ProtocolFormatterTests.swift create mode 100644 TraccarClientTests/RequestManagerTests.swift create mode 100755 translate.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..27bf70574c2297bd84bf4f461e9c378f8489fea5 GIT binary patch literal 6148 zcmeHK&u`N(6n^dsODU5oG{i1Qk+@c+v<wODlC|Ao5^z{5H~=ciQb9%*S4~QXs!Bb> zAH$Wug#U#Te9!izHf0khHX*;t{`}*8&&lW7j)_QgCeb6J8WA~2jOAO%{$SkCY0XNe zg*%0c@q&Chpa$i1w&ractO8bn>!tv&-6}n!L+WDXF0bGGFp<Y$B13ra_OOrC_@xXb zq6!^>u}?jEuGai1MFqyU0%ME%G^T)#@e5GuQbI8eDW$?#;{M+=!)Z1$Px(C@C2^KF zn?FQpqkQA$rnBi(owxo6IrZ}(pJbh2{F-ZhDU<NL9E309;dD^j?#eU|;&eDxgg6?) z<;|-&jpVc=Cux)^uCF_sic=ZXc4o77Yq##U+fU|oclNZ^th<kQTl0Cvx%=SZ-qGM= za+=C7EEl#&?2*d044%VR6fV)`lRr)qnZAb?N4R&fir9J2psl0`s*a$rq?6S-5j@uN zEZ(^!S|3p|?B!V@#?L~G+wkFeP2rsYbMP7%|MM!Z#BZ=XHmcUHPyzFQbgEbQ40dR% zfK}jnD!}`Li^S*|Txe8V2Qqa90G83L3}yaUV2*3hGq})*9+=Qnpr#6Q#Sof~cGviM z1{WGNorJl32s5%UHx!{pM|@Yglkha!+$vxdSXE#{S8II!A6$I@UnSX^Rlq9nUnwBU zJ-^q%E19!(?dABab&=j7v9aGmqoN=)$FVB#QM`ks41F#afS$pHMzp}}hk%m7W>$fJ Gs=#mGYO7!X literal 0 HcmV?d00001 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 8f04207..0c30be4 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,35 @@ -# Nmo Teams App +# [Traccar Client for iOS](https://www.traccar.org/client) +[](https://itunes.apple.com/app/traccar-client/id843156974) +## Overview -## Getting started +Traccar Client is an iOS GPS tracking application. It can work with Traccar open source server software. -To make it easy for you to get started with GitLab, here's a list of recommended next steps. +## Build -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! - -## Add your files - -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: +Project uses CocoaPods for dependencies management. To build the project you need to download dependencies: ``` -cd existing_repo -git remote add origin https://git.beinmedia.com/aziz97/nmo-teams-app.git -git branch -M main -git push -uf origin main +pod install ``` -## Integrate with your tools - -- [ ] [Set up project integrations](https://git.beinmedia.com/aziz97/nmo-teams-app/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. +## Team -## Suggestions for a good README -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. +- Anton Tananaev ([anton@traccar.org](mailto:anton@traccar.org)) -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. +## License -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + Apache License, Version 2.0 -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -## License -For open source projects, say how it is licensed. + http://www.apache.org/licenses/LICENSE-2.0 -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/TraccarClient.xcodeproj/project.pbxproj b/TraccarClient.xcodeproj/project.pbxproj new file mode 100644 index 0000000..495d167 --- /dev/null +++ b/TraccarClient.xcodeproj/project.pbxproj @@ -0,0 +1,920 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 5E394EBE28A9CC7600396F33 /* BatteryStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E394EBD28A9CC7600396F33 /* BatteryStatus.swift */; }; + 5E716A271F63A0B100A2DBC3 /* DistanceCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E716A261F63A0B100A2DBC3 /* DistanceCalculator.swift */; }; + 5E716A291F63A45A00A2DBC3 /* RequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E716A281F63A45A00A2DBC3 /* RequestManager.swift */; }; + 5E716A2B1F63A60800A2DBC3 /* ProtocolFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E716A2A1F63A60800A2DBC3 /* ProtocolFormatter.swift */; }; + 5E716A2E1F63A7A200A2DBC3 /* ProtocolFormatterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E716A2D1F63A7A200A2DBC3 /* ProtocolFormatterTests.swift */; }; + 5E716A301F63A9F600A2DBC3 /* RequestManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E716A2F1F63A9F600A2DBC3 /* RequestManagerTests.swift */; }; + 5EE3CA342998948F002C86E4 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 5EE3CA332998948F002C86E4 /* FirebaseAnalytics */; }; + 5EE3CA362998948F002C86E4 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 5EE3CA352998948F002C86E4 /* FirebaseCrashlytics */; }; + 5EE3CA39299894B9002C86E4 /* InAppSettingsKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5EE3CA38299894B9002C86E4 /* InAppSettingsKit */; }; + CB4197931F674A3E008F301C /* DatabaseHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4197921F674A3E008F301C /* DatabaseHelper.swift */; }; + CB4197951F675518008F301C /* CoreDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4197941F675518008F301C /* CoreDataTests.swift */; }; + CB4197971F676B52008F301C /* DatabaseHelperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4197961F676B52008F301C /* DatabaseHelperTests.swift */; }; + CB4197991F67724F008F301C /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4197981F67724F008F301C /* NetworkManager.swift */; }; + CB7ED0801F6602CD00A33FCF /* Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB7ED07F1F6602CD00A33FCF /* Position.swift */; }; + CB7ED0821F661B4F00A33FCF /* PositionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB7ED0811F661B4F00A33FCF /* PositionProvider.swift */; }; + CB7ED0841F662BAF00A33FCF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB7ED0831F662BAF00A33FCF /* AppDelegate.swift */; }; + CBAA0F7D1F68E14C008BBBBE /* StatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAA0F7C1F68E14C008BBBBE /* StatusViewController.swift */; }; + CBAA0F7F1F68E807008BBBBE /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAA0F7E1F68E807008BBBBE /* MainViewController.swift */; }; + CBAA0F811F68EB62008BBBBE /* TrackingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAA0F801F68EB62008BBBBE /* TrackingController.swift */; }; + CBCE82EF1B8D253600A7318B /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBCE82EE1B8D253600A7318B /* CoreData.framework */; }; + CBCE82F21B8D265800A7318B /* TraccarClient.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CBCE82F01B8D265800A7318B /* TraccarClient.xcdatamodeld */; }; + CBDEEB8A1B8EB6A4006BC126 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBDEEB891B8EB6A4006BC126 /* SystemConfiguration.framework */; }; + CE5899C81B115C9100ED70D2 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE5899C71B115C9100ED70D2 /* Images.xcassets */; }; + CED4871C17DB1BF6007FCF57 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CED4871B17DB1BF6007FCF57 /* UIKit.framework */; }; + CED4871E17DB1BF6007FCF57 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CED4871D17DB1BF6007FCF57 /* Foundation.framework */; }; + CED4872017DB1BF6007FCF57 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CED4871F17DB1BF6007FCF57 /* CoreGraphics.framework */; }; + CED4879917DB1DF4007FCF57 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CED4879817DB1DF4007FCF57 /* MessageUI.framework */; }; + CED4879B17DB1E61007FCF57 /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CED4879A17DB1E61007FCF57 /* InAppSettings.bundle */; }; + CEDB048717ED50C1000E7EDF /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEDB048617ED50C1000E7EDF /* CoreLocation.framework */; }; + CEF643271B919FFA00195CEA /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = CEF643241B919FFA00195CEA /* LaunchScreen.xib */; }; + CEF6433C1B91AA9400195CEA /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CED4873317DB1BF6007FCF57 /* MainStoryboard.storyboard */; }; + CEF6433D1B91AA9400195CEA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CEF643371B91A94600195CEA /* Localizable.strings */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + CEE286D41B80839700AE7E83 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CED4871017DB1BF6007FCF57 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CED4871717DB1BF6007FCF57; + remoteInfo = TraccarClient; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + CEFA94EF1EA2EE31009B5809 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 5E394EBD28A9CC7600396F33 /* BatteryStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryStatus.swift; sourceTree = "<group>"; }; + 5E716A261F63A0B100A2DBC3 /* DistanceCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DistanceCalculator.swift; sourceTree = "<group>"; }; + 5E716A281F63A45A00A2DBC3 /* RequestManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestManager.swift; sourceTree = "<group>"; }; + 5E716A2A1F63A60800A2DBC3 /* ProtocolFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProtocolFormatter.swift; sourceTree = "<group>"; }; + 5E716A2D1F63A7A200A2DBC3 /* ProtocolFormatterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProtocolFormatterTests.swift; sourceTree = "<group>"; }; + 5E716A2F1F63A9F600A2DBC3 /* RequestManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestManagerTests.swift; sourceTree = "<group>"; }; + CB4197921F674A3E008F301C /* DatabaseHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseHelper.swift; sourceTree = "<group>"; }; + CB4197941F675518008F301C /* CoreDataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataTests.swift; sourceTree = "<group>"; }; + CB4197961F676B52008F301C /* DatabaseHelperTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseHelperTests.swift; sourceTree = "<group>"; }; + CB4197981F67724F008F301C /* NetworkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = "<group>"; }; + CB7ED07F1F6602CD00A33FCF /* Position.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Position.swift; sourceTree = "<group>"; }; + CB7ED0811F661B4F00A33FCF /* PositionProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PositionProvider.swift; sourceTree = "<group>"; }; + CB7ED0831F662BAF00A33FCF /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; + CBAA0F7C1F68E14C008BBBBE /* StatusViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusViewController.swift; sourceTree = "<group>"; }; + CBAA0F7E1F68E807008BBBBE /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; }; + CBAA0F801F68EB62008BBBBE /* TrackingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackingController.swift; sourceTree = "<group>"; }; + CBCE82EE1B8D253600A7318B /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + CBCE82F11B8D265800A7318B /* TraccarClient.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = TraccarClient.xcdatamodel; sourceTree = "<group>"; }; + CBDEEB891B8EB6A4006BC126 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + CE2FA5181CB935C9007F86B4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CE4B80FE1EC71CAE00D1C41D /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/MainStoryboard.strings"; sourceTree = "<group>"; }; + CE4B80FF1EC71CAE00D1C41D /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; }; + CE4B81001EC71CCF00D1C41D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CE4B81011EC71CCF00D1C41D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; }; + CE4B81021EC71CFF00D1C41D /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CE4B81031EC71CFF00D1C41D /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = "<group>"; }; + CE4B81041EC71D1700D1C41D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CE4B81051EC71D1700D1C41D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = "<group>"; }; + CE4B81061EC71D3600D1C41D /* zh */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh; path = zh.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CE4B81071EC71D3600D1C41D /* zh */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh; path = zh.lproj/Localizable.strings; sourceTree = "<group>"; }; + CE4B81081EC71D4300D1C41D /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CE4B81091EC71D4300D1C41D /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = "<group>"; }; + CE4B810A1EC71D4800D1C41D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CE4B810B1EC71D4800D1C41D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = "<group>"; }; + CE5899C71B115C9100ED70D2 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; }; + CED4871817DB1BF6007FCF57 /* TraccarClient.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TraccarClient.app; sourceTree = BUILT_PRODUCTS_DIR; }; + CED4871B17DB1BF6007FCF57 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + CED4871D17DB1BF6007FCF57 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + CED4871F17DB1BF6007FCF57 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + CED4872317DB1BF6007FCF57 /* TraccarClient-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TraccarClient-Info.plist"; sourceTree = "<group>"; }; + CED4872917DB1BF6007FCF57 /* TraccarClient-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TraccarClient-Prefix.pch"; sourceTree = "<group>"; }; + CED4879817DB1DF4007FCF57 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; + CED4879A17DB1E61007FCF57 /* InAppSettings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = InAppSettings.bundle; sourceTree = "<group>"; }; + CEDB048617ED50C1000E7EDF /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + CEE286CE1B80839700AE7E83 /* TraccarClientTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TraccarClientTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + CEE286D11B80839700AE7E83 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + CEECE4B91B91AE2B00EB6F4A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; }; + CEECE4BA1B91AE2C00EB6F4A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; }; + CEECE4BB1B91AE2D00EB6F4A /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = "<group>"; }; + CEF254DD1B905266001DEFD2 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CEF254DF1B9052EB001DEFD2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainStoryboard.storyboard; sourceTree = "<group>"; }; + CEF643241B919FFA00195CEA /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = "<group>"; }; + CEF6432A1B91A48B00195CEA /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CEF6432C1B91A49400195CEA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CEF6432E1B91A49700195CEA /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CEF643321B91A4BF00195CEA /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/MainStoryboard.strings; sourceTree = "<group>"; }; + CEF643361B91A94600195CEA /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; }; + CEF643381B91A95700195CEA /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; }; + CEF643391B91A98300195CEA /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CED4871517DB1BF6007FCF57 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CBDEEB8A1B8EB6A4006BC126 /* SystemConfiguration.framework in Frameworks */, + CBCE82EF1B8D253600A7318B /* CoreData.framework in Frameworks */, + 5EE3CA342998948F002C86E4 /* FirebaseAnalytics in Frameworks */, + CEDB048717ED50C1000E7EDF /* CoreLocation.framework in Frameworks */, + CED4879917DB1DF4007FCF57 /* MessageUI.framework in Frameworks */, + CED4871C17DB1BF6007FCF57 /* UIKit.framework in Frameworks */, + 5EE3CA362998948F002C86E4 /* FirebaseCrashlytics in Frameworks */, + 5EE3CA39299894B9002C86E4 /* InAppSettingsKit in Frameworks */, + CED4871E17DB1BF6007FCF57 /* Foundation.framework in Frameworks */, + CED4872017DB1BF6007FCF57 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CEE286CB1B80839600AE7E83 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + CED4870F17DB1BF6007FCF57 = { + isa = PBXGroup; + children = ( + CED4872117DB1BF6007FCF57 /* TraccarClient */, + CEE286CF1B80839700AE7E83 /* TraccarClientTests */, + CED4871A17DB1BF6007FCF57 /* Frameworks */, + CED4871917DB1BF6007FCF57 /* Products */, + ); + sourceTree = "<group>"; + }; + CED4871917DB1BF6007FCF57 /* Products */ = { + isa = PBXGroup; + children = ( + CED4871817DB1BF6007FCF57 /* TraccarClient.app */, + CEE286CE1B80839700AE7E83 /* TraccarClientTests.xctest */, + ); + name = Products; + sourceTree = "<group>"; + }; + CED4871A17DB1BF6007FCF57 /* Frameworks */ = { + isa = PBXGroup; + children = ( + CBDEEB891B8EB6A4006BC126 /* SystemConfiguration.framework */, + CBCE82EE1B8D253600A7318B /* CoreData.framework */, + CEDB048617ED50C1000E7EDF /* CoreLocation.framework */, + CED4879817DB1DF4007FCF57 /* MessageUI.framework */, + CED4871B17DB1BF6007FCF57 /* UIKit.framework */, + CED4871D17DB1BF6007FCF57 /* Foundation.framework */, + CED4871F17DB1BF6007FCF57 /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; + CED4872117DB1BF6007FCF57 /* TraccarClient */ = { + isa = PBXGroup; + children = ( + CE5899C71B115C9100ED70D2 /* Images.xcassets */, + CED4873317DB1BF6007FCF57 /* MainStoryboard.storyboard */, + CEF643241B919FFA00195CEA /* LaunchScreen.xib */, + CEF643371B91A94600195CEA /* Localizable.strings */, + CED4872217DB1BF6007FCF57 /* Supporting Files */, + CB7ED0831F662BAF00A33FCF /* AppDelegate.swift */, + CB4197921F674A3E008F301C /* DatabaseHelper.swift */, + 5E716A261F63A0B100A2DBC3 /* DistanceCalculator.swift */, + CBAA0F7E1F68E807008BBBBE /* MainViewController.swift */, + CB4197981F67724F008F301C /* NetworkManager.swift */, + CB7ED07F1F6602CD00A33FCF /* Position.swift */, + 5E394EBD28A9CC7600396F33 /* BatteryStatus.swift */, + CB7ED0811F661B4F00A33FCF /* PositionProvider.swift */, + 5E716A2A1F63A60800A2DBC3 /* ProtocolFormatter.swift */, + 5E716A281F63A45A00A2DBC3 /* RequestManager.swift */, + CBAA0F7C1F68E14C008BBBBE /* StatusViewController.swift */, + CBAA0F801F68EB62008BBBBE /* TrackingController.swift */, + ); + path = TraccarClient; + sourceTree = "<group>"; + }; + CED4872217DB1BF6007FCF57 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + CED4872317DB1BF6007FCF57 /* TraccarClient-Info.plist */, + CED4872917DB1BF6007FCF57 /* TraccarClient-Prefix.pch */, + CBCE82F01B8D265800A7318B /* TraccarClient.xcdatamodeld */, + CED4879A17DB1E61007FCF57 /* InAppSettings.bundle */, + ); + name = "Supporting Files"; + sourceTree = "<group>"; + }; + CEE286CF1B80839700AE7E83 /* TraccarClientTests */ = { + isa = PBXGroup; + children = ( + CEE286D01B80839700AE7E83 /* Supporting Files */, + CB4197941F675518008F301C /* CoreDataTests.swift */, + CB4197961F676B52008F301C /* DatabaseHelperTests.swift */, + 5E716A2D1F63A7A200A2DBC3 /* ProtocolFormatterTests.swift */, + 5E716A2F1F63A9F600A2DBC3 /* RequestManagerTests.swift */, + ); + path = TraccarClientTests; + sourceTree = "<group>"; + }; + CEE286D01B80839700AE7E83 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + CEE286D11B80839700AE7E83 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CED4871717DB1BF6007FCF57 /* TraccarClient */ = { + isa = PBXNativeTarget; + buildConfigurationList = CED4873E17DB1BF6007FCF57 /* Build configuration list for PBXNativeTarget "TraccarClient" */; + buildPhases = ( + CED4871417DB1BF6007FCF57 /* Sources */, + CED4871517DB1BF6007FCF57 /* Frameworks */, + CED4871617DB1BF6007FCF57 /* Resources */, + 5E3175221F692FA600CDF0F5 /* ShellScript */, + CEFA94EF1EA2EE31009B5809 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TraccarClient; + packageProductDependencies = ( + 5EE3CA332998948F002C86E4 /* FirebaseAnalytics */, + 5EE3CA352998948F002C86E4 /* FirebaseCrashlytics */, + 5EE3CA38299894B9002C86E4 /* InAppSettingsKit */, + ); + productName = TraccarClient; + productReference = CED4871817DB1BF6007FCF57 /* TraccarClient.app */; + productType = "com.apple.product-type.application"; + }; + CEE286CD1B80839600AE7E83 /* TraccarClientTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = CEE286D61B80839700AE7E83 /* Build configuration list for PBXNativeTarget "TraccarClientTests" */; + buildPhases = ( + CEE286CA1B80839600AE7E83 /* Sources */, + CEE286CB1B80839600AE7E83 /* Frameworks */, + CEE286CC1B80839600AE7E83 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + CEE286D51B80839700AE7E83 /* PBXTargetDependency */, + ); + name = TraccarClientTests; + productName = TraccarClientTests; + productReference = CEE286CE1B80839700AE7E83 /* TraccarClientTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CED4871017DB1BF6007FCF57 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1200; + ORGANIZATIONNAME = Traccar; + TargetAttributes = { + CED4871717DB1BF6007FCF57 = { + LastSwiftMigration = 1100; + }; + CEE286CD1B80839600AE7E83 = { + CreatedOnToolsVersion = 6.4; + LastSwiftMigration = 1100; + TestTargetID = CED4871717DB1BF6007FCF57; + }; + }; + }; + buildConfigurationList = CED4871317DB1BF6007FCF57 /* Build configuration list for PBXProject "TraccarClient" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + de, + es, + fr, + pt, + ru, + "pt-BR", + it, + pl, + nl, + zh, + ko, + ja, + ); + mainGroup = CED4870F17DB1BF6007FCF57; + packageReferences = ( + 5EE3CA322998948F002C86E4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + 5EE3CA37299894B9002C86E4 /* XCRemoteSwiftPackageReference "InAppSettingsKit" */, + ); + productRefGroup = CED4871917DB1BF6007FCF57 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CED4871717DB1BF6007FCF57 /* TraccarClient */, + CEE286CD1B80839600AE7E83 /* TraccarClientTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CED4871617DB1BF6007FCF57 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CEF6433C1B91AA9400195CEA /* MainStoryboard.storyboard in Resources */, + CEF6433D1B91AA9400195CEA /* Localizable.strings in Resources */, + CE5899C81B115C9100ED70D2 /* Images.xcassets in Resources */, + CEF643271B919FFA00195CEA /* LaunchScreen.xib in Resources */, + CED4879B17DB1E61007FCF57 /* InAppSettings.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CEE286CC1B80839600AE7E83 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5E3175221F692FA600CDF0F5 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + "$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"${CONFIGURATION}\" = \"Google\" ]; then\ncp -r \"${PROJECT_DIR}/../environment/google-services/traccar-client-ios.plist\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist\"\n\"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CED4871417DB1BF6007FCF57 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CB7ED0801F6602CD00A33FCF /* Position.swift in Sources */, + CBAA0F7F1F68E807008BBBBE /* MainViewController.swift in Sources */, + CB7ED0821F661B4F00A33FCF /* PositionProvider.swift in Sources */, + CB4197991F67724F008F301C /* NetworkManager.swift in Sources */, + CB7ED0841F662BAF00A33FCF /* AppDelegate.swift in Sources */, + 5E394EBE28A9CC7600396F33 /* BatteryStatus.swift in Sources */, + 5E716A2B1F63A60800A2DBC3 /* ProtocolFormatter.swift in Sources */, + CBCE82F21B8D265800A7318B /* TraccarClient.xcdatamodeld in Sources */, + CBAA0F7D1F68E14C008BBBBE /* StatusViewController.swift in Sources */, + CBAA0F811F68EB62008BBBBE /* TrackingController.swift in Sources */, + 5E716A271F63A0B100A2DBC3 /* DistanceCalculator.swift in Sources */, + 5E716A291F63A45A00A2DBC3 /* RequestManager.swift in Sources */, + CB4197931F674A3E008F301C /* DatabaseHelper.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CEE286CA1B80839600AE7E83 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5E716A301F63A9F600A2DBC3 /* RequestManagerTests.swift in Sources */, + CB4197971F676B52008F301C /* DatabaseHelperTests.swift in Sources */, + 5E716A2E1F63A7A200A2DBC3 /* ProtocolFormatterTests.swift in Sources */, + CB4197951F675518008F301C /* CoreDataTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + CEE286D51B80839700AE7E83 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = CED4871717DB1BF6007FCF57 /* TraccarClient */; + targetProxy = CEE286D41B80839700AE7E83 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + CED4873317DB1BF6007FCF57 /* MainStoryboard.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CEF254DD1B905266001DEFD2 /* ru */, + CEF254DF1B9052EB001DEFD2 /* Base */, + CEF6432A1B91A48B00195CEA /* de */, + CEF6432C1B91A49400195CEA /* es */, + CEF6432E1B91A49700195CEA /* fr */, + CEF643321B91A4BF00195CEA /* pt */, + CE2FA5181CB935C9007F86B4 /* en */, + CE4B80FE1EC71CAE00D1C41D /* pt-BR */, + CE4B81001EC71CCF00D1C41D /* it */, + CE4B81021EC71CFF00D1C41D /* pl */, + CE4B81041EC71D1700D1C41D /* nl */, + CE4B81061EC71D3600D1C41D /* zh */, + CE4B81081EC71D4300D1C41D /* ko */, + CE4B810A1EC71D4800D1C41D /* ja */, + ); + name = MainStoryboard.storyboard; + sourceTree = "<group>"; + }; + CEF643371B91A94600195CEA /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + CEF643361B91A94600195CEA /* Base */, + CEF643381B91A95700195CEA /* de */, + CEF643391B91A98300195CEA /* ru */, + CEECE4B91B91AE2B00EB6F4A /* es */, + CEECE4BA1B91AE2C00EB6F4A /* fr */, + CEECE4BB1B91AE2D00EB6F4A /* pt */, + CE4B80FF1EC71CAE00D1C41D /* pt-BR */, + CE4B81011EC71CCF00D1C41D /* it */, + CE4B81031EC71CFF00D1C41D /* pl */, + CE4B81051EC71D1700D1C41D /* nl */, + CE4B81071EC71D3600D1C41D /* zh */, + CE4B81091EC71D4300D1C41D /* ko */, + CE4B810B1EC71D4800D1C41D /* ja */, + ); + name = Localizable.strings; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5E3175231F69305200CDF0F5 /* Google */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + DEFINES_MODULE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Google; + }; + 5E3175241F69305200CDF0F5 /* Google */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 58; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = HK8L8KQMEZ; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "TraccarClient/TraccarClient-Prefix.pch"; + INFOPLIST_FILE = "TraccarClient/TraccarClient-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 7.0; + OTHER_SWIFT_FLAGS = "-D FIREBASE"; + PRODUCT_BUNDLE_IDENTIFIER = "org.traccar.client.$(PRODUCT_NAME:rfc1034identifier)"; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = org.traccar.client.TraccarClien; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = app; + }; + name = Google; + }; + 5E3175251F69305200CDF0F5 /* Google */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = HK8L8KQMEZ; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = TraccarClientTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "org.traccar.client.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TraccarClient.app/TraccarClient"; + }; + name = Google; + }; + CED4873C17DB1BF6007FCF57 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEFINES_MODULE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + CED4873D17DB1BF6007FCF57 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + DEFINES_MODULE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + CED4873F17DB1BF6007FCF57 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 58; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = HK8L8KQMEZ; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "TraccarClient/TraccarClient-Prefix.pch"; + INFOPLIST_FILE = "TraccarClient/TraccarClient-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 7.0; + PRODUCT_BUNDLE_IDENTIFIER = "org.traccar.client.$(PRODUCT_NAME:rfc1034identifier)"; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = org.traccar.client.TraccarClien; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + CED4874017DB1BF6007FCF57 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 58; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = HK8L8KQMEZ; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "TraccarClient/TraccarClient-Prefix.pch"; + INFOPLIST_FILE = "TraccarClient/TraccarClient-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 7.0; + PRODUCT_BUNDLE_IDENTIFIER = "org.traccar.client.$(PRODUCT_NAME:rfc1034identifier)"; + "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = org.traccar.client.TraccarClien; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 5.0; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + CEE286D71B80839700AE7E83 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = HK8L8KQMEZ; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = TraccarClientTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "org.traccar.client.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TraccarClient.app/TraccarClient"; + }; + name = Debug; + }; + CEE286D81B80839700AE7E83 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = HK8L8KQMEZ; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = TraccarClientTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "org.traccar.client.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TraccarClient.app/TraccarClient"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CED4871317DB1BF6007FCF57 /* Build configuration list for PBXProject "TraccarClient" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CED4873C17DB1BF6007FCF57 /* Debug */, + CED4873D17DB1BF6007FCF57 /* Release */, + 5E3175231F69305200CDF0F5 /* Google */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CED4873E17DB1BF6007FCF57 /* Build configuration list for PBXNativeTarget "TraccarClient" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CED4873F17DB1BF6007FCF57 /* Debug */, + CED4874017DB1BF6007FCF57 /* Release */, + 5E3175241F69305200CDF0F5 /* Google */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CEE286D61B80839700AE7E83 /* Build configuration list for PBXNativeTarget "TraccarClientTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CEE286D71B80839700AE7E83 /* Debug */, + CEE286D81B80839700AE7E83 /* Release */, + 5E3175251F69305200CDF0F5 /* Google */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 5EE3CA322998948F002C86E4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 9.0.0; + }; + }; + 5EE3CA37299894B9002C86E4 /* XCRemoteSwiftPackageReference "InAppSettingsKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/futuretap/InAppSettingsKit.git"; + requirement = { + branch = master; + kind = branch; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 5EE3CA332998948F002C86E4 /* FirebaseAnalytics */ = { + isa = XCSwiftPackageProductDependency; + package = 5EE3CA322998948F002C86E4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalytics; + }; + 5EE3CA352998948F002C86E4 /* FirebaseCrashlytics */ = { + isa = XCSwiftPackageProductDependency; + package = 5EE3CA322998948F002C86E4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseCrashlytics; + }; + 5EE3CA38299894B9002C86E4 /* InAppSettingsKit */ = { + isa = XCSwiftPackageProductDependency; + package = 5EE3CA37299894B9002C86E4 /* XCRemoteSwiftPackageReference "InAppSettingsKit" */; + productName = InAppSettingsKit; + }; +/* End XCSwiftPackageProductDependency section */ + +/* Begin XCVersionGroup section */ + CBCE82F01B8D265800A7318B /* TraccarClient.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + CBCE82F11B8D265800A7318B /* TraccarClient.xcdatamodel */, + ); + currentVersion = CBCE82F11B8D265800A7318B /* TraccarClient.xcdatamodel */; + path = TraccarClient.xcdatamodeld; + sourceTree = "<group>"; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = CED4871017DB1BF6007FCF57 /* Project object */; +} diff --git a/TraccarClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TraccarClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TraccarClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "self:"> + </FileRef> +</Workspace> diff --git a/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ +<?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"> +<dict> + <key>IDEDidComputeMac32BitWarning</key> + <true/> +</dict> +</plist> diff --git a/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..a0a0de8 --- /dev/null +++ b/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,122 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-swiftpm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/abseil-cpp-SwiftPM.git", + "state" : { + "revision" : "583de9bd60f66b40e78d08599cc92036c2e7e4e1", + "version" : "0.20220203.2" + } + }, + { + "identity" : "boringssl-swiftpm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/boringssl-SwiftPM.git", + "state" : { + "revision" : "dd3eda2b05a3f459fc3073695ad1b28659066eab", + "version" : "0.9.1" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "7e80c25b51c2ffa238879b07fbfc5baa54bb3050", + "version" : "9.6.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "c1cfde8067668027b23a42c29d11c246152fe046", + "version" : "9.6.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "aae45a320fd0d11811820335b1eabc8753902a40", + "version" : "9.2.5" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "c38ce365d77b04a9a300c31061c5227589e5597b", + "version" : "7.11.5" + } + }, + { + "identity" : "grpc-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/grpc/grpc-ios.git", + "state" : { + "revision" : "8440b914756e0d26d4f4d054a1c1581daedfc5b6", + "version" : "1.44.3-grpc" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "5ccda3981422a84186387dbb763ba739178b529c", + "version" : "2.3.0" + } + }, + { + "identity" : "inappsettingskit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/futuretap/InAppSettingsKit.git", + "state" : { + "branch" : "master", + "revision" : "08ab93cd15759eed534b821c2ea789d97a0fdca0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b", + "version" : "1.22.2" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692", + "version" : "2.30909.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "e70e889c0196c76d22759eb50d6a0270ca9f1d9e", + "version" : "2.3.1" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "3c54ab05249f59f2c6641dd2920b8358ea9ed127", + "version" : "1.24.0" + } + } + ], + "version" : 2 +} diff --git a/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/IDEFindNavigatorScopes.plist b/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 0000000..5dd5da8 --- /dev/null +++ b/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ +<?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/> +</plist> diff --git a/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate b/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..b2d758c245a287f08b5ba9e4e4628cff98a6159a GIT binary patch literal 43851 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 literal 0 HcmV?d00001 diff --git a/TraccarClient.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist b/TraccarClient.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..84e3575 --- /dev/null +++ b/TraccarClient.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,35 @@ +<?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"> +<dict> + <key>SchemeUserState</key> + <dict> + <key>Promises (Playground) 1.xcscheme</key> + <dict> + <key>isShown</key> + <false/> + <key>orderHint</key> + <integer>2</integer> + </dict> + <key>Promises (Playground) 2.xcscheme</key> + <dict> + <key>isShown</key> + <false/> + <key>orderHint</key> + <integer>3</integer> + </dict> + <key>Promises (Playground).xcscheme</key> + <dict> + <key>isShown</key> + <false/> + <key>orderHint</key> + <integer>0</integer> + </dict> + <key>TraccarClient.xcscheme_^#shared#^_</key> + <dict> + <key>orderHint</key> + <integer>0</integer> + </dict> + </dict> +</dict> +</plist> diff --git a/TraccarClient/AppDelegate.swift b/TraccarClient/AppDelegate.swift new file mode 100644 index 0000000..732da69 --- /dev/null +++ b/TraccarClient/AppDelegate.swift @@ -0,0 +1,176 @@ +// +// Copyright 2013 - 2021 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit +import CoreData +import Firebase + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate, PositionProviderDelegate { + + var window: UIWindow? + + var managedObjectContext: NSManagedObjectContext? + var managedObjectModel: NSManagedObjectModel? + var persistentStoreCoordinator: NSPersistentStoreCoordinator? + + var trackingController: TrackingController? + var positionProvider: PositionProvider? + + static var instance: AppDelegate { + return UIApplication.shared.delegate as! AppDelegate + } + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool { + #if FIREBASE + FirebaseApp.configure() + #endif + + UIDevice.current.isBatteryMonitoringEnabled = true + + let userDefaults = UserDefaults.standard + if userDefaults.string(forKey: "device_id_preference") == nil { + let identifier = "\(Int.random(in: 100000..<1000000))" + userDefaults.setValue(identifier, forKey: "device_id_preference") + } + + registerDefaultsFromSettingsBundle() + + migrateLegacyDefaults() + + let modelUrl = Bundle.main.url(forResource: "TraccarClient", withExtension: "momd") + managedObjectModel = NSManagedObjectModel(contentsOf: modelUrl!) + + persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel!) + let storeUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last?.appendingPathComponent("TraccarClient.sqlite") + let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] + try! persistentStoreCoordinator?.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeUrl, options: options) + + managedObjectContext = NSManagedObjectContext.init(concurrencyType: .mainQueueConcurrencyType) + managedObjectContext?.persistentStoreCoordinator = persistentStoreCoordinator + + if userDefaults.bool(forKey: "service_status_preference") { + StatusViewController.addMessage(NSLocalizedString("Service created", comment: "")) + trackingController = TrackingController() + trackingController?.start() + } + + return true + } + + func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { + + let userDefaults = UserDefaults.standard + + switch shortcutItem.type { + case "org.traccar.client.start": + if !userDefaults.bool(forKey: "service_status_preference") { + userDefaults.setValue(true, forKey: "service_status_preference") + StatusViewController.addMessage(NSLocalizedString("Service created", comment: "")) + trackingController = TrackingController() + trackingController?.start() + showToast(message: NSLocalizedString("Service created", comment: "")) + } + case "org.traccar.client.stop": + if userDefaults.bool(forKey: "service_status_preference") { + userDefaults.setValue(false, forKey: "service_status_preference") + StatusViewController.addMessage(NSLocalizedString("Service destroyed", comment: "")) + trackingController?.stop() + trackingController = nil + showToast(message: NSLocalizedString("Service destroyed", comment: "")) + } + case "org.traccar.client.sos": + positionProvider = PositionProvider() + positionProvider?.delegate = self + positionProvider?.startUpdates() + default: + break + } + + completionHandler(true) + } + + func didUpdate(position: Position) { + + positionProvider?.stopUpdates() + positionProvider = nil + + let userDefaults = UserDefaults.standard + + if let request = ProtocolFormatter.formatPostion(position, url: userDefaults.string(forKey: "server_url_preference")!, alarm: "sos") { + RequestManager.sendRequest(request, completionHandler: {(_ success: Bool) -> Void in + if success { + self.showToast(message: NSLocalizedString("Send successfully", comment: "")) + } else { + self.showToast(message: NSLocalizedString("Send failed", comment: "")) + } + }) + } + } + + func showToast(message : String) { + let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) + window?.rootViewController?.present(alert, animated: true) + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) { + alert.dismiss(animated: true) + } + } + + func applicationWillTerminate(_ application: UIApplication) { + if let context = managedObjectContext { + if context.hasChanges { + try! context.save() + } + } + } + + func registerDefaultsFromSettingsBundle() { + let settingsBundle = Bundle.main.path(forResource: "InAppSettings", ofType: "bundle")! + let finalPath = URL(fileURLWithPath: settingsBundle).appendingPathComponent("Root.plist") + let settingsDictionary = NSDictionary(contentsOf: finalPath) + let preferenceSpecifiers = settingsDictionary?.object(forKey: "PreferenceSpecifiers") as! [NSDictionary] + + var defaults: [String:Any] = [:] + + for item in preferenceSpecifiers { + if let key = item.object(forKey: "Key") as? String { + defaults[key] = item.object(forKey: "DefaultValue") + } + } + + UserDefaults.standard.register(defaults: defaults) + } + + func migrateLegacyDefaults() { + let userDefaults = UserDefaults.standard + if userDefaults.object(forKey: "server_address_preference") != nil { + var urlComponents = URLComponents() + urlComponents.scheme = userDefaults.bool(forKey: "secure_preference") ? "https" : "http" + urlComponents.host = userDefaults.string(forKey: "server_address_preference") + urlComponents.port = userDefaults.integer(forKey: "server_port_preference") + if urlComponents.port == 0 { + urlComponents.port = 5055 + } + + userDefaults.set(urlComponents.string, forKey: "server_url_preference") + + userDefaults.removeObject(forKey: "server_port_preference") + userDefaults.removeObject(forKey: "server_address_preference") + userDefaults.removeObject(forKey: "secure_preference") + } + } + +} diff --git a/TraccarClient/Base.lproj/Localizable.strings b/TraccarClient/Base.lproj/Localizable.strings new file mode 100644 index 0000000..92a31cc --- /dev/null +++ b/TraccarClient/Base.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar Client"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "Send failed"; +"Location update" = "Location update"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/Base.lproj/MainStoryboard.storyboard b/TraccarClient/Base.lproj/MainStoryboard.storyboard new file mode 100644 index 0000000..f5ea5bc --- /dev/null +++ b/TraccarClient/Base.lproj/MainStoryboard.storyboard @@ -0,0 +1,106 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="4Uy-y2-7bi"> + <device id="retina4_7" orientation="portrait" appearance="light"/> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/> + <capability name="Named colors" minToolsVersion="9.0"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <scenes> + <!--Root View Controller--> + <scene sceneID="Ejt-ia-q1N"> + <objects> + <tableViewController id="ZiV-Qa-hnE" customClass="MainViewController" customModule="TraccarClient" customModuleProvider="target" sceneMemberID="viewController"> + <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="KcQ-JP-xCp"> + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/> + </tableView> + <navigationItem key="navigationItem" title="Root View Controller" id="mBp-pp-ezn"> + <barButtonItem key="rightBarButtonItem" title="Status" id="eKa-7m-jq1"> + <connections> + <segue destination="LmD-5n-dPz" kind="push" id="iTl-2p-q5b"/> + </connections> + </barButtonItem> + </navigationItem> + </tableViewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="68Y-02-qka" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="863.768115942029" y="82.366071428571431"/> + </scene> + <!--Status View Controller--> + <scene sceneID="El5-px-WCe"> + <objects> + <tableViewController id="LmD-5n-dPz" customClass="StatusViewController" customModule="TraccarClient" customModuleProvider="target" sceneMemberID="viewController"> + <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="fdn-aT-LfP"> + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/> + <prototypes> + <tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="StatusCell" id="bOU-VM-Ej4"> + <rect key="frame" x="0.0" y="55.5" width="375" height="44"/> + <autoresizingMask key="autoresizingMask"/> + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="bOU-VM-Ej4" id="jfy-rh-RFY"> + <rect key="frame" x="0.0" y="0.0" width="375" height="44"/> + <autoresizingMask key="autoresizingMask"/> + </tableViewCellContentView> + </tableViewCell> + </prototypes> + <connections> + <outlet property="dataSource" destination="LmD-5n-dPz" id="6o2-Hb-hz7"/> + <outlet property="delegate" destination="LmD-5n-dPz" id="hkG-pc-QSu"/> + </connections> + </tableView> + <navigationItem key="navigationItem" id="mzb-XD-7DL"> + <barButtonItem key="rightBarButtonItem" title="Clear" id="He4-eJ-a31"> + <connections> + <action selector="clear:" destination="LmD-5n-dPz" id="pZK-JC-IGX"/> + </connections> + </barButtonItem> + </navigationItem> + </tableViewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="522-xf-AQn" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="1633" y="82"/> + </scene> + <!--Navigation Controller--> + <scene sceneID="kvI-h8-0j0"> + <objects> + <navigationController definesPresentationContext="YES" id="4Uy-y2-7bi" sceneMemberID="viewController"> + <navigationBar key="navigationBar" contentMode="scaleToFill" id="aeM-3M-Z4b"> + <rect key="frame" x="0.0" y="0.0" width="375" height="44"/> + <autoresizingMask key="autoresizingMask"/> + <color key="tintColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <color key="barTintColor" name="Brand"/> + <navigationBarAppearance key="standardAppearance"> + <color key="backgroundColor" name="Brand"/> + <textAttributes key="titleTextAttributes"> + <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + </textAttributes> + </navigationBarAppearance> + <navigationBarAppearance key="scrollEdgeAppearance"> + <color key="backgroundColor" name="Brand"/> + <textAttributes key="titleTextAttributes"> + <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + </textAttributes> + </navigationBarAppearance> + </navigationBar> + <connections> + <segue destination="ZiV-Qa-hnE" kind="relationship" relationship="rootViewController" id="nGO-vC-KYZ"/> + </connections> + </navigationController> + <placeholder placeholderIdentifier="IBFirstResponder" id="Kiw-gD-Vdj" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="89.855072463768124" y="82.366071428571431"/> + </scene> + </scenes> + <resources> + <namedColor name="Brand"> + <color red="0.1803921568627451" green="0.49019607843137253" blue="0.19607843137254902" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + </namedColor> + <systemColor name="groupTableViewBackgroundColor"> + <color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + </systemColor> + </resources> +</document> diff --git a/TraccarClient/BatteryStatus.swift b/TraccarClient/BatteryStatus.swift new file mode 100644 index 0000000..70b8cf8 --- /dev/null +++ b/TraccarClient/BatteryStatus.swift @@ -0,0 +1,22 @@ +// +// Copyright 2022 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +struct BatteryStatus { + public let level: Float + public let charging: Bool +} diff --git a/TraccarClient/DatabaseHelper.swift b/TraccarClient/DatabaseHelper.swift new file mode 100644 index 0000000..8a06abc --- /dev/null +++ b/TraccarClient/DatabaseHelper.swift @@ -0,0 +1,48 @@ +// +// Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import CoreData +import UIKit + +public class DatabaseHelper: NSObject { + + let managedObjectContext: NSManagedObjectContext + + convenience override init() { + self.init(managedObjectContext: AppDelegate.instance.managedObjectContext!) + } + + public init(managedObjectContext: NSManagedObjectContext) { + self.managedObjectContext = managedObjectContext + super.init() + } + + public func selectPosition() -> Position? { + let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Position") + if let fetchedObjects = try? managedObjectContext.fetch(fetchRequest) { + if fetchedObjects.count > 0 { + return fetchedObjects[0] as? Position + } + } + return nil + } + + public func delete(position: Position) { + managedObjectContext.delete(position) + } + +} diff --git a/TraccarClient/DistanceCalculator.swift b/TraccarClient/DistanceCalculator.swift new file mode 100644 index 0000000..747fa9b --- /dev/null +++ b/TraccarClient/DistanceCalculator.swift @@ -0,0 +1,33 @@ +// +// Copyright 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +class DistanceCalculator: NSObject { + + static let EQUATORIAL_EARTH_RADIUS = 6378.1370 + static let DEG_TO_RAD = Double.pi / 180 + + static func distance(fromLat lat1: Double, fromLon lon1: Double, toLat lat2: Double, toLon lon2: Double) -> Double { + let dlong = (lon2 - lon1) * DEG_TO_RAD + let dlat = (lat2 - lat1) * DEG_TO_RAD + let a = pow(sin(dlat / 2), 2) + cos(lat1 * DEG_TO_RAD) * cos(lat2 * DEG_TO_RAD) * pow(sin(dlong / 2), 2) + let c = 2 * atan2(sqrt(a), sqrt(1 - a)) + let d = EQUATORIAL_EARTH_RADIUS * c + return d * 1000 + } + +} diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/100.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000000000000000000000000000000000000..c2fd176693fa7fb61ea3a98bedff3d287d8b26da GIT binary patch literal 6049 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 b43Pf^q8Kl>@6J9Q00000NkvXXu0mjf;+u*U literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/1024.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..2b31dd5db33453fa95d6fcf21e3a53c9d8ce61e7 GIT binary patch literal 65721 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 ZAAe(=iL{|c@@AkkgQu&X%Q~loCII5V&Wr#6 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/114.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000000000000000000000000000000000000..b590b7608aadbbd0287265e820ab68ecfb2eef70 GIT binary patch literal 6936 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 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/120.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000000000000000000000000000000000000..ff47ff513bd7dd3b14e765f59d6b05a844acbce0 GIT binary patch literal 7390 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 QN&o-=07*qoM6N<$f+m|c$^ZZW literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/144.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000000000000000000000000000000000000..c7dc8fd745e0649bf030ba506a678422ecbc12bc GIT binary patch literal 9037 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%0AdWgFgLkzAl4W?xQY` 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 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/152.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000000000000000000000000000000000000..a352b16e19f007dd26d6e53cd6b49ceccc33826f GIT binary patch literal 9622 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 M07*qoM6N<$f=DX61poj5 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/167.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 0000000000000000000000000000000000000000..775d0f13a7a0dd1df91e27ce450b4a00aba9a65f GIT binary patch literal 10625 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 bjmG<ben@kJSce-X00000NkvXXu0mjf;VYDu literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/180.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000000000000000000000000000000000000..2da8eb5371d8049cae1cdc3d634e3d63fb999b42 GIT binary patch literal 11415 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 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/20.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 0000000000000000000000000000000000000000..a02a3585dda02fea50c666c7780b8fc7d1adb4bd GIT binary patch literal 1016 zcmV<U0|)$xP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px&vPnciR5(wim3?fJRTRd5Z@abYy0u~1S`wX38ukalO=3XE7D<LA4rPvQO$H*G zN&f&;91sy0Gk%msB-8N`iPI@2?vstl#2_*1RCFC#Wcm+IN=&AbHH5itv|ZP}uerC( zb=^ozJblxo=ic|Z=RD7IPZdqmG!i1JM$zl^iRoFt@3cpW2h`9IkD@3{Mkeui`?)+k z$cW#E0@y8f^0V`J$gu)rk`Y;pA|A0Ci+=&dq5u-najBEW-VgBlyhPLpilUQwO;btI zCE>6;a6SAi&gJE|^E2;CKv9|a7Hu5pJV<MQ2WCSmCWC2C+oGC4I6!bJh;w-bhss}< z^oU~QN8qWNicZn7w|yU<^tE8O+EG;%k&h4YQaBREkYteSqk&O2uB_y+vrg_67)m4> z(ZmT|1KqsXybGJf##D4_Ze@xhI}kh`-`v2vU!UasFBjwi^_6e2;lWb5uBe)-O-@Zx z(on|m&0$iKQ)K&6ptumHkKP(3C-Yv~wzrUGOrz|$ldC>2i){|NU+Bb`Y>c)1{cjg} zy0Hptss&ZkWcky|i8l3$Uh-D5Y(2eKdPz4~xUl<kdIrx?-Mm|J*i_X>VQxVT@Yt6p zIC8$8%=An`;gIAgszoIyk!S>e&`(ZQ4&T1~6`pJTtb4nJ_HE6qSyDvN;k8`3KE(dV z_wwAD?J>Zbu3DP=S}_~VWSBEJ@zhb=J$3YXJ>)LTW$9f@ID7dVuRKx1V|m4_JyOj5 zcQ0jKUNI-Xd5>SO5AjUl7Tzd(H3oQ~tCluTyJW1kq=qd8oB84DkCYy(U`Nq52~==s zH4~u;QVprnGD3`CIEck$!5<uF)2d3`Wv|V&T>r&8(sv)bK4jTF4@h2iHdjj}7iHbY zpMU=)Z;{}4+IP|>DBPI1!JbEV@%$q@Zi_N>k*X$_++0`TmN!6HXZYqHtZ&#rG#ZiW zOGK1e4iMmDfiX_GnkZacFk_q2qvg^94x58hTbo#DwMz<`zWWIGXLVRjR_U`uD}|;) zWM^b^c4t@2Hq*vFGtf<S%O28F(#T5Bl2r<m5BxsBr$6;b<r4=}vOXD~-$%oy`Wa)# zU%i*w_tENUV}W@A<Dqd0Ab3hoNuSlG$mw)CM#e^Xa@9uOjK6w`!(o5tK{_s-mLM_S znA56I_f|MS<q9Y6`G!MmG$oF&_wo9!%|E_ui*T*pdgt*qP4s*Nc5wJ-M*JgEU%SOd mes(@9|I2`lSMUG)1^ffw75%_&mm!A$0000<MNUMnLSTYc%<TsN literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/29.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000000000000000000000000000000000000..9332bbfbebe3a53fd8331ba4594b5513619d9ca2 GIT binary patch literal 1537 zcmV+c2LAbpP)<h;3K|Lk000e1NJLTq0012T0012b1^@s6R+DEB00001b5ch_0Itp) z=>Px)yGcYrR7gv$SA9&>br}Eres{<5a(4o9XSPU!Y3h7|nYE?P<x7zmrlOgSbZId{ zL{!q6b8T(;f^R@*Xv~t-0z_q^)}XYqf2`&U!=`}?UFwm%9B_AVznAtr=kGe+$@#tA zAKdrl^SpgN&x4?<s)_*?9Z^&TfB>B+_Bbsow5LK8L<oW~&~p&_1683yQ55Jzo$n!8 zk>PN+!XtSQpf|uAXzsBuiXsH`4c;dxc}AAgdeHU&l{Mev;?0Zr(_V*WXEQvq2L_!1 zVZot@vBhA@$QLnd><kPw4dpxj_q)5^D=2wG-nDnM<KTrt6kjUE-R8S&M1Vek_b7}M zc1e-pkvbV<c<68}n!FJ2PG5x(V+gc&1_ad(UcG${8%sVw&EMBKgaoE}0RJiw;EPD7 z)QMJiE5<xI2HO{Xf{Bq6dIj#{sRsDdjh~TLv<4kg2TXw`$g&K|??8(pKwpQ;!A9;& z&cn1(Q+ojWK(!oPyHky&1<4#Pqu$6D2D_Y{PUr+38|vzGfePwaN)g6AHLgpJ8I*EE zA3B(n{|4$BZuxRDSU|e_@q&+V{*NDV_S!kv%vLnJS`cH6L22682nq<|il$m%P%W&v zmHF6tZWpX(D<oMO6rNtxb2X>VNWq5qb#Qh#vAl34F4td1Sa2BbwcJD2tLu?IE6o>X zK~WTy(3{$ukg#_i=Yt*^Ob+QD@tATyA#yx+FUdw^cqHl{+{S`Wlh7%7_#G<5inXT@ z781r4FL-2+N+6||j$=ddCWMECb;%=zq&EWy(Cz8q^TgL1_ii#*zgSfWlQ9JORr`^B zb{A|G8|<xiWG~*%bdnSaf+R~SRb0l=bvS*w0z-m__&_yJh@bwz8b_(v4lLi#9xN+( z3-=xOv1Q(7yfb|z^ExqS0fP{Y5+=++?y^0QRpq~&Cg#jXZNn`D8jKtQTEsgl0Lrfh zOrFcC%zMv8O~R3s!+bWcG9Ozjc3{$oIFzNAu=np3rQ^HmN*E0Rh#EQq<rycu!a{{a zg)nDNqBoy9Jy#k1wmv=+&qq&2@_`i$PR5Y@MVKOZ-{E#(OX6m{J#7UV+Zr)zXFTWk z@Tx<wnj=7kdGhyD%mn(L$t*``aHtp5?yz$axjk;Skis!_<P;oQ`8j)$RlEr&emlv$ zTl&HhHiqPJ_qTfyHzE#+v2#&tuR~Q$72Hw>7mnNG;zBZr21u%eAVVNduPukoV)cSH zIh&F2&{GnGCT9~qTfPso$Ij$jQrW+rn*=g0efDase`PHS&L70~GuaH#;%b2)h%g&X zoCeCH*5)W`^tUC*($!Pq>1#Rjaf@>r$RRwwx){$sG0N9X_Ww|TZ52BZZVJcK;gR_3 zpL(y#h@ww>HTB}2%7OzH1FG^EYc$F;%Dg$16j{{?BGw$qM8%ae2n`8EySp97QollM z<V1d0yEs2@A#;$HL2u}{XKKnqAT7=o%#BSz&eGk?3?ENRE*(c!@kZFpUS4IsoPmtl z>6{nxMlb4E-ck>*=AJoN#Ujwg_9pCHybVbjPrEA;6%plu3hGG8ml!>KG#jl+C4pAf zRKa94Jse^BR!jeUc2OjM?Io^}iVPbv3~lZ<R+~);?_<W8mwXMN^w%<MF55CFP@-Q$ zYXh?4yJ>IFF0%x+4YjZYTDa>F@1i22Sk78q4%9b#b2`w{CXZ<AGbl~_re~M&pJ}S^ zRO8Ku{gf(M6LeN3(L1j6H+0ck1W3jbZH}fCVSI1>RI}QDav%vKsiTHWz}oVTqP;IN zMyJzpYKZUo$+`Vc4&8yT+`fv9B_HDYBg{x+c}CjG?XI`sY`|&oz=cAT_)UWbeE`!( z>ooKzMMRqh7f(*&F7v;pLH{uJoO^#kt-Tf`o7&t<0v=<F##EkrXFmGes{!{l;S-lx n%=HFX9_NJbUn-CLf0=&)noXIn@XrfI00000NkvXXu0mjfZ9~tL literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/40.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad24730ab6915664a8aa18a40d4856a13c59e94 GIT binary patch literal 2282 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 Ef^H;I^#A|> literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/50.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d873799721bafa570d571928cb82f24243e3c5 GIT binary patch literal 2776 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 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/57.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000000000000000000000000000000000000..27d7e8599f82bec5a73d750fa766450e5e123a2e GIT binary patch literal 3230 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 Q@&Et;07*qoM6N<$f(#8)YXATM literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/58.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 0000000000000000000000000000000000000000..71395ffb8e585642c602bcab0d2ff455ce62f0e1 GIT binary patch literal 3346 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 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/60.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000000000000000000000000000000000000..8e12676f4f3bcb1190676377db77be2f213f30c9 GIT binary patch literal 3369 zcmV+^4c79BP)<h;3K|Lk000e1NJLTq002Ay002A)1^@s6I{evk00001b5ch_0Itp) z=>Px><4Ht8RA@uxTM1NE)f)cpz&uz8S_wFW5@wk>R1S?+nr4b&`m{uGO3^5ro=vOP zYp^U4P;(5$nIwB<nPxU%y-XXHvzSvFDUdPGm$$wj_wC$~dx=ZE*IBq^anC(_fB&?< ze>l3jy1F|2jV@ht1Fl0I_#>B&Ke}cWx5oez7>!36kWQzAUZ=MU&QxczxR3XGN)SyB zSZ&^*H`oPNSyPFc+8X)HXfVRZ=wtW3T2n2Y38}GW(PV(RL28hj<W*}j;pn*>>^;37 z2XhbMRKY3a7w4n2vJ_Rd)pC!w!3%*tfd~x>MP$oJ#9SJUF5z9!v2~Q$8fYODq9Xyi z3;YiQ=4QkIF96+ldLKUA`w_l4vJ=PikE5ibME1lDtAEN|Y4#M9`p5eMeFM=UtUda6 z?1KSU-HEHhyU6#&Jy7S+EnEfOXuw?DWcpq5I}Uz|m0zyHu4CVzw5k-oUcO?kN;4{0 z$^V*5z-xjR!PD$3sw)uS9e`dPdgA`xqj77@Ef*}O7J9wD(LUZNz|^V=K;NJG0m<7^ zk$ogv!fv2XfNV&aqN|eE-ltrH0xhX5rGC+;V{atgF$3KquaR4|dvIqBw*gZF)LM0I zHIlcc;H~TxsH&+#uwSrjjK15Hm(pfYc@eygUWo5AR)BjOy~P#W^=-ERs|8LLoWf)4 zpTO70cH!cHi$&Y~%##;^QLE=m&!boSo|tprY_tt+>o#bY0V}Y(kMF_s)ej-BI3F$i zTbPd+PlDAxn@3q;S)oMs)X~Z4*}jKcpj`s2z-H&{#DgmnWdT1gKh&7&&(r3<jCupg zt1HBu7e0_C5#3euZV)hi(xBI4&xt*VUp7I4k@BDB0LtUe9^EHc#twd-p0Etv+g&U1 zgL`#$IR&gD;i-b3Fk-<-6jc<<apP%!RU2k(;1T6z@DgCwzzLei7XxPI)OCmm32!iZ zI|QtFFwJ)K;s@~E$?ws^FBml*4o+II1Va#Ki_XcqWM))?g-`1ZC@e3+wQaj$)ua_L z>Wv~CMTD%i?GUi?i8)*5BIV;Wgaw5*TY#cwE2=9I8q^Y-roWBdC-&gswU5eaKyBNA zHW-mtoQI^_XW)@LlbrgqUBJqe_nzK|xCNu&>*ZtDk38YS)C`49|6DzJC3>{$F3Ws= z_zO(Um@b;5DO;O2|6W;LiOgy1(520l4o%w$U>)L@P5>h_eWbbkwtnMPcwyMHi0gT; ztV?h_j<)XGhH0xFLV%CIU4JGy>DQ?*-bz^NI$&kWpC8G_xMc}w;n$-1z(R-Gx>^MI z1R!(jT113In9Y+ZB|$IxbO~PGJR2baAvXJ>=IPJr2}=dIy`#!T!^)h;FP|u86yzIZ z<1?NxW%W#ISg5LR5EjKRMAwL`%^Oz$#x0wGFOFo}SRQF;ad|OrjP8f!<CoagvISrT z_E7F23{SfcUPiBG^<8F8Y7gbr<&rC}p1cClmqeR|&cJmn?-+)q#@Us7y}+umF>yU& zF1^AAv;|-#!PmFUMe6qXcFo2U+EwQ*6B2)Ke@XqQEoMq>TSkg`Gma>M&~$0mG;eFu z=4Zc_{))ugrsB~7kJy;C1z?rq#-@$H;oQUU^Y-(&IrH2sC@sLSYwtmysNQ%g>sk1C z`G6U(!C*vwaREkMHv+H3y=2}Cf#(+fg1eK4O4de!sXUv%(>kIr>4dDrOq<-<3|N`c z(X&S}EG_O2R~B5c1a7XZs!X)F{=qepdA+k|6CU62PpN#UJ(X0JV9n%J=-Ixz6dicc z0(jrsyEoz@|BGw_7{8m9xB(qoceF5TGhk)TS$j5N=DNpZaaWEaRk3ilylwVZy#cEx zrOVk#8p$fjs~^t6!cP{-9(Wa&7vlEL{qg45`LcPgMPczINmxD+L4HAILGXT>HPc9@ zki&b#T9~yB;1}P21xr3#h7cD3b5T-H9vL)4cR;I6JwNO@JkWcLJVOzRs@f{tlM)MZ zcyf2etlpiGg?5@8nDw$j$wS2KwE?!?kI!SmjpOk2-LvciR^~G){Xu+ka7Tk=gAZi| zlIBF(`D5O3_!zyNf>!*Ng5mE386Faj`D0RWd8-cQvJjuW=0EE&Yva=rlz1@^JwNn< za7;Dkz&2&YG@Jc0V=5{y#w{^7V@dp*_Dz}(rQ;7z8-e|24oI}L=B#F7uh*lzsvKcK zVOTVFfsm7dZwz)w*v03BA6LjDl-87%uZir6wNq9}+Np%W0t15*0}%N$lm0<n2O?#3 zvPF1U{Mk~x_}<HC8Q9Y7f+{w2zAOe=(=#m!eqz!DN}r++ago#K&zKjt$u@L4iHyO% z!B{gT1MNfG$t`oY&cnQ|sj{$jVSvxCsH#9z>nIWH(X&6o*V|XtBp8BA9X%IAy4`KD z9JROYz;;~Z*8-(gWr%9kLHITOlY9L6{Lk2N=rim%^eOzr^y@34ioAqh+y?I@ZIZa4 zFxCUUU}8M?1}EQxyrMjZq=V99)TF80e8o)yo<|G+He_Bb&K8}u5Ed7wW}h7NI7VMT zN;b6Wt2LPY!E2&vKJT}(-!Q!UFuZo(Y~+^|Aip>dxxf8_^qnj5)sJ5zz}sIar$J{B zS7Q(>t1OeXDKLL4Zp}5TYpM|z9ESIk-jzzK!e|A!1cQ@@It0w4fW9%H%N>}1e~Jy| zd*|DCC5=-7uU<H%xc>59$e5UJp}jGS$4U*G#}7A73fnrkHO>{CLs3PMxQv(4+a@m1 zdZeJQGnk74)~?quV2w!=@EHdtO#sCe#gdJ%j-+jYs6|IF8Y}rLrOJirdv{$u5UFF5 zg(I_e&2sCsj2YOn_ai9;n%I4)Gs)-F7y+r;w!Jj4q0>Mzu9_-DI5KG^dfItxY8(#y ze9$IniPUPV#YZ<M{To5Pfo8wp_f?et_T+aM_2wA(dHb_JB7Y}{6%&`sS<8!g_SmK4 zB}yxnq}nyA>*xw`adeLgT35E|jE#vKY=f3|!xPh|fNhgtzaWdEIv>Jgs7L$mSTi}p z0<2nC715r^oP`a$GKDx0u*!Z0b-ha(Et`M%KrBT?<v#+>-gjvs%#Cl0xkWNAZI{A^ zc>L?Vm$3Bnw`_=qGH3R97R4_xvmNb%s<D<^n2RCvhKX6Jwh39AYOK+3?Nu$B3b-O3 zlWt1Dtiew@XIdL~XW`NHPuNgP6`gO0x&bREEH_6z>rE<(x^Ty0yt4UKgkCtNR0bs0 zWHOn_ep7+eK1ZGJuaA5UvE7F{XIeRDbHHrLx?Aro5NH=uZB5pfhNj*tePJy<^aMbA z&!n}zGyQEuwYuCn)1vfa)8cUWmm|_$(1v_fDBCb~tpp$;@pcN|O3PdJZpGA$M7!CH zr+`a(SXGWIE{&FeW!+k}TL74|<qf25Utl-6Cd(P$FCNbfdCF-yR0Rr0<rq%^Rt13R z{ik8(oew)N0H{rJM1h>zUKCXnjmb3$zoVXxdKP(k+=7uFi^z7VuatN;h?cGU$PE|q zta43tJY5}el~nrapJYFzmyQD1bDLg3diDwng6|0pyIsWNCX~il6=d^_?G@`nKz%v1 z5I1(}hva{}F4>am_-k7n^~pMfD^ttt4v>U2#FQE<47D#d*IX{sYDtJQ|5Fc-Y88dY z2F^tP&bK<<=QCN)Nsdb@=}INVUC@eb^zGC~x`~cPBAm8b_MO>}xcMU;Rx`K=BO*<j z?MgBmjva*shDjR8w2w6M;{)4qDEBaQGMMI>Nk?<5W$HR~33s#AqBZR|K1xRNwiHSB z)j*k6`s%z^^H)p^e2u<x3)4cDYZ&}^#ChssM}oqAsDC164zP{P+I3xOmok-OQb1pI z)b&>sQain4?{7^Fn$rMmuXJmB4OUND+4y#;)|Y?!^(W~fl8`rNL%bp3XdB`rLy;j7 zjc<sn#mKxE?)RMd7V*mxntkNK5onK$JgCL&54G_8_3WsUBd|R4S={r;P>VI_Z;tQA z^wmi+DEeoQEv1c_Ck=B~CwPdZ!6_cCl+}Yz<e!wmv|Y!)`BMhduItcC3Vv+SxC7R0 zz}n-ARSb?ErtjqFVYSCb59`N}bP_Omyp8KyKYB>U<}TPq0oF!u{{G#m?*;hIoG+Vx zxU|lMl8XA_QWgyfltp{%Jv0=}T{?#wdWiM-FxxX3U#`9|K3oQ0qmM8&HT>C_@nL`O z09^N17$4ROL)Ec<9}wR!1LD~^**KQx{(v~=J7hq-Q(p}HD-DQSTLAq@`w9RBk#qJa z_MP4jj!<v{myw+v3iS#A{gCx*c?BRO5;2!Wqf49mR{+eG@mG5Vz#6#f->MB;f39Bg zU<%>&zx<MiHL$<UYdo$5yZ_4<wHgBcXMO%(bGpXGGelG<00000NkvXXu0mjfT4{;q literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/72.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3720e633247927765e8dbdcaf1d49366ff0264 GIT binary patch literal 4256 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 C%|(0w literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/76.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/76.png new file mode 100644 index 0000000000000000000000000000000000000000..93a8c0dca2cecd5cf724fcd56a88347cb87e9141 GIT binary patch literal 4507 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 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/80.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000000000000000000000000000000000000..627736770128d5e760cce2e28ac18357e1f74277 GIT binary patch literal 4634 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 Q+5i9m07*qoM6N<$f_B{zR{#J2 literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/87.png b/TraccarClient/Images.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 0000000000000000000000000000000000000000..c25052d78fdde19b8ec4f62abb6b4f75a30d0bf2 GIT binary patch literal 5268 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 a@c#g9w-LXf)Ek}v0000<MNUMnLSTZe4_wdy literal 0 HcmV?d00001 diff --git a/TraccarClient/Images.xcassets/AppIcon.appiconset/Contents.json b/TraccarClient/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..65b74d7 --- /dev/null +++ b/TraccarClient/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1 @@ +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]} \ No newline at end of file diff --git a/TraccarClient/Images.xcassets/Brand.colorset/Contents.json b/TraccarClient/Images.xcassets/Brand.colorset/Contents.json new file mode 100644 index 0000000..1b244fc --- /dev/null +++ b/TraccarClient/Images.xcassets/Brand.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x32", + "green" : "0x7D", + "red" : "0x2E" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x05", + "green" : "0x50", + "red" : "0x00" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TraccarClient/Images.xcassets/Contents.json b/TraccarClient/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/TraccarClient/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TraccarClient/InAppSettings.bundle/Root.plist b/TraccarClient/InAppSettings.bundle/Root.plist new file mode 100644 index 0000000..97c1a60 --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/Root.plist @@ -0,0 +1,113 @@ +<?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"> +<dict> + <key>PreferenceSpecifiers</key> + <array> + <dict> + <key>Type</key> + <string>PSToggleSwitchSpecifier</string> + <key>Title</key> + <string>Service status</string> + <key>Key</key> + <string>service_status_preference</string> + <key>DefaultValue</key> + <false/> + </dict> + <dict> + <key>AutocapitalizationType</key> + <string>None</string> + <key>AutocorrectionType</key> + <string>No</string> + <key>IsSecure</key> + <false/> + <key>Key</key> + <string>device_id_preference</string> + <key>KeyboardType</key> + <string>Alphabet</string> + <key>Title</key> + <string>Device identifier</string> + <key>Type</key> + <string>PSTextFieldSpecifier</string> + </dict> + <dict> + <key>DefaultValue</key> + <string>http://demo.traccar.org:5055</string> + <key>Type</key> + <string>PSTextFieldSpecifier</string> + <key>Title</key> + <string>Server URL</string> + <key>Key</key> + <string>server_url_preference</string> + </dict> + <dict> + <key>Type</key> + <string>PSMultiValueSpecifier</string> + <key>Title</key> + <string>Location accuracy</string> + <key>Key</key> + <string>accuracy_preference</string> + <key>DefaultValue</key> + <string>medium</string> + <key>Titles</key> + <array> + <string>High</string> + <string>Medium</string> + <string>Low</string> + </array> + <key>Values</key> + <array> + <string>high</string> + <string>medium</string> + <string>low</string> + </array> + </dict> + <dict> + <key>KeyboardType</key> + <string>NumberPad</string> + <key>DefaultValue</key> + <string>300</string> + <key>Type</key> + <string>PSTextFieldSpecifier</string> + <key>Title</key> + <string>Frequency</string> + <key>Key</key> + <string>frequency_preference</string> + </dict> + <dict> + <key>KeyboardType</key> + <string>NumberPad</string> + <key>DefaultValue</key> + <string></string> + <key>Type</key> + <string>PSTextFieldSpecifier</string> + <key>Title</key> + <string>Distance</string> + <key>Key</key> + <string>distance_preference</string> + </dict> + <dict> + <key>KeyboardType</key> + <string>NumberPad</string> + <key>DefaultValue</key> + <string></string> + <key>Type</key> + <string>PSTextFieldSpecifier</string> + <key>Title</key> + <string>Angle</string> + <key>Key</key> + <string>angle_preference</string> + </dict> + <dict> + <key>Type</key> + <string>PSToggleSwitchSpecifier</string> + <key>Title</key> + <string>Offline buffering</string> + <key>Key</key> + <string>buffer_preference</string> + <key>DefaultValue</key> + <true/> + </dict> + </array> +</dict> +</plist> diff --git a/TraccarClient/InAppSettings.bundle/de.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/de.lproj/Root.strings new file mode 100644 index 0000000..694cf5f --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/de.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "Dienststatus"; +"Device identifier" = "Gerätekennung"; +"Server URL" = "Server URL"; +"Location accuracy" = "Positionsgenauigkeit"; +"High" = "Hoch"; +"Medium" = "Mittel"; +"Low" = "Niedrig"; +"Frequency" = "Frequenz"; +"Distance" = "Entfernung"; +"Angle" = "Winkel"; diff --git a/TraccarClient/InAppSettings.bundle/en.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/en.lproj/Root.strings new file mode 100644 index 0000000..5e8f08c --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/en.lproj/Root.strings @@ -0,0 +1,11 @@ +"Service status" = "Service status"; +"Device identifier" = "Device identifier"; +"Server URL" = "Server URL"; +"Location accuracy" = "Location accuracy"; +"High" = "High"; +"Medium" = "Medium"; +"Low" = "Low"; +"Frequency" = "Frequency"; +"Distance" = "Distance"; +"Angle" = "Angle"; +"Offline buffering" = "Offline buffering"; diff --git a/TraccarClient/InAppSettings.bundle/es.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/es.lproj/Root.strings new file mode 100644 index 0000000..41223f6 --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/es.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "Estado del servicio"; +"Device identifier" = "Identificador de dispositivo"; +"Server URL" = "URL del servidor"; +"Location accuracy" = "Precisión"; +"High" = "Alto"; +"Medium" = "Medio"; +"Low" = "Bajo"; +"Frequency" = "Frecuencia de rastreo"; +"Distance" = "Distancia"; +"Angle" = "Ãngulo"; diff --git a/TraccarClient/InAppSettings.bundle/fr.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/fr.lproj/Root.strings new file mode 100644 index 0000000..4e420ca --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/fr.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "Statut"; +"Device identifier" = "Identifiant de l\'appareil"; +"Server URL" = "URL du serveur"; +"Location accuracy" = "Precision de la localisation"; +"High" = "Haut"; +"Medium" = "Moyen"; +"Low" = "Bas"; +"Frequency" = "Fréquence"; +"Distance" = "Distance"; +"Angle" = "Angle"; diff --git a/TraccarClient/InAppSettings.bundle/it.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/it.lproj/Root.strings new file mode 100644 index 0000000..64e7247 --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/it.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "Stato del servizio"; +"Device identifier" = "Identificativo dispositivo"; +"Server URL" = "Server URL"; +"Location accuracy" = "Accuratezza posizione"; +"High" = "Alta"; +"Medium" = "Media"; +"Low" = "Bassa"; +"Frequency" = "Frequenza"; +"Distance" = "Distanza"; +"Angle" = "Angolo"; diff --git a/TraccarClient/InAppSettings.bundle/ja.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/ja.lproj/Root.strings new file mode 100644 index 0000000..21cdbdb --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/ja.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "サービスステータス"; +"Device identifier" = "デãƒã‚¤ã‚¹ ID"; +"Server URL" = "サーãƒãƒ¼ URL"; +"Location accuracy" = "ä½ç½®æƒ…å ±ã®ç²¾åº¦"; +"High" = "高"; +"Medium" = "ä¸"; +"Low" = "低"; +"Frequency" = "周期"; +"Distance" = "è·é›¢"; +"Angle" = "角度"; diff --git a/TraccarClient/InAppSettings.bundle/ko.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/ko.lproj/Root.strings new file mode 100644 index 0000000..e37f2a6 --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/ko.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "서비스ìƒíƒœ"; +"Device identifier" = "장치 ì‹ë³„ìž"; +"Server URL" = "Server URL"; +"Location accuracy" = "Location accuracy"; +"High" = "High"; +"Medium" = "Medium"; +"Low" = "Low"; +"Frequency" = "주기"; +"Distance" = "Distance"; +"Angle" = "Angle"; diff --git a/TraccarClient/InAppSettings.bundle/nl.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/nl.lproj/Root.strings new file mode 100644 index 0000000..e97f2c3 --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/nl.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "Server status"; +"Device identifier" = "Toestelidentificatie"; +"Server URL" = "Server URL"; +"Location accuracy" = "Locatienauwkeurigheid"; +"High" = "Hoog"; +"Medium" = "Gemiddeld"; +"Low" = "Laag"; +"Frequency" = "Frequentie"; +"Distance" = "Afstand"; +"Angle" = "Hoek"; diff --git a/TraccarClient/InAppSettings.bundle/pl.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/pl.lproj/Root.strings new file mode 100644 index 0000000..28edf5d --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/pl.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "Status usÅ‚ugi"; +"Device identifier" = "Identyfikator urzÄ…dzenia"; +"Server URL" = "URL Serwera"; +"Location accuracy" = "DokÅ‚adność lokalizacji"; +"High" = "Wysoka"; +"Medium" = "Åšrednia"; +"Low" = "Niska"; +"Frequency" = "CzÄ™stotliwość"; +"Distance" = "Dystans"; +"Angle" = "KÄ…t"; diff --git a/TraccarClient/InAppSettings.bundle/pt-BR.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/pt-BR.lproj/Root.strings new file mode 100644 index 0000000..f87b852 --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/pt-BR.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "Status do Serviço"; +"Device identifier" = "Identificador do dispositivo"; +"Server URL" = "URL do Servidor"; +"Location accuracy" = "Precisão de localização"; +"High" = "Alto"; +"Medium" = "Médio"; +"Low" = "Baixo"; +"Frequency" = "Invervalo"; +"Distance" = "Distância"; +"Angle" = "Ângulo"; diff --git a/TraccarClient/InAppSettings.bundle/pt.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/pt.lproj/Root.strings new file mode 100644 index 0000000..036a8cb --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/pt.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "Status do Serviço"; +"Device identifier" = "Identificador único"; +"Server URL" = "URL do Servidor"; +"Location accuracy" = "Precisão de localização"; +"High" = "Alto"; +"Medium" = "Médio"; +"Low" = "Baixo"; +"Frequency" = "Invervalo"; +"Distance" = "Distância"; +"Angle" = "Ângulo"; diff --git a/TraccarClient/InAppSettings.bundle/ru.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/ru.lproj/Root.strings new file mode 100644 index 0000000..6a0beb1 --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/ru.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "СоÑтоÑние ÑервиÑа"; +"Device identifier" = "Идентификатор уÑтройÑтва"; +"Server URL" = "URL Ñервера"; +"Location accuracy" = "ТочноÑть меÑтоположениÑ"; +"High" = "Ð’Ñ‹ÑокаÑ"; +"Medium" = "СреднÑÑ"; +"Low" = "ÐизкаÑ"; +"Frequency" = "ЧаÑтота"; +"Distance" = "РаÑÑтоÑние"; +"Angle" = "Угол"; diff --git a/TraccarClient/InAppSettings.bundle/zh.lproj/Root.strings b/TraccarClient/InAppSettings.bundle/zh.lproj/Root.strings new file mode 100644 index 0000000..7a8ff61 --- /dev/null +++ b/TraccarClient/InAppSettings.bundle/zh.lproj/Root.strings @@ -0,0 +1,10 @@ +"Service status" = "定ä½"; +"Device identifier" = "设备编ç "; +"Server URL" = "æœåŠ¡å™¨åœ°å€"; +"Location accuracy" = "ä½ç½®ç²¾åº¦"; +"High" = "高"; +"Medium" = "ä¸"; +"Low" = "低"; +"Frequency" = "定ä½é¢‘率(秒)"; +"Distance" = "è·ç¦»"; +"Angle" = "角度"; diff --git a/TraccarClient/LaunchScreen.xib b/TraccarClient/LaunchScreen.xib new file mode 100644 index 0000000..9922a47 --- /dev/null +++ b/TraccarClient/LaunchScreen.xib @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait" appearance="light"/> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/> + <capability name="Named colors" minToolsVersion="9.0"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> + <view contentMode="scaleToFill" id="iN0-l3-epB"> + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <navigationBar contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jyO-lQ-xCZ"> + <rect key="frame" x="0.0" y="0.0" width="375" height="64"/> + <constraints> + <constraint firstAttribute="height" constant="64" id="TfC-6h-A1k"/> + </constraints> + <color key="barTintColor" name="Brand"/> + </navigationBar> + </subviews> + <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> + <constraints> + <constraint firstAttribute="trailing" secondItem="jyO-lQ-xCZ" secondAttribute="trailing" id="BVV-Jp-FLs"/> + <constraint firstItem="jyO-lQ-xCZ" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Ra4-bu-wwa"/> + <constraint firstItem="jyO-lQ-xCZ" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="frB-PI-Vg3"/> + </constraints> + <point key="canvasLocation" x="499" y="433"/> + </view> + </objects> + <resources> + <namedColor name="Brand"> + <color red="0.2627450980392157" green="0.62745098039215685" blue="0.27843137254901962" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + </namedColor> + </resources> +</document> diff --git a/TraccarClient/MainViewController.swift b/TraccarClient/MainViewController.swift new file mode 100644 index 0000000..19b59b4 --- /dev/null +++ b/TraccarClient/MainViewController.swift @@ -0,0 +1,80 @@ +// +// Copyright 2013 - 2021 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit +import InAppSettingsKit + +class MainViewController: IASKAppSettingsViewController { + + var settingsObserver: NSObjectProtocol? + + override func viewDidLoad() { + super.viewDidLoad() + title = NSLocalizedString("Traccar Client", comment: "") + showCreditsFooter = false + neverShowPrivacySettings = true + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + self.settingsObserver = NotificationCenter.default.addObserver(forName: nil, object: nil, queue: nil) { (notification) in + self.didChangeSetting(notification) + } + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + if let observer = self.settingsObserver { + NotificationCenter.default.removeObserver(observer) + } + } + + func showError(_ message: String) { + let alert = UIAlertController(title: nil, message: NSLocalizedString(message, comment: ""), preferredStyle: .alert) + let defaultAction = UIAlertAction(title: "OK", style: .default, handler: {(_ action: UIAlertAction) -> Void in + UserDefaults.standard.setValue(nil, forKey: "service_status_preference") + }) + alert.addAction(defaultAction) + present(alert, animated: true) + } + + func didChangeSetting(_ notification: Notification) { + if let status = notification.userInfo?["service_status_preference"] as? Bool { + if status && AppDelegate.instance.trackingController == nil { + let userDefaults = UserDefaults.standard + let url = userDefaults.string(forKey: "server_url_preference") + let frequency = userDefaults.integer(forKey: "frequency_preference") + + let candidateUrl = NSURL(string: url!) + + if candidateUrl == nil || candidateUrl?.host == nil || (candidateUrl?.scheme != "http" && candidateUrl?.scheme != "https") { + self.showError("Invalid server URL") + } else if frequency <= 0 { + self.showError("Invalid frequency value") + } else { + StatusViewController.addMessage(NSLocalizedString("Service created", comment: "")) + AppDelegate.instance.trackingController = TrackingController() + AppDelegate.instance.trackingController?.start() + } + } else if !status && AppDelegate.instance.trackingController != nil { + StatusViewController.addMessage(NSLocalizedString("Service destroyed", comment: "")) + AppDelegate.instance.trackingController?.stop() + AppDelegate.instance.trackingController = nil + } + } + } + +} diff --git a/TraccarClient/NetworkManager.swift b/TraccarClient/NetworkManager.swift new file mode 100644 index 0000000..92e93b1 --- /dev/null +++ b/TraccarClient/NetworkManager.swift @@ -0,0 +1,82 @@ +// +// Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import SystemConfiguration + +protocol NetworkManagerDelegate: AnyObject { + func didUpdateNetwork(online: Bool) +} + +class NetworkManager : NSObject { + + weak var delegate: NetworkManagerDelegate? + + //var reachability: SCNetworkReachability + + override init() { + /*var zeroAddress = sockaddr_in() + zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) + zeroAddress.sin_family = sa_family_t(AF_INET) + + reachability = withUnsafePointer(to: &zeroAddress, { + $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { + SCNetworkReachabilityCreateWithAddress(nil, $0) + } + })!*/ + + super.init() + } + + func online() -> Bool { + /*var flags: SCNetworkReachabilityFlags = [] + SCNetworkReachabilityGetFlags(reachability, &flags) + return NetworkManager.online(for: flags)*/ + return true + } + + func start() { + /*var context = SCNetworkReachabilityContext(version: 0, info: Unmanaged.passUnretained(self).toOpaque(), retain: nil, release: nil, copyDescription: nil) + SCNetworkReachabilitySetCallback(reachability, { (reachability, flags, pointer) in + let networkManager = Unmanaged<NetworkManager>.fromOpaque(pointer!).takeUnretainedValue() + networkManager.delegate?.didUpdateNetwork(online: NetworkManager.online(for: flags)) + }, &context) + SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)*/ + } + + func stop() { + /*SCNetworkReachabilityUnscheduleFromRunLoop(reachability, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)*/ + } + + static func online(for flags: SCNetworkReachabilityFlags) -> Bool { + if !flags.contains(.reachable) { + return false + } + if !flags.contains(.connectionRequired) { + return true + } + if flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic) { + if !flags.contains(.interventionRequired) { + return true + } + } + if flags.contains(.isWWAN) { + return true + } + return false + } + +} diff --git a/TraccarClient/Position.swift b/TraccarClient/Position.swift new file mode 100644 index 0000000..694a40c --- /dev/null +++ b/TraccarClient/Position.swift @@ -0,0 +1,53 @@ +// +// Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import CoreData +import CoreLocation + +public class Position: NSManagedObject { + + @NSManaged public var deviceId: String? + @NSManaged public var time: NSDate? + @NSManaged public var latitude: NSNumber? + @NSManaged public var longitude: NSNumber? + @NSManaged public var altitude: NSNumber? + @NSManaged public var speed: NSNumber? + @NSManaged public var course: NSNumber? + @NSManaged public var battery: NSNumber? + @NSManaged public var charging: Bool + @NSManaged public var accuracy: NSNumber? + + public convenience init(managedObjectContext context: NSManagedObjectContext) { + let entityDescription = NSEntityDescription.entity(forEntityName: "Position", in: context) + self.init(entity: entityDescription!, insertInto: context) + } + + public func setLocation(_ location: CLLocation) { + time = location.timestamp as NSDate + latitude = location.coordinate.latitude as NSNumber + longitude = location.coordinate.longitude as NSNumber + altitude = location.altitude as NSNumber + if location.speed >= 0 { + speed = location.speed * 1.94384 as NSNumber // knots from m/s + } + if location.course >= 0 { + course = location.course as NSNumber + } + accuracy = location.horizontalAccuracy as NSNumber + } + +} diff --git a/TraccarClient/PositionProvider.swift b/TraccarClient/PositionProvider.swift new file mode 100644 index 0000000..a16dc65 --- /dev/null +++ b/TraccarClient/PositionProvider.swift @@ -0,0 +1,127 @@ +// +// Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit +import CoreLocation + +protocol PositionProviderDelegate: AnyObject { + func didUpdate(position: Position) +} + +class PositionProvider: NSObject, CLLocationManagerDelegate { + + weak var delegate: PositionProviderDelegate? + + var locationManager: CLLocationManager + var lastLocation: CLLocation? + + var deviceId: String + var interval: Double + var distance: Double + var angle: Double + + var pendingStart = false + + override init() { + let userDefaults = UserDefaults.standard + deviceId = userDefaults.string(forKey: "device_id_preference")! + interval = userDefaults.double(forKey: "frequency_preference") + distance = userDefaults.double(forKey: "distance_preference") + angle = userDefaults.double(forKey: "angle_preference") + + locationManager = CLLocationManager() + + super.init() + + locationManager.delegate = self + + locationManager.pausesLocationUpdatesAutomatically = false + + switch userDefaults.string(forKey: "accuracy_preference") ?? "medium" { + case "high": + locationManager.desiredAccuracy = kCLLocationAccuracyBest + case "low": + locationManager.desiredAccuracy = kCLLocationAccuracyKilometer + default: + locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters + } + + if #available(iOS 9.0, *) { + locationManager.allowsBackgroundLocationUpdates = true + } + } + + func startUpdates() { + switch CLLocationManager.authorizationStatus() { + case .authorizedAlways: + locationManager.startUpdatingLocation() + default: + pendingStart = true + locationManager.requestAlwaysAuthorization() + } + } + + func stopUpdates() { + locationManager.stopUpdatingLocation() + } + + func getBatteryStatus() -> BatteryStatus { + let device = UIDevice.current + if device.batteryState != .unknown { + return BatteryStatus( + level: device.batteryLevel * 100, + charging: device.batteryState == .charging || device.batteryState == .full + ) + } else { + return BatteryStatus(level: 0, charging: true) + } + } + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + switch status { + case .authorizedAlways, .authorizedWhenInUse: + if pendingStart { + pendingStart = false + locationManager.startUpdatingLocation() + } + default: + break + } + } + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + if let location = locations.last { + if lastLocation == nil + || location.timestamp.timeIntervalSince(lastLocation!.timestamp) >= interval + || (distance > 0 && DistanceCalculator.distance(fromLat: location.coordinate.latitude, fromLon: location.coordinate.longitude, toLat: lastLocation!.coordinate.latitude, toLon: lastLocation!.coordinate.longitude) >= distance) + || (angle > 0 && fabs(location.course - lastLocation!.course) >= angle) { + + let position = Position(managedObjectContext: DatabaseHelper().managedObjectContext) + position.deviceId = deviceId + position.setLocation(location) + let batteryStatus = getBatteryStatus() + position.battery = batteryStatus.level as NSNumber + position.charging = batteryStatus.charging + delegate?.didUpdate(position: position) + lastLocation = location + } + } + } + + func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + } + +} diff --git a/TraccarClient/ProtocolFormatter.swift b/TraccarClient/ProtocolFormatter.swift new file mode 100644 index 0000000..8730dfa --- /dev/null +++ b/TraccarClient/ProtocolFormatter.swift @@ -0,0 +1,65 @@ +// +// Copyright 2016 - 2021 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +public class ProtocolFormatter: NSObject { + + public static func formatPostion(_ position: Position, url: String, alarm: String? = nil) -> URL? { + var components = URLComponents(string: url) + + var query = String() + + if let deviceId = position.deviceId { + query += "id=\(deviceId)&" + } + if let time = position.time { + query += "timestamp=\(Int(time.timeIntervalSince1970))&" + } + if let latitude = position.latitude { + query += String(format: "lat=%.06f&", latitude.doubleValue) + } + if let longitude = position.longitude { + query += String(format: "lon=%.06f&", longitude.doubleValue) + } + if let speed = position.speed { + query += "speed=\(speed)&" + } + if let course = position.course { + query += "bearing=\(course)&" + } + if let altitude = position.altitude { + query += "altitude=\(altitude)&" + } + if let accuracy = position.accuracy { + query += "accuracy=\(accuracy)&" + } + if let battery = position.battery { + query += "batt=\(battery)&" + } + if position.charging { + query += "charge=true&" + } + if let alarm = alarm { + query += "alarm=\(alarm)&" + } + components?.query = String(query.dropLast()) + + // use queryItems for iOS 8 + return components?.url + } + +} diff --git a/TraccarClient/RequestManager.swift b/TraccarClient/RequestManager.swift new file mode 100644 index 0000000..5085462 --- /dev/null +++ b/TraccarClient/RequestManager.swift @@ -0,0 +1,29 @@ +// +// Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +public class RequestManager: NSObject { + + public static func sendRequest(_ url: URL, completionHandler handler: @escaping (Bool) -> Void) { + var request = URLRequest(url: url) + request.httpMethod = "POST" + NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue.main, completionHandler: {(response, data, connectionError) -> Void in + handler(data != nil) + }) + } + +} diff --git a/TraccarClient/StatusViewController.swift b/TraccarClient/StatusViewController.swift new file mode 100644 index 0000000..95cdd89 --- /dev/null +++ b/TraccarClient/StatusViewController.swift @@ -0,0 +1,81 @@ +// +// Copyright 2014 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +class StatusViewController: UITableViewController { + + static let LIMIT = 20 + static var statusViewController: StatusViewController? + + static var messages = [String]() + + class func addMessage(_ message: String) { + let formatter = DateFormatter() + formatter.dateFormat = "HH:mm - " + + messages.append(formatter.string(from: Date()) + (message)) + + if messages.count > LIMIT { + messages.remove(at: 0) + } + + statusViewController?.tableView.reloadData() + } + + class func clearMessages() { + messages.removeAll() + + statusViewController?.tableView.reloadData() + } + + @IBAction func clear(_ sender: UIBarButtonItem) { + StatusViewController.clearMessages() + } + + override func viewDidLoad() { + tableView.tableFooterView = UIView() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + StatusViewController.statusViewController = self + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + StatusViewController.statusViewController = nil + } + + override func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return StatusViewController.messages.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cellIdentifier: String = "status" + var cell: UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) + if cell == nil { + cell = UITableViewCell(style: .default, reuseIdentifier: cellIdentifier) + } + cell?.textLabel?.text = StatusViewController.messages[indexPath.row] + return cell! + } + +} diff --git a/TraccarClient/TraccarClient-Info.plist b/TraccarClient/TraccarClient-Info.plist new file mode 100644 index 0000000..296861d --- /dev/null +++ b/TraccarClient/TraccarClient-Info.plist @@ -0,0 +1,91 @@ +<?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"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleDisplayName</key> + <string>Traccar Client</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>$(MARKETING_VERSION)</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>$(CURRENT_PROJECT_VERSION)</string> + <key>LSRequiresIPhoneOS</key> + <true/> + <key>NSAppTransportSecurity</key> + <dict> + <key>NSAllowsArbitraryLoads</key> + <true/> + </dict> + <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> + <string>This is a tracking application and therefore requires access to location services</string> + <key>NSLocationAlwaysUsageDescription</key> + <string>This is a tracking application and therefore requires access to location services</string> + <key>NSLocationWhenInUseUsageDescription</key> + <string>This is a tracking application and therefore requires access to location services</string> + <key>UIApplicationShortcutItems</key> + <array> + <dict> + <key>UIApplicationShortcutItemTitle</key> + <string>Start service</string> + <key>UIApplicationShortcutItemType</key> + <string>org.traccar.client.start</string> + </dict> + <dict> + <key>UIApplicationShortcutItemTitle</key> + <string>Stop service</string> + <key>UIApplicationShortcutItemType</key> + <string>org.traccar.client.stop</string> + </dict> + <dict> + <key>UIApplicationShortcutItemTitle</key> + <string>Send SOS</string> + <key>UIApplicationShortcutItemType</key> + <string>org.traccar.client.sos</string> + </dict> + </array> + <key>UIBackgroundModes</key> + <array> + <string>location</string> + </array> + <key>UILaunchStoryboardName</key> + <string>LaunchScreen</string> + <key>UIMainStoryboardFile</key> + <string>MainStoryboard</string> + <key>UIMainStoryboardFile~ipad</key> + <string>MainStoryboard</string> + <key>UIRequiredDeviceCapabilities</key> + <array> + <string>armv7</string> + </array> + <key>UIStatusBarStyle</key> + <string>UIStatusBarStyleLightContent</string> + <key>UISupportedInterfaceOrientations</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> + <key>UISupportedInterfaceOrientations~ipad</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationPortraitUpsideDown</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> + <key>UIViewControllerBasedStatusBarAppearance</key> + <false/> +</dict> +</plist> diff --git a/TraccarClient/TraccarClient-Prefix.pch b/TraccarClient/TraccarClient-Prefix.pch new file mode 100644 index 0000000..936fe15 --- /dev/null +++ b/TraccarClient/TraccarClient-Prefix.pch @@ -0,0 +1,15 @@ +// +// Prefix header for all source files of the 'TraccarClient' target in the 'TraccarClient' project +// + +#import <Availability.h> + +#ifndef __IPHONE_5_0 +#warning "This project uses features only available in iOS SDK 5.0 and later." +#endif + +#ifdef __OBJC__ + #import <UIKit/UIKit.h> + #import <Foundation/Foundation.h> + #import <CoreData/CoreData.h> +#endif diff --git a/TraccarClient/TraccarClient.xcdatamodeld/TraccarClient.xcdatamodel/contents b/TraccarClient/TraccarClient.xcdatamodeld/TraccarClient.xcdatamodel/contents new file mode 100644 index 0000000..4960488 --- /dev/null +++ b/TraccarClient/TraccarClient.xcdatamodeld/TraccarClient.xcdatamodel/contents @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="19574" systemVersion="21D62" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""> + <entity name="Position" representedClassName=".Position" syncable="YES"> + <attribute name="accuracy" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/> + <attribute name="altitude" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO"/> + <attribute name="battery" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO"/> + <attribute name="charging" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/> + <attribute name="course" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO"/> + <attribute name="deviceId" optional="YES" attributeType="String"/> + <attribute name="latitude" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO"/> + <attribute name="longitude" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO"/> + <attribute name="speed" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO"/> + <attribute name="time" optional="YES" attributeType="Date" usesScalarValueType="NO"/> + </entity> + <elements> + <element name="Position" positionX="-45" positionY="-9" width="128" height="179"/> + </elements> +</model> \ No newline at end of file diff --git a/TraccarClient/TrackingController.swift b/TraccarClient/TrackingController.swift new file mode 100644 index 0000000..56a832c --- /dev/null +++ b/TraccarClient/TrackingController.swift @@ -0,0 +1,150 @@ +// +// Copyright 2013 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import CoreLocation + +class TrackingController: NSObject, PositionProviderDelegate, NetworkManagerDelegate, CLLocationManagerDelegate { + + static let RETRY_DELAY: UInt64 = 30 * 1000; + + var online = false + var waiting = false + var stopped = false + + let positionProvider = PositionProvider() + let locationManager = CLLocationManager() + let databaseHelper = DatabaseHelper() + let networkManager = NetworkManager() + let userDefaults = UserDefaults.standard + + let url: String + let buffer: Bool + + override init() { + online = networkManager.online() + url = userDefaults.string(forKey: "server_url_preference")! + buffer = userDefaults.bool(forKey: "buffer_preference") + + super.init() + + positionProvider.delegate = self + locationManager.delegate = self + networkManager.delegate = self + } + + func start() { + self.stopped = false + if self.online { + read() + } + positionProvider.startUpdates() + locationManager.startMonitoringSignificantLocationChanges() + networkManager.start() + } + + func stop() { + networkManager.stop() + locationManager.stopMonitoringSignificantLocationChanges() + positionProvider.stopUpdates() + self.stopped = true + } + + func didUpdate(position: Position) { + StatusViewController.addMessage(NSLocalizedString("Location update", comment: "")) + if buffer { + write(position) + } else { + send(position) + } + } + + func didUpdateNetwork(online: Bool) { + StatusViewController.addMessage(NSLocalizedString("Connectivity change", comment: "")) + if !self.online && online { + read() + } + self.online = online + } + + // + // State transition examples: + // + // write -> read -> send -> delete -> read + // + // read -> send -> retry -> read -> send + // + + func write(_ position: Position) { + let context = DatabaseHelper().managedObjectContext + if context.hasChanges { + try? context.save() + } + if self.online && self.waiting { + read() + self.waiting = false + } + } + + func read() { + if let position = databaseHelper.selectPosition() { + if (position.deviceId == userDefaults.string(forKey: "device_id_preference")) { + send(position) + } else { + delete(position) + } + } else { + self.waiting = true + } + } + + func delete(_ position: Position) { + databaseHelper.delete(position: position) + read() + } + + func send(_ position: Position) { + if let request = ProtocolFormatter.formatPostion(position, url: url) { + RequestManager.sendRequest(request, completionHandler: {(_ success: Bool) -> Void in + if success { + if self.buffer { + self.delete(position) + } + } else { + StatusViewController.addMessage(NSLocalizedString("Send failed", comment: "")) + if self.buffer { + self.retry() + } + } + }) + } else { + StatusViewController.addMessage(NSLocalizedString("Send failed", comment: "")) + if buffer { + self.retry() + } + } + } + + func retry() { + let deadline = DispatchTime.now() + Double(TrackingController.RETRY_DELAY * NSEC_PER_MSEC) / Double(NSEC_PER_SEC) + DispatchQueue.main.asyncAfter(deadline: deadline, execute: {() -> Void in + if !self.stopped && self.online { + self.read() + } + }) + } + +} diff --git a/TraccarClient/de.lproj/Localizable.strings b/TraccarClient/de.lproj/Localizable.strings new file mode 100644 index 0000000..7838aa5 --- /dev/null +++ b/TraccarClient/de.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar Client"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "Übertragung fehlerhaft"; +"Location update" = "Positionsupdate"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/de.lproj/MainStoryboard.strings b/TraccarClient/de.lproj/MainStoryboard.strings new file mode 100644 index 0000000..e721081 --- /dev/null +++ b/TraccarClient/de.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Traccar Client"; +"eKa-7m-jq1.title" = "Status"; +"gEG-ov-HEk.title" = "Über"; +"He4-eJ-a31.title" = "Leeren"; +"drL-Ag-IYB.text" = "Echtzeit GPS Ortung für Android Geräte. Kompatibel mit Traccar Server und anderen Ortungsservern."; +"2Hh-sN-c9g.text" = "Dieses Programm ist frei und Open Source. Es ist unter Apache Lizenz Version 2.0 lizenziert und ist auf GitHub verfügbar."; +"jF9-Ub-rRP.text" = "Für weitere Informationen besuchen Sie www.traccar.org/client"; diff --git a/TraccarClient/en.lproj/MainStoryboard.strings b/TraccarClient/en.lproj/MainStoryboard.strings new file mode 100644 index 0000000..0ec39b8 --- /dev/null +++ b/TraccarClient/en.lproj/MainStoryboard.strings @@ -0,0 +1,3 @@ +"TDj-2j-wEh.text" = "Traccar Client"; +"eKa-7m-jq1.title" = "Status"; +"He4-eJ-a31.title" = "Clear"; diff --git a/TraccarClient/es.lproj/Localizable.strings b/TraccarClient/es.lproj/Localizable.strings new file mode 100644 index 0000000..ca7946d --- /dev/null +++ b/TraccarClient/es.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Cliente Traccar"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "Falló el envÃo"; +"Location update" = "Actualización de localización"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/es.lproj/MainStoryboard.strings b/TraccarClient/es.lproj/MainStoryboard.strings new file mode 100644 index 0000000..8648329 --- /dev/null +++ b/TraccarClient/es.lproj/MainStoryboard.strings @@ -0,0 +1,8 @@ +"TDj-2j-wEh.text" = "Cliente Traccar"; +"eKa-7m-jq1.title" = "Estado"; +"gEG-ov-HEk.title" = "Acerca de…"; +"He4-eJ-a31.title" = "Limpiar"; +"drL-Ag-IYB.text" = "Rastreador GPS en tiempo real para dispositivos Android. Compatible con Servidor Traccar y otros sistemas de rastreo."; +"2Hh-sN-c9g.text" = "Esta aplición es gratuÃta y de código abierto. El código fuente está bajo la Licencia Apache Versión 2 y disponible en Github."; +"jF9-Ub-rRP.text" = "Para más información visite +www.traccar.org/client"; diff --git a/TraccarClient/fr.lproj/Localizable.strings b/TraccarClient/fr.lproj/Localizable.strings new file mode 100644 index 0000000..7785509 --- /dev/null +++ b/TraccarClient/fr.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Client Traccar"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "L’envoi a échoué"; +"Location update" = "Localisation mise à jour"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/fr.lproj/MainStoryboard.strings b/TraccarClient/fr.lproj/MainStoryboard.strings new file mode 100644 index 0000000..5f4114c --- /dev/null +++ b/TraccarClient/fr.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Client Traccar"; +"eKa-7m-jq1.title" = "Etat"; +"gEG-ov-HEk.title" = "A propos"; +"He4-eJ-a31.title" = "Effacer"; +"drL-Ag-IYB.text" = "Suivi GPS en temps réels pour appareils Android. Compatible avec le serveur Traccar ainsi que d\'autres plateformes de suivi."; +"2Hh-sN-c9g.text" = "Cette application open source est gratuite. Le code source est disponible sur GitHub est sous licence Apache Version 2.0."; +"jF9-Ub-rRP.text" = "Pour plus d’information, visitez le site: \nwww.traccar.org/client"; diff --git a/TraccarClient/it.lproj/Localizable.strings b/TraccarClient/it.lproj/Localizable.strings new file mode 100644 index 0000000..f564adb --- /dev/null +++ b/TraccarClient/it.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar Client"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "Invio fallito"; +"Location update" = "Aggiornamento posizione"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/it.lproj/MainStoryboard.strings b/TraccarClient/it.lproj/MainStoryboard.strings new file mode 100644 index 0000000..cf670ea --- /dev/null +++ b/TraccarClient/it.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Traccar Client"; +"eKa-7m-jq1.title" = "Stato"; +"gEG-ov-HEk.title" = "Informazioni"; +"He4-eJ-a31.title" = "Pulisci"; +"drL-Ag-IYB.text" = "Real time GPS tracker per dispositivi Android. Compatibile con Traccar Server e altri sistemi di tracking."; +"2Hh-sN-c9g.text" = "Questa applicazione è libera e open source, il codice sorgente è sotto licenza Apache License Version 2.0 e disponibile su GitHub."; +"jF9-Ub-rRP.text" = "Per maggiori informazioni visitate \nwww.traccar.org/client"; diff --git a/TraccarClient/ja.lproj/Localizable.strings b/TraccarClient/ja.lproj/Localizable.strings new file mode 100644 index 0000000..085c411 --- /dev/null +++ b/TraccarClient/ja.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar クライアント"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ"; +"Location update" = "ä½ç½®æƒ…å ±æ›´æ–°"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/ja.lproj/MainStoryboard.strings b/TraccarClient/ja.lproj/MainStoryboard.strings new file mode 100644 index 0000000..511a88e --- /dev/null +++ b/TraccarClient/ja.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Traccar クライアント"; +"eKa-7m-jq1.title" = "ステータス"; +"gEG-ov-HEk.title" = "アプリã«ã¤ã„ã¦"; +"He4-eJ-a31.title" = "クリア"; +"drL-Ag-IYB.text" = "Android デãƒã‚¤ã‚¹ç”¨ã®ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ GPS トラッカーã§ã™ã€‚ Traccar サーãƒãƒ¼ã‚„ä»–ã®ãƒˆãƒ©ãƒƒã‚ングシステムã¨äº’æ›æ€§ãŒã‚りã¾ã™ã€‚"; +"2Hh-sN-c9g.text" = "ã“ã®ã‚¢ãƒ—リケーションã¯ç„¡æ–™ã®ã‚ªãƒ¼ãƒ—ンソースã§ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ Apache ライセンス ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.0 ã§ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã•れã¾ã™ã€‚ GitHub ã§åˆ©ç”¨å¯èƒ½ã§ã™ã€‚"; +"jF9-Ub-rRP.text" = "詳細㯠visit\nwww.traccar.org/client"; diff --git a/TraccarClient/ko.lproj/Localizable.strings b/TraccarClient/ko.lproj/Localizable.strings new file mode 100644 index 0000000..d323218 --- /dev/null +++ b/TraccarClient/ko.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar ê³ ê°"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "보내기 실패"; +"Location update" = "위치 ìˆ˜ì •"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/ko.lproj/MainStoryboard.strings b/TraccarClient/ko.lproj/MainStoryboard.strings new file mode 100644 index 0000000..ca3b01e --- /dev/null +++ b/TraccarClient/ko.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Traccar ê³ ê°"; +"eKa-7m-jq1.title" = "ìƒíƒœ"; +"gEG-ov-HEk.title" = "관하여"; +"He4-eJ-a31.title" = "초기화"; +"drL-Ag-IYB.text" = "안드로ì´ë“œ 장치를위한 실시간 GPS ì¶”ì 기. Traccar 서버 ë° ê¸°íƒ€ ì¶”ì 시스템과 호환ë©ë‹ˆë‹¤."; +"2Hh-sN-c9g.text" = "ì´ ì‘ìš© í”„ë¡œê·¸ëž¨ì€ ë¬´ë£Œì´ë©° 오픈 소스ì´ë©°, 소스 코드는 Apache License Version 2.0ì—서 ì‚¬ìš©ì´ í—ˆê°€ë˜ë©° GitHubì—서 ì‚¬ìš©í• ìˆ˜ 있습니다."; +"jF9-Ub-rRP.text" = "ë” ìžì„¸í•œ ì •ë³´ëŠ” \www.traccar.org/client 를 방문하ì‹ì‹œì˜¤."; diff --git a/TraccarClient/nl.lproj/Localizable.strings b/TraccarClient/nl.lproj/Localizable.strings new file mode 100644 index 0000000..81fa125 --- /dev/null +++ b/TraccarClient/nl.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar client"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "Verzenden mislukt"; +"Location update" = "Locatie update"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/nl.lproj/MainStoryboard.strings b/TraccarClient/nl.lproj/MainStoryboard.strings new file mode 100644 index 0000000..ede2035 --- /dev/null +++ b/TraccarClient/nl.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Traccar client"; +"eKa-7m-jq1.title" = "Status"; +"gEG-ov-HEk.title" = "Over ons"; +"He4-eJ-a31.title" = "Wis"; +"drL-Ag-IYB.text" = "Real time GPS tracker voor Android apparaten. Compatibel met de Traccar server en andere tracking systemen."; +"2Hh-sN-c9g.text" = "Deze toepassing is gratis en open source, de broncode is beschikbaar onder de Apache Licentie versie 2.0 op GitHub."; +"jF9-Ub-rRP.text" = "Voor meer informatie bezoek\nwww.traccar.org/client"; diff --git a/TraccarClient/pl.lproj/Localizable.strings b/TraccarClient/pl.lproj/Localizable.strings new file mode 100644 index 0000000..fee3d1e --- /dev/null +++ b/TraccarClient/pl.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar Klient"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "WysÅ‚anie nieudane"; +"Location update" = "Aktualizacja lokalizacji"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/pl.lproj/MainStoryboard.strings b/TraccarClient/pl.lproj/MainStoryboard.strings new file mode 100644 index 0000000..5f2182d --- /dev/null +++ b/TraccarClient/pl.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Traccar Klient"; +"eKa-7m-jq1.title" = "Status"; +"gEG-ov-HEk.title" = "O Traccar"; +"He4-eJ-a31.title" = "Wyczyść"; +"drL-Ag-IYB.text" = "Monitor GPS dla urzÄ…dzeÅ„ Android. Kompatybilny z serwerem Traccar oraz innymi platformami Å›ledzÄ…cymi."; +"2Hh-sN-c9g.text" = "Ta aplikacja jest darmowa i otwartoźródÅ‚owa. Kod źródÅ‚owy jest licencjonowany Apache License Version 2.0 i jest dostÄ™pny na GitHub."; +"jF9-Ub-rRP.text" = "WiÄ™cej informacji - odwiedź\nwww.traccar.org/client"; diff --git a/TraccarClient/pt-BR.lproj/Localizable.strings b/TraccarClient/pt-BR.lproj/Localizable.strings new file mode 100644 index 0000000..10c227e --- /dev/null +++ b/TraccarClient/pt-BR.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Cliente Traccar"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "Falha no envio"; +"Location update" = "Localização atualizada"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/pt-BR.lproj/MainStoryboard.strings b/TraccarClient/pt-BR.lproj/MainStoryboard.strings new file mode 100644 index 0000000..061dffa --- /dev/null +++ b/TraccarClient/pt-BR.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Cliente Traccar"; +"eKa-7m-jq1.title" = "Status"; +"gEG-ov-HEk.title" = "Sobre"; +"He4-eJ-a31.title" = "Limpar"; +"drL-Ag-IYB.text" = "Rastreador GPS em tempo real para dispositivos Android. CompatÃvel com o Traccar Server e outros sistemas de rastreamento."; +"2Hh-sN-c9g.text" = "Esta aplicação é livre e de código aberto, o código fonte é licenciado sob a licença Apache Versão 2.0 e disponÃvel no GitHub."; +"jF9-Ub-rRP.text" = "Para mais informações visite\nwww.traccar.org/client"; diff --git a/TraccarClient/pt.lproj/Localizable.strings b/TraccarClient/pt.lproj/Localizable.strings new file mode 100644 index 0000000..10c227e --- /dev/null +++ b/TraccarClient/pt.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Cliente Traccar"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "Falha no envio"; +"Location update" = "Localização atualizada"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/pt.lproj/MainStoryboard.strings b/TraccarClient/pt.lproj/MainStoryboard.strings new file mode 100644 index 0000000..5fb390e --- /dev/null +++ b/TraccarClient/pt.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Cliente Traccar"; +"eKa-7m-jq1.title" = "Estado"; +"gEG-ov-HEk.title" = "Sobre"; +"He4-eJ-a31.title" = "Limpar"; +"drL-Ag-IYB.text" = "Localizador GPS em tempo real para dispositivos Android. CompatÃvel com servidor Traccar e outros sistemas de localização."; +"2Hh-sN-c9g.text" = "Esta aplicação é livre e de código aberto, o código fonte é licenciado sob a licença Apache Versão 2.0 e disponÃvel no GitHub."; +"jF9-Ub-rRP.text" = "Para mais informações visite \nwww.traccar.org/client"; diff --git a/TraccarClient/ru.lproj/Localizable.strings b/TraccarClient/ru.lproj/Localizable.strings new file mode 100644 index 0000000..79fa773 --- /dev/null +++ b/TraccarClient/ru.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar Клиент"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "Ошибка отправки"; +"Location update" = "Обновление меÑтоположениÑ"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/ru.lproj/MainStoryboard.strings b/TraccarClient/ru.lproj/MainStoryboard.strings new file mode 100644 index 0000000..39ee6fb --- /dev/null +++ b/TraccarClient/ru.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Traccar Клиент"; +"eKa-7m-jq1.title" = "СоÑтоÑние"; +"gEG-ov-HEk.title" = "О программе"; +"He4-eJ-a31.title" = "ОчиÑтить"; +"drL-Ag-IYB.text" = "Трекер Ð´Ð»Ñ Android уÑтройÑтв. СовмеÑтим Ñ Traccar Ñервером и другими мониторинговыми ÑиÑтемами."; +"2Hh-sN-c9g.text" = "Ðто приложение раÑпроÑтанÑетÑÑ Ð±ÐµÑплатно, иÑходный код раÑпроÑтанÑетÑÑ Ð¿Ð¾ лицензии Apache License Version 2.0 и доÑтупен на GitHub."; +"jF9-Ub-rRP.text" = "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации поÑетите\nwww.traccar.org/client"; diff --git a/TraccarClient/zh.lproj/Localizable.strings b/TraccarClient/zh.lproj/Localizable.strings new file mode 100644 index 0000000..a424ae1 --- /dev/null +++ b/TraccarClient/zh.lproj/Localizable.strings @@ -0,0 +1,9 @@ +"Traccar Client" = "Traccar定ä½ç«¯"; +"Service created" = "Service created"; +"Service destroyed" = "Service destroyed"; +"Send failed" = "å‘é€å¤±è´¥"; +"Location update" = "ä½ç½®æ›´æ–°"; +"Connectivity change" = "Connectivity change"; +"Invalid server address" = "Invalid server address"; +"Invalid server port" = "Invalid server port"; +"Invalid frequency value" = "Invalid frequency value"; diff --git a/TraccarClient/zh.lproj/MainStoryboard.strings b/TraccarClient/zh.lproj/MainStoryboard.strings new file mode 100644 index 0000000..fc16c54 --- /dev/null +++ b/TraccarClient/zh.lproj/MainStoryboard.strings @@ -0,0 +1,7 @@ +"TDj-2j-wEh.text" = "Traccar定ä½ç«¯"; +"eKa-7m-jq1.title" = "定ä½çжæ€"; +"gEG-ov-HEk.title" = "关于"; +"He4-eJ-a31.title" = "清除"; +"drL-Ag-IYB.text" = "Android设备的实时GPS跟踪器。兼容TraccaræœåŠ¡å™¨å’Œå…¶ä»–è·Ÿè¸ªç³»ç»Ÿã€‚"; +"2Hh-sN-c9g.text" = "æ¤åº”用å…费且开æºã€‚æºç 许å¯ä¸ºApache V2.0,在GitHub上å‘布。"; +"jF9-Ub-rRP.text" = "更多信æ¯è¯·è®¿é—®www.traccar.org/client"; diff --git a/TraccarClientTests/CoreDataTests.swift b/TraccarClientTests/CoreDataTests.swift new file mode 100644 index 0000000..be123ba --- /dev/null +++ b/TraccarClientTests/CoreDataTests.swift @@ -0,0 +1,36 @@ +// +// Copyright 2015 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import XCTest +import CoreData + +class CoreDataTests: XCTestCase { + + var managedObjectContext: NSManagedObjectContext? + var managedObjectModel: NSManagedObjectModel? + var persistentStoreCoordinator: NSPersistentStoreCoordinator? + + override func setUp() { + let modelURL = Bundle.main.url(forResource: "TraccarClient", withExtension: "momd") + managedObjectModel = NSManagedObjectModel(contentsOf: modelURL!) + + persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel!) + + managedObjectContext = NSManagedObjectContext() + managedObjectContext?.persistentStoreCoordinator = persistentStoreCoordinator + } + +} diff --git a/TraccarClientTests/DatabaseHelperTests.swift b/TraccarClientTests/DatabaseHelperTests.swift new file mode 100644 index 0000000..359868d --- /dev/null +++ b/TraccarClientTests/DatabaseHelperTests.swift @@ -0,0 +1,39 @@ +// +// Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import XCTest +import TraccarClient + +class DatabaseHelperTests: CoreDataTests { + + func testFormatPosition() { + let databaseHelper = DatabaseHelper(managedObjectContext: managedObjectContext!) + + XCTAssertNil(databaseHelper.selectPosition()) + + let position = Position(managedObjectContext: managedObjectContext!) + position.deviceId = "123456789012345" + position.time = Date(timeIntervalSince1970: 0) as NSDate + + XCTAssertNotNil(databaseHelper.selectPosition()) + + databaseHelper.delete(position: position) + + XCTAssertNil(databaseHelper.selectPosition()) + } + + +} diff --git a/TraccarClientTests/Info.plist b/TraccarClientTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/TraccarClientTests/Info.plist @@ -0,0 +1,24 @@ +<?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"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>$(PRODUCT_NAME)</string> + <key>CFBundlePackageType</key> + <string>BNDL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> +</dict> +</plist> diff --git a/TraccarClientTests/ProtocolFormatterTests.swift b/TraccarClientTests/ProtocolFormatterTests.swift new file mode 100644 index 0000000..1f7bb3f --- /dev/null +++ b/TraccarClientTests/ProtocolFormatterTests.swift @@ -0,0 +1,32 @@ +// +// Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import XCTest +import TraccarClient + +class ProtocolFormatterTests: CoreDataTests { + + func testFormatPosition() { + let position = Position(managedObjectContext: managedObjectContext!) + position.deviceId = "123456789012345" + position.time = Date(timeIntervalSince1970: 0) as NSDate + + let url = ProtocolFormatter.formatPostion(position, url: "http://localhost:5055") + + XCTAssertEqual("http://localhost:5055?id=123456789012345×tamp=0&lat=0.000000&lon=0.000000&speed=0&bearing=0&altitude=0&accuracy=0&batt=0", url?.absoluteString) + } + +} diff --git a/TraccarClientTests/RequestManagerTests.swift b/TraccarClientTests/RequestManagerTests.swift new file mode 100644 index 0000000..432a756 --- /dev/null +++ b/TraccarClientTests/RequestManagerTests.swift @@ -0,0 +1,33 @@ +// +// Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import XCTest +import TraccarClient + +class RequestManagerTests: XCTestCase { + + func testSendRequest() { + let expectation: XCTestExpectation? = self.expectation(description: "sendRequest") + + RequestManager.sendRequest(URL(string: "http://www.google.com")!, completionHandler: {(success) -> Void in + XCTAssertTrue(success) + expectation?.fulfill() + }) + + waitForExpectations(timeout: 5, handler: nil) + } + +} diff --git a/translate.py b/translate.py new file mode 100755 index 0000000..d8a2d10 --- /dev/null +++ b/translate.py @@ -0,0 +1,85 @@ +#!/usr/bin/python + +import os +import optparse +import urllib2 +import json +import base64 +import re +import codecs +import xml.etree.ElementTree + +parser = optparse.OptionParser() +parser.add_option('-u', '--user', dest='username', help='transifex user login') +parser.add_option('-p', '--password', dest='password', help='transifex user password') + +(options, args) = parser.parse_args() + +if not options.username or not options.password: + parser.error('User name and password are required') + +os.chdir(os.path.dirname(os.path.abspath(__file__)) + '/TraccarClient') + +def request(url): + req = urllib2.Request(url) + auth = base64.encodestring("%s:%s" % (options.username, options.password)).replace("\n", "") + req.add_header("Authorization", "Basic %s" % auth) + return urllib2.urlopen(req) + +mapping_en = {} + +def load_en(): + data = request('https://www.transifex.com/api/2/project/traccar/resource/client/translation/en?file').read().decode('utf-8') + for entry in xml.etree.ElementTree.fromstring(data).findall('string'): + mapping_en[entry.attrib['name']] = entry.text.replace('Android', 'iOS') + +load_en() + +regex = re.compile(r'"([^"]+)" = "([^"]+)";') + +def write_storyboard(code, mapping): + in_file = codecs.open('en.lproj/MainStoryboard.strings', 'r', 'utf-8') + out_file = codecs.open(code + '.lproj/MainStoryboard.strings', 'w', 'utf-8') + for line in in_file: + match = regex.match(line) + if match: + out_file.write('"' + match.group(1) + '" = "' + mapping.get(match.group(2), match.group(2)) + '";\n') + out_file.close() + in_file.close() + +def write_strings(code, mapping): + in_file = codecs.open('Base.lproj/Localizable.strings', 'r', 'utf-8') + out_file = codecs.open(code + '.lproj/Localizable.strings', 'w', 'utf-8') + for line in in_file: + match = regex.match(line) + if match: + out_file.write('"' + match.group(1) + '" = "' + mapping.get(match.group(2), match.group(2)) + '";\n') + out_file.close() + in_file.close() + +def write_settings(code, mapping): + filename = 'InAppSettings.bundle/' + code + '.lproj/Root.strings' + if not os.path.exists(os.path.dirname(filename)): + os.makedirs(os.path.dirname(filename)) + in_file = codecs.open('InAppSettings.bundle/en.lproj/Root.strings', 'r', 'utf-8') + out_file = codecs.open(filename, 'w', 'utf-8') + for line in in_file: + match = regex.match(line) + if match: + out_file.write('"' + match.group(1) + '" = "' + mapping.get(match.group(2), match.group(2)) + '";\n') + out_file.close() + in_file.close() + +for directory in os.walk('.'): + match = re.match(r"([a-z]{2}(?:-[A-Z]{2})?)\.lproj", directory[0][2:]) + if match: + code = match.group(1) + if code != 'en': + mapping = {} + data = request('https://www.transifex.com/api/2/project/traccar/resource/client/translation/' + code.replace('-', '_') + '?file').read() + for entry in xml.etree.ElementTree.fromstring(data).findall('string'): + mapping[mapping_en[entry.attrib['name']]] = entry.text + write_storyboard(code, mapping) + write_strings(code, mapping) + write_settings(code, mapping) + print code -- GitLab