Flutter 项目添加 IOS 小组件开发记录

这篇具有很好参考价值的文章主要介绍了Flutter 项目添加 IOS 小组件开发记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

突然接到一个需求,需要我们在 IOS APP 中添加 widget 小组件,用来展示项目项目数据信息。大领导的需求没法拒绝,只能摸着石头过河,开干!

环境安装

由于项目用的是 Flutter 来搭建的,所以需要申请台 mac 电脑安装一遍开发环境。具体的准备我之前写过一篇 前端角度快速理解 Flutter 开发 的文章,我就不赘述了。

安装完各种环境就花了我大半天的时间,像 Android 的很多东西都需要科学上网后用 Android Studio 慢慢下载。

在执行 flutter doctor 命令显示 flutter 开发环境无误后,终于可以愉快地开发了。

解决项目老旧无法运行的问题

但是!现有 Flutter 项目已经有一两年没有维护了,无论是 Dart 还是各种三方库都特别老,和我安装的崭新环境格格不入……

就比如:

  • SDK 版本太新,需要同步 yaml 配置项 sdk: ">=3.1.5 <4.0.0"
  • 新的 Dart 语法对一些模糊写法会报错,变得更加严格。像 String tag; 这种只定义了类型,没有定义具体值的情况,新的 Dart 需要让我们加上 late 关键字表示这个变量会稍后赋值 late String tag
  • 第三方库弃用了某些 API,或者更换了某些 API 的位置,需要重新调整写法。比如 dio 库!
  • Flutter 自身的界面组件(它称之为 widget)也有一些弃用的部分,比如 ElevatedButton。需要找新的 widget 替换。

这里只能一个一个问题的解决,这里有个小心得是:对这种一大堆问题的项目,可以用 git commit 来管理代码,解决一个问题就提交一次 commit,这样就可以把问题单独出来一个个解决。后续也可以知道每个问题的解决方法。像我一开始没有用 git 管理,问题改着改着就成了一团乱麻了。

处理完 Flutter 的问题还需要处理 IOS 部分。

首先,想要运行 IOS 项目在真机开发室需要证书的,所以找到 IOS 相关的同事要到证书,我拿到的证书有 dev、inhouse、p12 三个,双击将证书都安装到 mac 电脑上。在项目调试的时候使用的是 dev 证书,而项目发版的时候需要用 inhouse 证书。

然后,老的 IOS 项目也是无法在新的 XCode 中运行的,需要用 CocoaPod 升级各种依赖库,将支持的 IOS 版本改为 16.0+,
另外还会遇到不少奇怪的报错。总之就是看到报错就贴到 Google 和 ChatGPT 上找解决方案,虽然费力了点,但一步步的总还是能够解决的。

经过一两天的问题修复后,连上 iphone 运行 flutter run 命令,终于……项目正常跑了起来。

新技术和新语言的快速学习

由于 flutter 和移动开发算是全新的领域,所以还是需要学不少知识点的。类比前端来说就是:

  • 第三方库管理工具 —— 这个其实在处理环境问题的时候逐渐就琢磨出来了。
  • 常用的三方库 —— 一些好用的轮子的使用是必须的,这个只要 README 写得好,照着文档慢慢摸索就可以了。
  • 界面搭建 —— 对于前端而言,无论是 flutter、小程序、react native、uniapp,其实本质都是界面渲染和逻辑处理,所以万变不离其宗,都是差不多的。只要认真看他们的官方文档教程就可以理解,就比如 Introducing SwiftUI | Apple Developer Documentation。在经历过各种前端框架的洗礼后我上手还是很快的。
  • 编程语言 —— 这次用到的 Swift、Dart、Java 其实设计思路上都很类似,所以上手很快。先是在菜鸟教程和官方文档中过了一遍基础语法,然后边学边查边写项目。

总之,这次新技术学习下来,发现在大目标都是界面呈现和逻辑处理的前提下,各方面其实都是可以和前端开发类比着用的。

