flutter-watchtips

Watch tips项目已再次更新,界面已整理,并添加并显示了单独的小费金额值(一项已请求的更新)。我还添加了一个自定义的“键盘”,而不是使用平台提供的标准键盘,希望该应用程序现在看起来比以前更好——用户体验/UI设计不是我的强项。

但最大的更新是现在也有了一个Android版本(没有Watch支持)。这样做很有帮助,因为我可以使用Flutter Android应用程序进行开发,这样我就可以恢复热重载了(开发又变得好起来了……)

对于iOS,我仍然需要运行/构建(并失败)Flutter工具 for iOS(这是生成正确构建脚本所必需的),然后用XCode完成,但一般开发现在更容易了。

这最初是一个实验,看看是否可以使用Flutter构建一个带配套watchOS应用程序的iOS应用程序。我最初尝试使用Beta产品并不成功,所以这个想法就被搁置了。现在重新审视这一点,我已经能够让一个编译好的空白Watch应用程序与Flutter应用程序一起运行,所以我会分阶段尝试使用Flutter重新创建WatchTips应用程序。

这个应用程序是一个非常简单的应用程序,最初只是作为一个概念验证。

但对于任何有兴趣的人,这里是发布链接

计划

  • 1.0 创建一个纯Flutter应用程序(此初始提交)
  • 1.1 添加一个空白Watch项目并使其工作
  • 1.2 将Watch应用程序功能修改为WatchTips
  • 1.3 将Flutter应用程序更新为WatchTips
  • 1.4 看看我是否可以桥接两个应用程序(就像Titanium版本那样)
  • 2.0 整理Flutter代码和iOS项目,并提交应用程序到App Store
  • 2.x+ - 更新和改进

Flutter Package项目

根据这个测试项目的成果,我开始开发一个Flutter Package,以实现Flutter iOS应用程序和Watch应用程序之间的通信。这应该能更容易地集成一些标准功能,尽管目前仍然很麻烦,因为在向iOS项目添加Watch Kit目标后,Flutter的运行/构建将不再有效。这意味着所有的包测试和开发都必须通过XCode完成。

我已通过插件成功地实现了从iOS应用程序到Watch的消息传递,可以在这里的视频中看到。

生成发行构建

到目前为止,我发现的创建发行构建的唯一方法是遵循以下顺序。

设置Bundle ID

在添加Watch Kit应用程序目标之前设置最终的bundle ID,因为Watch应用程序和关联的扩展需要使用相同的名称。否则,您可能需要在创建最终存档之前更新所有引用。

更改所有版本和构建值

必须对每个目标(在本例中为3个)进行更改,分别将它们更改为$(FLUTTER_BUILD_NAME)$(FLUTTER_BUILD_NUMBER),否则,尽管测试运行有效,但除非版本号匹配,否则存档将无效。

先运行Flutter构建

这将失败,但它会生成正确的shell脚本,使iOS能够执行构建(flutter build ios --release)。

在XCode中创建Archive

  • 1选择Generic Device + watchOS Device作为目标
  • 2运行Product -> Archive
  • 3如果构建成功,运行Validate App
  • 4如果验证成功——上传到App Store!!!

版本

2.1

  • 更新了Watch和Phone UI
  • 货币现在默认为手机/平板电脑的本地设置
  • 包已通用化,因此它可以在iPad上运行(不支持Watch)

2.0

  • 首次App Store发布

1.4 - 粗糙但有效!

我现在已成功将所需的代码添加到iOS项目中,以允许它与Flutter通信,并从Watch发送数据更新,以便在应用程序中反映出来。
基本上,如果您在Watch上计算小费,那么数据就会传输到相关的设备。

您需要原谅(糟糕的?)Objective C代码,因为它不是我的强项——到底谁最初会想到它呢 :-) 。其中很多只是强制性的试错,以及大量的搜索和测试。

除此之外,对我来说困难的问题是,尽管MethodChannel文档相当齐全,但EventChannel则不然,我找到的唯一示例都与Plugin扩展有关,但也许是由于我不喜欢(因为不太理解)Objective C。

我稍后会尝试创建一个通用的插件,但那将用Swift完成。

1.3

所以,经过一番折腾,我终于成功了。现在我有一个iWatch应用程序和一个Flutter iOS应用程序可以构建和运行。我通过HockeyApp将它构建并分发到了物理手机上进行了测试。现在是坏消息……

我无法使用Flutter来构建Flutter项目或进行iOS发布构建,所以我实际上是在一个单独的项目中构建了Flutter应用程序,然后将lib目录重新添加到这个项目中。
这是一个很大的麻烦,因为要在设备或模拟器上进行任何测试,我都需要使用XCode来完成所有构建(即没有热重载),但它确实有效。

为了创建应用程序的AD-HOC发行版,我再次使用了XCode,将目标设置为Generic Device并Archive了项目。生成的AD-OC签名应用程序运行良好。

但我认为最后一步将是一个主要的障碍,因为我确实需要使用XCode来完成所有构建……

1.2

更新了Watch应用程序并添加了功能性的WatchTips。Watch应用程序现在可用于计算账单拆分和小费。

1.1

使用XCode定义了具有附加Watch Emulator的模拟器后,标准的Vanilla应用程序(从1.0开始)已更新如下:

  • 为iOS Runner应用程序设置了一个Bundle ID(u.spiralarm.watchtips)
  • 在XCode中添加一个新的Target(File->New->Target),选择了WatchKit app
  • 取消选中Include Notification SceneInclude Complication
  • 将产品命名为WatchTips
  • 生成2套资源(我使用一个名为Asset Catalog Creator的应用程序),一套用于Runner应用程序,一套用于Watch应用程序,以便两者都拥有一整套图标。
  • 打开WatchTips应用程序的interface.storyboard,并在屏幕上添加一个按钮

在此之后,我无法再使用IDE(VSC)在调试模式下启动应用程序,因为我收到了以下错误(也许需要某种自定义构建配置)。

=== BUILD TARGET WatchTips Extension OF PROJECT Runner WITH CONFIGURATION Debug ===
target specifies product type 'com.apple.product-type.watchkit2-extension', but there's no such product type for the 'iphonesimulator' platform
Could not build the application for the simulator.
Error launching application on iPhone 7 with Watch 42mm.

但是,如果我使用XCode,我就可以使用XCode来编译应用程序并在模拟器上运行Watch应用程序。

GitHub

https://github.com/magnatronus/flutter-watchtips