我如何为人们制作停车追踪器

最近,我再次夹紧。 我住在欧洲,在这里,他们不但不会因停车不当和“ cl脚”拖车而受到罚款,反而会束缚您的汽车方向盘。 要出去,您需要打个电话,支付一整笔款项,然后等待带钥匙的那个家伙举起链子。 这很长,很丢人,有时(取决于地区)掠夺性昂贵。

那天我到处都迟到了。 等待工人用钥匙敲响,我想知道自己有多愚蠢。 我冲了进去,离开了汽车半个小时,而不是最长的20分钟免费停车时间-恰好是在第21分钟就被抓住了。 不幸的是,停车场的条纹面包车不远,他们立即做出了反应。 他们以前曾因各种原因而赶上我:我忘记了付款期限已过期,有时我只是在迷宫般的街道上找不到我的车。

我想:“所有内容都必须有一个应用程序。”然后开始深入研究应用程序商店。 经过一番可疑的结果后,我的信心减弱了,我决定澄清一下:“必须有一个适用于所有内容的android应用程序。” 然后,他找到了他的huavei,爬进了游戏商店的肠子。 从那里,更多的碎片溅到我身上,淹没在笨拙的工艺品中,我吐口水。 我看起来有点不对劲,或者没有方便且可理解的停车跟踪器。 结论很简单:如果我们没有东西,让我们自己做。

在这种背景下,我已经看到了一个长期的建设过程 ,几乎夺走了我所有的空闲时间。 我决定休息一下,并在此间隔内收集另一个投影。 估算了所需的功能之后,我设想了一个半月的时间,并且展望未来,我会说,从原理上讲,它甚至更快。 结果是在两个平台上都紧凑紧凑的应用程序 ,非常方便。 现在,我自己使用它,建议您尝试一下。

图片

主意


那我想从停车追踪器那里得到什么呢? 得到罚款后我会一直想念什么? 经过深思熟虑,我制定了以下介绍:

  1. 很简单 理想情况下,一键式。 最少的干扰功能:无配置文件,停车历史记录,同时支持多辆车等。
  2. 带有通知。 如果应用程序提醒我,我不会忘记这辆车:兄弟,您那边有停车场,而且快要到期了。
  3. 考虑步行时间。 这是我从未见过的最简单的想法。 如果我距离停车场有半小时的路程,我不需要知道它会在5分钟后失效。 需要提醒我,以便我可以在结束前几分钟开车离开。
  4. 路线和导航到停车场。 当然,可以通过Google或Apple Maps进行导航,但是可以在您的应用程序中显示路线。 如果您将汽车停在一个陌生的区域,计时器会打勾,并且您沿着相同的街道盘旋行驶,这将有所帮助。

我选择Flutter作为技术基础,因为我已经使用Flutter一段时间了,并认为它很好。 对于路线,我决定不是第一次使用HERE API,而是第一次使用地图-Mapbox。 我为界面设计了几个选项,选择了最简约的一个并参与了工作。

发展历程


原则上,关于开发过程本身没有太多要说的。 这里没有服务器部分,最简单的客户端,它基本上由处于不同状态的一个大视图组成。 在首页上,您可以选择一个预设时间-1,2,4,6小时-或使用滑块调整停车时间。 尝试了一下之后,我意识到滑块非常粗鲁,并在其上添加了“ +”和“-”按钮。 一个有趣而又不明显的细微差别是,当您选择时,时间还在继续。 因此,您需要实时更新此视图。 选择术语后,单击下面的唯一按钮,然后保存位置和时间数据,并开始停车。 重要的是要注意,我基本上将所有数据存储在板上,没有任何内容传输到任何服务器。 顺便说一句,这将来会给我带来困难,但以后会更多。

实际上,第二页是停车计时器。 我在这里尝试了很多选择:我从大量重载的信息原型开始,然后迭代地摆脱并简化到极限。 我确实希望停车状态以视觉方式显示,而不是干燥数字,因此该页面以及地图的主要元素是甜甜圈图。 它显示经过时间,步行时间和剩余时间。 如果您不在汽车旁并且步行时间不为零,则会出现导航开始按钮,并且地图会显示到达停车场的大概路线。 实际上,仅此而已。

尽管视觉上很简单,但这个屏幕还是让我感到不安。 应该理解的是,当停车处于活动状态时,许多过程同时发生:

  • 时间流逝,计时器用完
  • 你移动和旅行时间改变

所有这些都是实时发生的,应该立即显示在界面上。 应平稳地重建海图,地图应移动并重新绘制路线,如果有迟到或停车过期的风险,还应弹出相应的警告。 此外:关闭并打开应用程序时,需要正确还原所有内容。 最后,令人恐惧的是:所有功能都应该能够在后台运行,因为该应用程序的大部分生命都将在后台使用。 这样的事情。