而对于新技术很多不知道怎么写的问题(一般都是某些界面或者语言的写法不明确,都是很基础的东西),往往问 ChartGPT 要比 Google 有用的多,只要语言描述的足够精确就可以给到想要的代码。与时俱进嘛,AI 还是很好用的。

需求方案的选择

既然项目跑起来了,新技术知识学习好了,就得实现数据展示小组件啦~

方案调研下来有几种:

  • 方案1,在 Flutter 侧使用 Canvas 将图形绘制出来并转为图片,然后通过 home_widget 将图片传到 IOS 侧渲染。
  • 方案2,在 Flutter 侧通过接口获取数据 JSON,然后通过 home_widget 传给 IOS,最后由 IOS 端进行原生 Chart 渲染。
  • 方案3,完全抛开 Flutter 侧,直接在 IOS 的 Widget Extension 模块实现接口请求、JSON 转换、数据渲染一条龙服务。

其中,方案 1 和方案 2 都需要让项目后台运行,所以要通过 workmanager 库进行后台数据更新。
但是吧……这个 workmanager 库怎么调试都不生效,查了 issue 发现好多人也有类似问题。然后去查看他的源码,发现源码中的 API 和 README 文档都对不上。调试一天没反应后只能放弃这个方案。

转而试了方案 3 发现表现良好,IOS 大概每过 5 分钟会发起一次从请求到渲染的过程。这个时间是系统定的,想来是为了不让开发者瞎搞影响手机能耗吧。

所以,最终选择了方案 3 的 IOS 一条龙服务。

业务需求

需求很简单

  • 创建 IOS Widget Extension
  • 获取用户信息
  • 根据用户信息通过接口获取项目数据,IOS 的接口请求我用的是 URLSession.shared.dataTask(with: request) {}
  • 将请求响应数据转为 JSON,这里用到了 SwiftyJSON。
  • 将数据渲染为界面。
  • 接口请求定时更新,由于 IOS Widget 的 getSnapshot 方法会由系统自动定时更新,所以开发者不需要考虑这方面。

Widget Extension 的创建

参考 iOS14 Widget小组件开发(Widget Extension) - 掘金 一文,就不多赘述了。

用户信息的获取

由于这个数据传输是需要权限,且根据个人展示不同数据的。所以,需要拿到用户数据才行。既然是 Flutter 和 Native 端的通信,用的就是 home_widget 模块了。大致原理我猜是两端共享了一块存储数据的空间。

另外,在 IOS 中需要将数据从 APP 端共享给 widget extension 端需要项目打开 APP GROUPS 功能,并且在 XCode 的 signing & Capabilities 中进行配置。

先定义一个工具类:

import 'package:home_widget/home_widget.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:xdata3/utils/constants.dart';

const String appGroupId = 'YOUR APP GROUP ID'; // 这里就是 APP GROUP ID
const String iOSWidgetName = 'GDataWidget';

class WidgetExtension {
  // 设置 APP GROUP ID
  static void init() {
    HomeWidget.setAppGroupId(appGroupId);
  }

  static void updateWidgetData() async {
    final now = DateTime.now();

    SharedPreferences prefs = await SharedPreferences.getInstance();
    String userName = prefs.getString(SharePreferenceKey.USER_NAME) ?? "";
    String tokenLocal =
        prefs.getString(SharePreferenceKey.TOKEN_PREFIX + userName) ?? "";

    HomeWidget.saveWidgetData("XDATA_USER_NAME", userName);
    HomeWidget.saveWidgetData<String>('XDATA_TOKEN', tokenLocal);
    HomeWidget.saveWidgetData<String>('XDATA_TIME',
        '${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}');

    HomeWidget.updateWidget(
      iOSName: iOSWidgetName,
    );
  }
}

在 Flutter 项目初始化的时候初始化 home_widget

WidgetExtension.init();