我将不详细描述其实现,只能说与各州的颤抖工作非常值得。 在纯android系统中,会出现过载的面向对象设计,而结果却简单而优雅。 正常的可理解状态,视图与模型的合理绑定-在这种扑朔迷离的任务中。 但是,它并非没有典型的外框:例如,使用地图的本地图书馆没有向新坐标的动态过渡。 我不得不研究她的代码,提取一些私有方法并添加我的拐杖。 可能会很快添加此功能,但这是整个过程-尽管具有吸引力,但要为此类发现做好准备。

其他一切似乎都顺利进行。 实际上,没有太多其他内容:几次对话,以及一个介绍页面,我的女友(她是一名艺术家 )为其绘制了漂亮的动画。 最后,我将整个应用程序翻译成俄语,包括地图。 但是痛苦开始了:通知。

通知事项


对我来说,发送智能通知的能力是应用程序的关键-没有它,就没有什么大惊小怪的了。 但是,当我开始使用此功能时,我意识到自己已经迈出了第一步。 实际上有两个问题。 第一个是flutter,它不知道如何直接使用低级api设备:您需要以插件的形式编写一个垫片,其中包含两个本机代码和飞镖上的抽象。 第二个问题是我的基本立场,就是一切都应该在船上进行。 因此,我们总结了所需的内容。 有必要在后台应用:

  1. 不断监视您的地理位置,
  2. 检查了步行到停车场有多少分钟
  3. 已检查到期计时器
  4. 如果有没有时间返回的风险,则会发出通知

感到悲剧的规模? 很明显,如果应用程序被完全杀死,则没有技术能力。 但是,假设它只是最小化,并且屏幕关闭。 HERE api为我提供了步行时间的路线和估计,这是否意味着应用程序将在后台发送垃圾邮件请求? 总共将运行多少代码? 我们如何处理内存和能源消耗?

我坐下来思考。 从一小段开始:从技术上讲,flutter最近具有在后台执行代码的能力,这称为隔离。 如果一切都正确编写,那么您可以以特定的方式构建逻辑,以便不是所有逻辑都在后台运行,而是某些特定功能。 实际上,在最小化模式下,我们不需要绘制接口或更新状态-我们对计算时间的裸露逻辑很感兴趣,并且该逻辑非常紧凑且便宜。 同时,它不应该像我在原始版本中那样由地理位置的变化触发,而是由一些内部计时器触发。 因为通知应该会飞,即使您不动,也请坐着。

好吧,我们编写了一个轻量级的代码,该代码可以在后台运行并由计时器控制。 我们如何在本机应用程序框架内触发它并在其中传输地理位置数据? 结果却不同。

在后台执行代码方面,Android和iPhone的逻辑完全不同。 对于iPhone,这种情况就不存在了:后台代码只能触发某种类型的系统事件,例如,播放流音频或对我来说幸运的是更新位置。 为此,只需请求权限,然后在Flater插件的本机部分中订阅该事件。 从那里,通过特定的通信通道(MethodChannel),我们在飞镖中调用回调,将地理数据传递给它,并使用所需的逻辑启动背景。 美人

Android的工作方式有所不同。 从技术上讲,他能够在后台执行代码而不受系统事件的束缚-为此,您需要描述服务。 它与应用程序分开悬挂,完全挂在后台或在前台(通过盲文中的附加消息使自己感觉到)。 看来问题已解决:在插件的本机部分中,我们描述了一个跟踪位置并提取Darth代码的后台服务。 但是,有细微差别。 从Android 8.0版开始,对此类服务的态度发生了变化:现在,如果现在将应用程序最小化,则它的后台服务会被轴切断,以节省能源。 而且,例如,如果您的代码执行数据备份,那么原则上您并不在乎轴将在什么确切的时间使它工作-主要是它在工作。 但就我而言,我们需要几乎实时地跟踪位置的变化,而此时机很关键。 因此,唯一的出路就是放弃服务。 我们描述一个附加在窗帘上的小通知,订阅该位置,然后通过MethodChannel将其发送到飞镖。 一切似乎都正常。

顺便说一句,回到存储,能耗和请求数量的问题上,当位置移动到50米时或通过计时器运行代码。 而且,他本人很轻巧,请求没有通过我,而是直接转到HERE api。 我自己没有收到任何数据,也没有将其保存在任何地方。 通常, 这里将很好地描述这种实现,这是一位颤振工程师的博客-该代码也随附于此。 他的例子有些不同,但是一般的方法很明确,因此我建议阅读它。

结果


实际上,仅此而已。 在一个月的空闲时间里,我得到了一个可以完美解决特定问题的应用程序。 我希望本文对某人感兴趣,并且该应用程序可以使您免于罚款和压力。 您可以在这里查看和责骂: AndroidiOS

谢谢大家的关注。

Source: https://habr.com/ru/post/zh-CN464451/


All Articles