在用户信息更新后让 home_widget 同步更新数据给 IOS(在项目中是将用户信息存在 SharedPreferences 中的)。

WidgetExtension.updateWidgetData();

然后在 IOS widget 端获取用户信息

func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
    print("get snapshot")

    let userDefaults = UserDefaults(suiteName: "YOUR APP GROUP ID")
    let username = userDefaults?.string(forKey: "XDATA_USER_NAME") ?? ""
    let token = userDefaults?.string(forKey: "XDATA_TOKEN") ?? ""

    // other logic
}

IOS Swift UI Charts 绘制

一开始,以我前端开发的思维,立马开始寻找 IOS 方面的 Chart 库。结果发现这些 Chart 库都是用在 UI Kit 界面体系下的。

而 Widget Extension 使用的是 Swift UI 界面来写的。所以这条路直接堵死。好在我后来发现 Swift UI 在 IOS 16.0+ 新增了 Swift Charts 模块。

下面是我写的 ChartView 组件,传入具体数据就可以展示 Chart 内容。

import SwiftUI
import Charts
import SwiftyJSON

struct DataInfo: Identifiable {
    var legend: String
    var x: String
    var y: Double
    var id = UUID()
}

struct ChartView: View {
    private var propInfos: [DataInfo] = []
    @State private var infos: [DataInfo] = []

    init(propInfos: [DataInfo]) {
        self.propInfos = propInfos
    }

    var body: some View {
        Chart(infos) {
            LineMark(x: .value("x", $0.x), y: .value("y", $0.y))
                .foregroundStyle(by: .value("legend", $0.legend))
                .accessibilityHidden(true)
                .mask{ RectangleMark() }
            RuleMark(y: .value("zero line", 0))
                .foregroundStyle(.gray)
                .lineStyle(StrokeStyle(dash: [2, 2]))
        }
        .chartForegroundStyleScale([
            "今天": Color(red: 255/255, green: 55/255, blue: 38/255),
            "昨天": Color(red: 190/255, green: 192/255, blue: 199/255)
        ])
        .chartYAxis {
            AxisMarks(position: .leading) { _ in
            }
        }
        .chartXAxis {
            AxisMarks(position: .bottom) { _ in

            }
        }
        .chartLegend(.hidden)
        .frame(width: 60, height: 32)
        .onAppear{
            self.infos = self.propInfos
        }
    }
}

感觉写法上很……业余,勉强能实现需求罢了。

收获

总结上面的过程,列一些小收获。文章来源地址https://www.toymoban.com/news/detail-857770.html

  • 同一方向的技术是可以类比的,很多编程思路和设计都是通用的。只要某一项技术用的很熟练扎实,那么切换到别的技术就很快。
  • 遇到复杂难题,可以通过 git 版本控制来定格每一次改动。方便追踪问题。
  • 在查代码写法这方面,ChatGPT 类的工具真的香,提供一段描述就可以给出一段比较靠谱的代码。不过有的 GPT 有点过时了,应该是模型没更新的缘故。
  • 像各类第三方库的问题,StackOverfow 和 Github Issue 是解决问题成功率最高的地方……国内的话也就掘金、SF 靠谱点了吧。CSDN 能把人气死……
  • 报错类问题,也是建议直接贴到 Google 上,然后一个一个方案的去试。虽然费时但是有效。别钻牛角尖。
  • 另外,结识一些不同领域的朋友也很棒。好多 IOS 的难以描述的问题,我只要一个截图过去朋友基本就能知道怎么回事。省时省力。

到了这里,关于Flutter 项目添加 IOS 小组件开发记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在 macOS 上同时使用 Flutter2 和 Flutter3 进行 ios 开发

    猫哥主打系统环境是: macos flutter 3.7.12 ruby 3.2.2 cocoapods 1.12.1 xcode 14.3.1 这套配置运行最新的项目没问题,但是最近需要维护 flutter 2.10.5 这种老项目,虽然用了 fvm 进行 flutter 版本切换,但是 flutter 2.10.5 用的 ruby 2 ,我当前是 ruby 3 所以运行 pod install 的时候就报错了。 这个错误

    2024年02月12日
    浏览(52)
  • 终极解决Flutter项目运行ios项目报错Without CocoaPods, plugins will not work on iOS or macOS.

    最近在开发Flutter项目,运行ios环境的时候报错没有CocoaPods,安卓环境可以正常运行,当时一脸懵逼,网上搜索了一下,有给我讲原理的,还有让我安装这插件那插件的,最终把电脑搞得卡死,还没有解决我的问题,其实很多人和我一样只想解决问题,而不是废话一大堆的文章

    2024年01月22日
    浏览(55)
  • Flutter 运行IOS真机,提示无法打开“iproxy”,因为无法验证开发者

    Flutter 运行IOS真机,提示无法打开“iproxy”。如下图: 在终端输入一下命令行 + flutter SDK路径(/Users/xxx/flutter/bin/cache/artifacts/usbmuxd/iproxy)  如:

    2024年02月08日
    浏览(62)
  • Flutter开发- iOS 问题CocoaPods not installed or not in valid state

    解决问题方案: 1、先检查本机CocoaPods是否安装,通过gem list 查看是否安装  打开终端,执行gem list,出现图中的数据即为已安装。未安装看第4 步 2、已经安装了CocoaPods,还出现了图中的提示,你可能已经猜到是 Android studio 出现了问题,但是常规的关闭再打开的方式无法解决

    2024年02月10日
    浏览(55)
  • Flutter iOS 与 flutter 相互通信

    在混合开发中避免不了通信,简单记录一下,Flutter iOS工程与Flutter 之间相互通信。 Flutter 中通过Platform Channel实现Flutter和原生端的数据传递,是怎么进行数据通信,以及怎么配置,下面一一进行详解。 通过Platform channel 将传递的数据以发送消息的形式。 跨线程发送到iOS端和

    2024年02月13日
    浏览(48)
  • Flutter:Android/iOS集成Flutter模块

    一、Android工程集成Flutter模块工程: 1.使用命令创建Flutter模块工程lib_flutter(与Android工程属于同级目录): 2.更新Android工程配置: (1)将Android工程Support V4/V7包替换为AndroidX包,右键点击工程,在弹出菜单中选择 Refactor   Migrate to AndroidX...,然后在左下角弹出的框中,点击Do Refac

    2024年02月06日
    浏览(43)
  • Flutter iOS 集成使用 flutter boost

    在 Flutter项目中集成完 flutter boost,并且已经使用了 flutter boost进行了路由管理,这时如果需要和iOS混合开发,这时就要到 原生端进行集成。 注意:之前建的项目必须是 Flutter module 项目,并且原生项目和flutter module项目在同一个文件夹下面 下面是原生端集成 flutter boost的步骤

    2024年02月13日
    浏览(34)
  • Flutter打包iOS

    1.使用Xcode打开flutter项目 双击这个文件 2、确认项目Bundle ID和开发者网站一致 参考链接https://blog.csdn.net/qq_34010941/article/details/113771702 IOS证书配置 https://blog.csdn.net/qq_34010941/article/details/113770509 解决iOS 证书不受信任的问题 https://blog.csdn.net/constant_rain/article/details/122314877 参考 htt

    2023年04月15日
    浏览(48)
  • Flutter iOS上架指南

    本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能需要专业技术人员或上架服务商的协助。

    2024年04月10日
    浏览(48)
  • flutter 打包iOS安装包

    flutter iOS Xcode打包并导出ipa文件安装包 1、 Xcode配置 1、 启动打包 1、 等待打包 1、 打包完成、准备导出ipa 1、 选择模式 1、 选择配置文件 1、 导出 1、 选择导出位置 1、 得到ipa podfile文件如下 原来是这样子的,删掉了一部分代码

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包