• 关于

    iOS生命周期

    的搜索结果

回答

动态灵活的客户端能力 作为开发者,您可以借助客户端动态灵活的能力,有效提升开发效率,打造极致的 App 体验: • 3 大研发框架:Native 开发框架、Kylin H5 开发框架、小程序开发框架。 • 20 多个功能性组件,例如网关服务、埋点分析、热修复、用户反馈、消息推送、离线包等。 • 100 多个 UI 控件,包括 AntUI 和 AntMobile。 坚实的移动中台 覆盖 App 全生命周期,提供强大的支撑,确保客户端稳定、高效运行,并进行快速变更和创新。 面向未来的研发方式:小程序 实现开发一次多端投放,实现更流畅的用户体验。同时,全面开放支付宝能力,快速构建新业务、新生态。 开发框架 Android 开发框架 mPaaS Android 开发框架基于 OSGi 规范,把一个 App 划分成业务独立的 Bundle,并对每个 Bundle 的生命周期和依赖加以管理。Portal 工程则是把所有的 Bundle 打包编译为一个可以运行的 .apk 包。 该框架适用于大团队协同开发全新的 App。mPaaS 框架中包含了组件初始化、埋点等功能,方便您轻松接入 mPaaS 组件。组件对 mPaaS 框架没有强依赖,您也可以单独使用各组件功能。 更多内容,查看 组件化接入方式简介。 iOS 开发框架 mPaaS iOS 框架源自支付宝客户端的开发框架,基于 Framework 的设计思想,将业务隔离成相对独立的模块,并着力追求模块与模块之间高內聚和低耦合。 该框架直接接管应用的生命周期,负责整个应用启动托管、应用生命周期管理、处理与分发 UIApplication 的代理事件、统一管理各业务模块(微应用和服务)等。 更多内容,查看 mPaaS 框架介绍。

LiuWH 2020-03-24 21:53:53 0 浏览量 回答数 0

回答

前端可以外包,后端一般不会外包,毕竟数据库的生命周期很长,而且是不可逆的.你的ios可以继续深入,还是有希望的.

杨冬芳 2019-12-02 02:59:57 0 浏览量 回答数 0

问题

关于iOS [super viewWillappear :antimated]方法作用

爵霸 2019-12-01 20:19:41 1183 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

ios工程在ARC下怎么延长局部变量的生命周期?

杨冬芳 2019-12-01 20:14:19 1091 浏览量 回答数 1

回答

任何一门编程领域的入门,包括iOS原理都相似,大致经历这几个阶段:决定方向,一定要下定决心,不能有动摇。一定要喜欢,说服自己。all in 进去。开始进行枯燥的编程语言学习,这时一定要沉下心,不能有较长时间的间断,间断后前功尽弃。开始进行完整APP的开发,自己做一个简单的app但是一定是完整生命周期内的。最好先临摹,再独立敲下来发表自己的作品、学习历程、自己的见解找一份match的工作,工作经历会是你成长最快的阶段,工作时不要抱怨,享受修复bug、实现功能的过程。订阅微博、知乎、公众号,利用业余时间。

stevechen1010 2019-12-02 01:20:53 0 浏览量 回答数 0

问题

objective-c对内存管理的疑问

a123456678 2019-12-01 20:27:07 778 浏览量 回答数 1

回答

使用swift新建一个ios工程,工程里面主要创建了几个文件,其实这几个文件在之前学OC的时候也简单知道了一些,但是在这里要系统的学习Swift了,所以还是要仔细再看看。 AppDelegate.swift // 导入iOS中所有控件的库文件UIKit import UIKit // 调用了OC中的UIApplicationMain函数,它是iOS应用程序的入口,它会创建了一个UIApplication对象, // 代表当前应用程序.作用是用来检测当前应用程序状态的改变,还会创建一个遵守UIApplicationDelegate的协议的子类对象作为UIApplication的代理, // 作用是处理应用程序状态的改变(创建AppDelegate对象并且设置为UIApplication对象的代理) @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { // 类似Android中的PhoneWindow窗口 var window: UIWindow? // 应用程序启动成功后,会自动调用到该方法 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. // 在这个方法中搭建应用程序界面、获取数据然后再展现,如果不在该方法中创建window, //那么程序会通过Main.storyboard去创建应用程序界面 return true } // 将要变成非活跃状态时的回调(不可见),理解成Android中activity的生命周期 func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } // 后台时调用 func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } // 进入前台时 func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } // 变成活跃状态 func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } // 应用程序将要终止 func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } } ViewController.swift import UIKit class ViewController: UIViewController { // 程序加载完成后的逻辑处理 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } } Main.storyboard 类似Android中的xml文件等,可以写布局 Assets.xcassets 放图片等资源 LaunchScreen.storyboard 启动页面

刘刚_ 2020-05-15 16:12:06 0 浏览量 回答数 0

问题

SDK: -(void)setAuthCurrentTime ; 这个接口怎么使用?

猫饭先生 2019-12-01 21:51:48 633 浏览量 回答数 0

回答

Hi, 楼主, 我是极光推送 Javen。  坦率地说,我们设计 JPush SDK stopPush 功能时,还真没有太考虑一个应用想要:退出时要杀死自己的情况。 因为,这不是一个好的实践,很明显是违反 Android/iOS 操作系统的设计的。智能手机 OS 设计的一个基本概念就是:App 的生命周期 OS 自己来管理。 一个应用退出后,进程是否立即退出,应该是 OS 层面来统一管理维护的。 如果你的 App 有 Servcie 长驻,的确整个进程被杀死(以释放必要的资源)的概率会小些。 JPush 提供 Push Service,大多数时候的应用场景是:应用在未使用时也能够收到消息。所以默认是 Service 长驻后台的。 JPush 提供 stopPush 方法,为有特殊需要的应用场景提供方便,PushService 不会长驻内存。   但为了维护完整性,JPush service 还是会被触发短期运行。 ######不过发现会出现一个特别小概率的事件... 用户退出——请求清空别名——用户登陆——设置别名——清空别名超时再次尝试——设置别名成功——清空别名成功...######谢谢你的回答~发问题的时候才初学Android几个月...对APP的生命周期还不是很理解,特别是带后台常驻进程的...见笑了... 现在我采用清空别名的方式,让用户退出之后只会收到appkey级的推送。######Activity都finish掉,自己的Service都stopSelf掉,其他的就别管了,本来Google就不希望大家手动去结束一个APP######主要是这个极光推送的PushService,无法控制...官方提问,也是草草的给出答案JPushInterface.stopPush(this),所以我做的最坏打算也是这样的...不管了...再加个持久层属性,是否已手动退出,围绕它做判断了...但是感觉这是不是弯路呢....######额。关注一下,顺便咨询一下用JPUSH的感受,开发难度和调试成本如何,支持多少用户######还不错,推送及时率不错(看网络环境 - -),整合也很简单,自定义消息扩展性非常大...需求要求不高的话是个很好的选择。######调用 JPushInterface.stopPush 之后服务会停止,但是服务在几分钟后会启动同步一下客户端SDK的状态,同步之后服务就不再启动了。所以stopPush是可以停止极关推送的服务的。###### 作为一个普通用户,十分反感国产手机应用退出后,还驻留一堆服务在内存里面。 于是我用Autostarts(自启管理)禁用了所有程序的自启意图。 每次应用退出后,都手动去“应用-正在运行”里面手动关闭所有服务。 可即便是这样,还是会有一堆垃圾服务不知何时就偷偷冒出来,占用大量的内存、CPU和网络流量。 哎,android上的流氓太多,等有钱还是换一个iphone吧。。。 ######其实一样的,只是 IOS 统一管理了 后台推送服务,google对于Android推送也有GCM,只是你懂的,国内无法稳定使用,没办法呀...

kun坤 2020-06-15 10:45:53 0 浏览量 回答数 0

回答

Hi, 楼主, 我是极光推送 Javen。  坦率地说,我们设计 JPush SDK stopPush 功能时,还真没有太考虑一个应用想要:退出时要杀死自己的情况。 因为,这不是一个好的实践,很明显是违反 Android/iOS 操作系统的设计的。智能手机 OS 设计的一个基本概念就是:App 的生命周期 OS 自己来管理。 一个应用退出后,进程是否立即退出,应该是 OS 层面来统一管理维护的。 如果你的 App 有 Servcie 长驻,的确整个进程被杀死(以释放必要的资源)的概率会小些。 JPush 提供 Push Service,大多数时候的应用场景是:应用在未使用时也能够收到消息。所以默认是 Service 长驻后台的。 JPush 提供 stopPush 方法,为有特殊需要的应用场景提供方便,PushService 不会长驻内存。   但为了维护完整性,JPush service 还是会被触发短期运行。 ######不过发现会出现一个特别小概率的事件... 用户退出——请求清空别名——用户登陆——设置别名——清空别名超时再次尝试——设置别名成功——清空别名成功...######谢谢你的回答~发问题的时候才初学Android几个月...对APP的生命周期还不是很理解,特别是带后台常驻进程的...见笑了... 现在我采用清空别名的方式,让用户退出之后只会收到appkey级的推送。######Activity都finish掉,自己的Service都stopSelf掉,其他的就别管了,本来Google就不希望大家手动去结束一个APP######主要是这个极光推送的PushService,无法控制...官方提问,也是草草的给出答案JPushInterface.stopPush(this),所以我做的最坏打算也是这样的...不管了...再加个持久层属性,是否已手动退出,围绕它做判断了...但是感觉这是不是弯路呢....######额。关注一下,顺便咨询一下用JPUSH的感受,开发难度和调试成本如何,支持多少用户######还不错,推送及时率不错(看网络环境 - -),整合也很简单,自定义消息扩展性非常大...需求要求不高的话是个很好的选择。######调用 JPushInterface.stopPush 之后服务会停止,但是服务在几分钟后会启动同步一下客户端SDK的状态,同步之后服务就不再启动了。所以stopPush是可以停止极关推送的服务的。###### 作为一个普通用户,十分反感国产手机应用退出后,还驻留一堆服务在内存里面。 于是我用Autostarts(自启管理)禁用了所有程序的自启意图。 每次应用退出后,都手动去“应用-正在运行”里面手动关闭所有服务。 可即便是这样,还是会有一堆垃圾服务不知何时就偷偷冒出来,占用大量的内存、CPU和网络流量。 哎,android上的流氓太多,等有钱还是换一个iphone吧。。。 ######其实一样的,只是 IOS 统一管理了 后台推送服务,google对于Android推送也有GCM,只是你懂的,国内无法稳定使用,没办法呀...

kun坤 2020-06-02 17:32:38 0 浏览量 回答数 0

回答

浅谈Flutter框架原理及其生态圈 Flutter的锋芒 跨平台高性能的渲染引擎逐渐成为移动端、大前端领域的一个热点,作为其中的明星框架Flutter,经过近几年来的迅速发展,由极大的可能成为下一代跨端终端解决方案。自从2017 年 5 月,谷歌公司发布的了 Alpha 版本的 Flutter; 2018 年底 Flutter Live 发布的 1.0 版本;2019年7月发布1.5版本,截止今日(2020年2月)已经发布了v1.14.6 Beta版本。 在Flutter诞生之前,已经有许多跨平台UI框架的方案如Cordova、ReactNative、weex、uni-app、Hippy等,常见的需要处理兼容的终端平台也包括android、ios、web、Iot等,但是在大前端的浪潮下,对于企业和开发者来说开发效率和使用体验都十分重要,传统的做法莫过于分不同的团队开发不同的终端项目,如果还要继续向其他平台,拓展的话,我们需要付出的成本和时间将成倍增长。正因为如此,在这样的背景下,Flutter等跨端框架的兴起,从本质上讲,帮助开发者增加业务代码的复用率,减少因为要适配多个平台带来的工作量,从而降低开发成本、提高开发效率。 纵观已有的跨端方案,可以分为三类:Web 容器、泛 Web 容器、自绘引擎框架。 基于web容器即基于浏览器的跨平台也做得越来越好,自然管线也越来越短,与native的一些技术手段来实现性能上的相互补充。比如Egret、Cocos、Laya这些游戏引擎,它们在跨平台方面的做法多以Typescript编写,在iOS和安卓平台的各种浏览器中轻松的运行HTML5游戏,并在不同平台浏览器里提供近乎一致的用户体验,比如Egret还会提供高效的 JS-C Binding 编译机制,以满足游戏编译为原生格式的需求,不过大多数HTML游戏引擎也属于web容器这个范畴内。web容器框架也有一个明显的致命(在对体验&性能有较高要求的情况下)的缺点,那就是WebView的渲染效率和JavaScript执行性能太差。再加上Android各个系统版本和设备厂商的定制,很难保证所在所有设备上都能提供一致的体验。 泛 Web 容器框架比如ReactNative和Weex,即上层通过面向前端友好的UI,下层通过native的渲染形式,虽然同样使用类HTML+JS的UI构建逻辑,但是最终会生成对应的自定义原生控件,以充分利用原生控件相对于WebView的较高的绘制效率,同时H5与native相互补充来达到更好的用户体验,这也是一种很好的解决方案。缺陷也很明显,随着系统版本变化和API的变化,开发者可能也需要处理不同平台的差异,甚至有些特性只能在部分平台上实现,这样框架的跨平台特性就会大打折扣。 自绘引擎框架这里专指Flutter框架,从底层就承担跨端的任务和渲染方式,从目前来看,从技术的实现和方案的成熟度、产品的性能方面比较,Flutter有很大可能成为下一代主流跨平台框架。 Flutter与其他跨端框架的不同点之一就是自带渲染引擎,Flutter渲染引擎依靠跨平台的Skia图形库来实现,Skia引擎会将使用Dart语言构建的抽象的视图结构数据加工成GPU数据,交由 OpenGL 最终提供给 GPU 渲染,至此完成渲染闭环,因此可以在最大程度上保证一款应用在不同平台、不同设备上的体验一致性。 而开发语言选用的是同时支持 JIT和 AOT的 Dart语言,Dart本身提供了三种运行方式,应对web环境,用Dart2js编译成JavaScript代码,运行在常规浏览器中;使用DartVM直接在命令行中运行Dart代码;AOT方式编译成机器码,例如Flutter App框架。而且Dart 避免了抢占式调度和共享内存,可以在没有锁的情况下进行对象分配和垃圾回收,在性能方面表现相当不错,不仅保证了开发效率,代码性能和用户体验也更卓越。因此,Flutter在各类跨平台移动开发方案中脱颖而出。同时在去年2019的Google IO大会上,备受关注的Fuchsia系统虽然并没有发布,但是宣布了 Flutter除了支持开发 Android 和 iOS 程序之外,现在还支持开发Web程序了,在 I/O 大会上,谷歌发布了 Web 版 Flutter 的首个技术预览版,宣布 Flutter 将为包括 Google Home Hub 在内的 Google Smart Display 平台提供技术支持,并迈出利用 Chrome 操作系统支持桌面级应用的第一步。 很多JS开发者会思考Google Flutter团队至于为啥选择Dart而不是JS,其实Google 公司给出的原因很简单也很直接:Dart 语言开发组就在隔壁,对于 Flutter 需要的一些语言新特性,能够快速在语法层面落地实现;而如果选择了 JavaScript,就必须经过各种委员会(TC39等)和浏览器提供商漫长的决议。 Flutter绘制原理 在计算机系统中,图像的显示需要 CPU、GPU 和显示器一起配合完成:CPU 负责图像数据计算,GPU 负责图像数据渲染,而显示器则负责最终图像显示。 CPU 把计算好的、需要显示的内容交给 GPU,由 GPU 完成渲染后放入帧缓冲区,随后视频控制器根据垂直同步信号(VSync)以每秒 60 次的速度,从帧缓冲区读取帧数据交由显示器完成图像显示。 操作系统在呈现图像时遵循了这种机制,而 Flutter 作为跨平台开发框架也采用了这种底层方案。下面有一张更为详尽的示意图来解释 Flutter 的绘制原理。可以看到,Flutter 关注如何尽可能快地在两个硬件时钟的 VSync 信号之间计算并合成视图数据,然后通过 Skia 交给 GPU 渲染:UI 线程使用 Dart 来构建视图结构数据,这些数据会在 GPU 线程进行图层合成,随后交给 Skia 引擎加工成 GPU 数据,而这些数据会通过 OpenGL 最终提供给 GPU 渲染。 Skia原理 Skia 是一款用由C++ 开发的2D 图像绘制引擎。在2005 年被 Google 公司收购后被广泛应用在 Android和其他等核心产品上,Skia 目前是Android 官方的图像渲染引擎,因此 Flutter Android SDK 无需内嵌 Skia 引擎就可以获得天然的 Skia 支持;而对于 iOS 平台来说,由于 Skia 是跨平台的,因此它作为 Flutter iOS 渲染引擎被嵌入到 Flutter 的 iOS SDK 中,替代了 iOS 闭源的 Core Graphics/Core Animation/Core Text,这也正是 Flutter iOS SDK 打包的 App 包体积比 Android 要大一些的原因。 底层渲染能力统一了,上层开发接口和功能体验也就随即统一了,开发者再也不用操心平台相关的渲染特性了。也就是说,Skia 保证了同一套代码调用在 Android 和 iOS 平台上的渲染效果是完全一致的。 Flutter架构 Framework底层是Flutter引擎,引擎主要负责图形绘制(Skia)、文字排版(libtxt)和提供Dart运行时,引擎全部使用C++实现,Framework层使我们可以用Dart语言调用引擎的强大能力。Flutter 架构采用分层设计,从下到上分为三层,依次为:Embedder、Engine、Framework。 Embedder 是操作系统适配层,实现了渲染 Surface 设置,线程设置,以及平台插件等平台相关特性的适配。从这里我们可以看到,Flutter 平台相关特性并不多,这就使得从框架层面保持跨端一致性的成本相对较低。 Engine 层主要包含 Skia、Dart 和 Text,实现了 Flutter 的渲染引擎、文字排版、事件处理和 Dart 运行时等功能。Skia 和 Text 为上层接口提供了调用底层渲染和排版的能力,Dart 则为 Flutter 提供了运行时调用 Dart 和渲染引擎的能力。而 Engine 层的作用,则是将它们组合起来,从它们生成的数据中实现视图渲染。 Framework 层则是一个用 Dart 实现的 UI SDK,包含了动画、图形绘制和手势识别等功能。为了在绘制控件等固定样式的图形时提供更直观、更方便的接口,Flutter 还基于这些基础能力,根据 Material 和 Cupertino 两种视觉设计风格封装了一套 UI 组件库,开发者可以直接使用这些组件库。 Flutter运行流程 页面中的各界面元素(Widget)以树的形式组织,即控件树。Flutter 通过控件树中的每个控件创建不同类型的渲染对象,组成渲染对象树。在Flutter界面渲染过程分为三个阶段:布局、绘制、合成,布局和绘制在Flutter框架中完成,合成则交由引擎负责。 Flutter 采用深度优先机制遍历渲染对象树,决定渲染对象树中各渲染对象在屏幕上的位置和尺寸。在布局过程中,渲染对象树中的每个渲染对象都会接收父对象的布局约束参数,决定自己的大小,然后父对象按照控件逻辑决定各个子对象的位置,最终完成布局过程。这里只需要注意一点,无论布局还是绘制,都是父子间的遍历关系:父Widget的布局需要依赖子Widget的布局结果;而绘制则反过来(子Widget需要盖在父Widget上),布局是后续遍历,绘制是前序遍历,他们都是深度优先遍历。 Flutter生命周期 可以看到,Flutter中State 的生命周期可以分为 3 个阶段:创建(插入视图树)、更新(在视图树中存在)、销毁(从视图树中移除)。接下来,我们一起看看每一个阶段的具体流程。 第一步创建 State 初始化时会依次执行 :构造方法 -> initState -> didChangeDependencies -> build,随后完成页面渲染。构造方法是 State 生命周期的起点,Flutter 会通过调用StatefulWidget.createState() 来创建一个 State。我们可以通过构造方法,来接收父 Widget 传递的初始化 UI 配置数据。这些配置数据,决定了 Widget 最初的呈现效果。 initState,会在 State 对象被插入视图树的时候调用。这个函数在 State 的生命周期中只会被调用一次,所以我们可以在这里做一些初始化工作,比如为状态变量设定默认值。 didChangeDependencies 则用来专门处理 State 对象依赖关系变化,会在 initState() 调用结束后,被 Flutter 调用。 build,作用是构建视图。经过以上步骤,Framework 认为 State 已经准备好了,于是调用 build。我们需要在这个函数中,根据父 Widget 传递过来的初始化配置数据,以及 State 的当前状态,创建一个 Widget 然后返回。 第二步更新 Widget 的状态更新,主要由个方法触发:setState、didchangeDependencies、didUpdateWidget。 setState:我们最熟悉的方法之一。当状态数据发生变化时,我们总是通过调用这个方法告诉 Flutter:“我这儿的数据变啦,请使用更新后的数据重建 UI!” didChangeDependencies:State 对象的依赖关系发生变化后,Flutter 会回调这个方法,随后触发组件构建。哪些情况下 State 对象的依赖关系会发生变化呢?典型的场景是,系统语言 Locale 或应用主题改变时,系统会通知 State 执行 didChangeDependencies 回调方法。 didUpdateWidget:当 Widget 的配置发生变化时,比如,父 Widget 触发重建(即父 Widget 的状态发生变化时),热重载时,系统会调用这个函数。一旦这三个方法被调用,Flutter 随后就会销毁老 Widget,并调用 build 方法重建 Widget。 第三步销毁 比如组件被移除,或是页面销毁的时候,系统会调用 deactivate 和 dispose 这两个方法,来移除或销毁组件。 Flutter生态圈及其常用框架 一项技术一个框架是否流行,最直观的体现就是它的生态圈是否活跃,下面列举了一些Flutter开发中常用的库工具。 参考文献 1、[Flutter原理与实践](https://tech.meituan.com/2018/08/09/waimai-flutter-practice.html) 少杰 2、[Flutter框架技术概览](https://flutter.dev/docs/resources/technical-overview) 3、[Flutter中文官网](https://pub.dartlang.org/flutter/) 4、[Flutter插件仓库](https://pub.dev/flutter/packages)

罗思雨 2020-02-27 11:47:50 0 浏览量 回答数 0

回答

Flutter开发框架总结 跨平台高性能的渲染引擎逐渐成为移动端、大前端领域的一个热点,作为其中的明星框架Flutter,经过近几年来的迅速发展,由极大的可能成为下一代跨终端解决方案。自从2017年5月,谷歌公司发布了alpha版本的Flutter;2018年底Flutter Live发布的1.0版本;2019年7月发布1.5版本,截至今日(2020年2月)已经发布了v1.14.6Beta版本。 Flutter背景 + 发展历程 首先在写Flutter之前我们要了解什么是原生开发什么是跨平台技术: 原生开发     是指在某一个平台所特有的应用,使用该平台所支持的开发工具和语言,并直接调用系统SDK,比如android上使用java 和ios上使用OC来开发, 这样做的好处 是可以使用平台上全部功能、速度快 性能好,用户体验好。 但是 缺点也很明显,开发不同平台需要维护的成本增加,动态化弱,更新时需要发布版本。 跨平台技术     针对原生开发所遇到的问题,人们已经研究出现有的跨平台技术方案:H5+原生、Js开发加原生渲染(例如React Native、weex等)、自绘UI加原生(QT fro mobile,Flutter) 发展历程     2011年谷歌推出一款可以在移动端,web,服务器等领域的语言—dart,其本质目的是为了取代现在的js的web。 1. 2014年谷歌在github开源了Sky 这便是Flutter的前身 2. 2015-10 Sky改名为Flutter 3. 2017-5 谷歌正式向外界公布Flutter 4. 2018-12 谷歌发布Flutter Live的1.0版本 5. 2019-2 Flutter1.2发布主要是增加对web的支持     Flutter提供了丰富的组件、接口,开发者可以很快地为 Flutter添加 native扩展。同时 Flutter还使用 Native引擎渲染视图,这无疑能为用户提供良好的体验 Flutter架构     Flutter既没有采用Webview也没有采用操作系统的原生控件,相反Flutter使用自己的高性能渲染引擎来绘制widget,这样不仅可以保证UI和原生的一致性,也可以降低维护成本。     Flutter使用Skia作为其2D渲染引擎,Skia是谷歌的一个2D图形处理函数库。     Flutter 采用Dart语言进性开发。Dart在即时编译模式下速度与JavaScript基本持平,但是Dart支持AOT(Ahead-Of-Time - 预先编译),如果以AOT模式运行时js便远追不上了。 为什么Flutter语言采用Dart而不是JavaScript,我们需要做一个对比 1. 开发效率 Dart运行时和编译器支持Flutter的两个关键特性的组合—“基于JIT的快速开发周期”、“基于AOT的发布包” 2. 高性能 Flutter为了实现流畅高保真的UI体验,需要能够在每个动画帧中运行大量的代码,这就需要一种既能提供高性能的语言,又不会出现丢帧,在这一点上Dart更好 3. 快速分配内存 Flutter框架使用函数式流,这使得它很依赖于底层的内存分配器。事实上Dart开发团队许多来自chrome,chrome V8的js引擎在内存分配上也做得非常好,而Dart也正好满足 4. 类型安全 Dart是类型安全语言,支持静态类型检测,js是弱类型语言,这是Dart的一个重要优势 言归正传,下图是Flutter官方提供的一个架构图 引擎刚刚已经介绍过了,我们现在来看看Flutter框架的结构:     由下到上     Foundation、Animation、Painting、Gestutes 这些在Google的一些视频中合称为Dart ui层,对应的是Flutter中的dart:ui包,他是底层ui库,提供动画、手势以及绘制能力。     Rendering层为一个抽象的布局层,它依赖于ui层,这类似于react中的虚拟dom树,该层可以说是Flutter框架最核心的部分,它除了确定每个元素的位置、大小还要进性坐标变换、绘制。     Widgets层是一套基础组件库,在基础组件之上还提供了Material和Cupertino两种视觉风格组件库,大多数我们只是使用这两层。 Flutter运行流程 渲染流程     当需要更新UI的时候,Framework通知Engine,Engine会等到下个Vsync信号到达的时候,会通知Framework,然后Framework会进行animations, build,layout,compositing,paint,最后生成layer提交给Engine。Engine会把layer进行组合,生成纹理,最后通过Open Gl接口提交数据给GPU, GPU经过处理后在显示器上面显示。 启动流程     此图为flutter在安卓下启动的流程,在安卓中默认启动的Activity是MainActivity,而MainActivity继承的是Flutter Activity。     FlutterActivity是继承Activity和实现了PluginRegistry。分析一下onCreate,onStop,onDestroy这些生命周期方法被FlutterActivity.eventDelegate代理了,这个时候我们明白了,FlutterActivity就是一个空壳,真正实现是代理类FlutterActivityDelegate。说白了就是创建一个FlutterView,并且把view显示到屏幕上。 Flutter生命周期     Flutter和安卓、ios应用一样拥有自己的生命周期,对比来看,安卓中是Activity,ios中是ViewController。Flutter中为Widget createState(): 当框架构建StatefulWidget时,会立即调用createState();initState(): 创建窗口小部件时,调用的第一个方法,子类化State可以重写initState,用来完成仅需要执行一次的工作。didChangeDependencies(): 在执行完initState之后调用此方法。build(): 在执行完didChangeDependencies() 之后立即调用,所有的GUI都会在这里渲染,并且每次渲染UI时都会调用它。didUpdateWidget(): 父级窗口小部件进行更改并需要重新绘制UI时,会调用此方法setState(): 此方法用于通知框架数据已更改。dispose(): 销毁方法,移除State对象时调用,应该在此方法中取消一些订阅、动画、流等。 Flutter生态圈及其常用框架 DIO Dio是flutter中文网开源的一个强大的Dart Http请求库,支持Restful Api、FormData、拦截器、请求取消、Cookie、文件上传下载、超时等。 Flukit flukit即Flutter UI Kit,一个常用的Widget库,包括下拉刷新、轮播图、快速滚动条、渐变进度条、城市选择器等. CookieJar 一个实现HTTP协议标准Cookie管理策略的Cookie管理器,他可以自动帮您自动管理http请求cookie,并支持本地持久化。 flutter-go 阿里巴巴开源的flutter 开发者帮助 APP,包含 flutter 常用 140+ 组件的demo 演示与中文文档 https://flutter-go.pub/website/ Best-Flutter-UI-Templates Github地址:https://github.com/mitesh77/Best-Flutter-UI-Templates ,有许多内置ui模板。 欢迎大家有问题随时和我分享哦~初次在开发者社区码字,若有不足之处,请指教,您的每一次留言都是我前进的动力。愿大家在疫情期间共同进步,共创美好的开发者社区。

kun坤 2020-03-02 17:00:55 0 浏览量 回答数 0

问题

什么是PCDN SDK iOS版手册

云栖大讲堂 2019-12-01 21:19:09 2651 浏览量 回答数 0

回答

iOS的推送是由服务端下发的,直接系统弹出的,所以不支持修改样式 但我们最新的beta版本会提供客户端发消息时定制 推送文案的功能 http://baichuan.taobao.com/doc2/detail.htm?spm=0.0.0.0.D3LiyP&treeId=41&articleId=102828&docType=1 相关接口: 1、监听消息发送的回调 - (void)addMessageLifeDelegate:(id<YWMessageLifeDelegate>)aDelegate forPriority:(YWBlockPriority)aPriority; 2、在回调里面,根据消息内容,判断是否需要修改推送文案,如果需要修改,则修改controlParameters。详细请查看YWConversationServiceDef.h中的定义 - (YWMessageLifeContext *)messageLifeWillSend:(YWMessageLifeContext *)aContext{    YWMessageLifeContext *resultContext = aContext;    NSLog(@"消息生命周期回调,即将发送消息: msgBody:%@ \t convId:%@", aContext.messageBody, aContext.conversation.conversationId);        if ([[TestConfigDef sharedInstance] configStateOfKey:kWXOMessageControl]) {        /// 开启消息控制        NSString *controlContent = [[TestConfigDef sharedInstance] configContentOfKey:kWXOMessageControl];        NSDictionary *params = nil;        NSError *error = nil;        @try {            params = [NSJSONSerialization JSONObjectWithData:[controlContent dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];        }        @catch (NSException *exception) {            NSLog(@"消息控制:json解析失败: %@", error);        }        if ([params isKindOfClass:[NSDictionary class]] && params.count > 0) {            NSLog(@"消息控制: %@", params);            [resultContext setControlParameters:params];        }    }    return resultContext;}

贾逵 2019-12-02 01:37:09 0 浏览量 回答数 0

回答

小程序项目通过编译之后,自动在模拟器中运行,无需真机即可快速预览。基础互 动方式是通过鼠标点击、拖拽来模拟手指触摸、拖动操作。 在默认设置下,每次保存已变更代码时都会触发模拟器自动刷新,实现准实时预览 效果。关闭自动刷新的方法:取消勾选模拟器右下角 自动更新。 模拟器布局 模拟器顶部各项功能(从左至右):  设备尺寸:选择预设的 iOS 或安卓设备尺寸,或者新建自定义的设备尺寸,用于测试适配 性。  缩放比例:控制小程序的显示缩放比例。  刷新:重新编译代码并刷新模拟器。  小工具:打开/关闭模拟器的小工具菜单。  模拟器日志:在编辑器打开模拟器日志窗口。  独立窗口:改用独立窗口方式显示模拟器。 在独立窗口模式下,界面新增 窗口置顶 按钮;独立窗口 变为 合并窗口 按钮。 模拟器底部三项功能:  页面路径:显示当前页面路径。点击路径,可直接打开当前页面 js 文件。  页面参数:显示当前页面收到的参数。点击参数,可快速复制至剪贴板。  自动刷新:如需避免频繁刷新,可取消勾选此功能。 说明:点击 ^ 可以切换显示 页面路径 或 页面参数。 模拟器小工具 点击图中蓝色小工具图标,显示/隐藏更多模拟功能: 首页:模拟按下 Home 键,小程序退回后台。用于测试生命周期函数 onShow 与 onHide,参见 小程序运行机制。 定位:输入设置 经纬度 模拟信息,用于测试 my.getLocation 获取用户位置端 口(经纬度模拟信息需要输入浮点数,精确至 1 位小数以上)。 扫码:输入设置 扫码返回数据 模拟信息,用于测试 my.scan 扫一扫端口。 摇一摇:模拟摇一摇动作,用于测试 my.watchShake 摇一摇端口。 授权:设置 用户信息、地理位置、相册、相机、麦克风 模拟权限,可用于测试 my.getLocation、my.chooseImage 等端口的权限请求步骤(在已获得用户信 息授权时,还提供删除用户信息授权的选项)。 裁剪:模拟用户截屏情况,用于测试 my.onUserCaptureScreen 截屏事件监听 端口。 内存警告:模拟内存不足情况,用于测试 my.onMemoryWarning 内存警告监听 端口。 mtop 环境切换:可进行环境切换,切换为 日常、预发、线上。 内容来源:https://developer.aliyun.com/article/756818?spm=a2c6h.12873581.0.dArticle756818.26162b70Su1GZy&groupCode=tech_library

KaFei 2020-04-27 13:48:44 0 浏览量 回答数 0

回答

概述 App() 代表顶层应用,管理所有页面和全局数据,以及提供生命周期回调等。它 也是一个构造方法,生成 App 实例。 一个小程序就是一个 App 实例。 每个小程序顶层一般包含三个文件。  app.json:应用配置  app.js:应用逻辑  app.acss:应用样式(可选) 简单示例 一个简单的 app.json 代码如下: "pages": [ "pages/index/index", "pages/logs/logs" ], "window": { "defaultTitle": "Demo" } } 这段代码配置指定小程序包含两个页面(index 和 logs),以及应用窗口的默认 标题设置为 “Demo”。 一个简单的 app.js 代码如下: onLaunch(options) { // 第一次打开 }, onShow(options) { // 小程序启动,或从后台被重新打开 }, onHide() { // 小程序从前台进入后台 }, onError(msg) { // 小程序发生脚本错误或 API 调用出现报错 console.log(msg); }, globalData: { // 全局数据 name: 'alipay', }, }); 26 app.json 全局配置 app.json 用于对小程序进行全局配置,设置页面文件的路径、窗口表现、多 tab 等。 以下是一个基本配置示例: "pages": [ "pages/index/index", "pages/logs/index" ], "window": { "defaultTitle": "Demo" } } 完整配置项如下: 属性 类型 是否必填 描述 pages Array 是 设置页面路径 window Object 否 设置默认页面的窗 口表现 tabBar Object 否 设置底部 tabbar 的表现 pages app.json 中的 pages 为数组属性,数组中每一项都是字符串,用于指定小程序 的页面。在小程序中新增或删除页面,都需要对 pages 数组进行修改。 pages 数组的每一项代表对应页面的路径信息,其中,第一项代表小程序的首 页。 页面路径不需要写任何后缀,框架会自动去加载同名的 .json、.js、.axml、.acss 文件。举例来说,如果开发目录为: │ ├──index │ │ ├── index.json │ │ ├── index.js │ │ ├── index.axml │ │ └── index.acss │ ├──logs │ │ ├── logs.json │ │ ├── logs.js │ │ └── logs.axml ├── app.json ├── app.js └── app.acss app.json 中应当如下配置: { "pages":[ "pages/index/index", "pages/logs/logs" ] } window window 用于设置小程序的状态栏、导航条、标题、窗口背景色等。 示例代码: { "window":{ "defaultTitle": "支付宝接口功能演示" } } 属性 类型 是否必 填 描述 最低版本 defaultTitle String 否 页面默认标题 - pullRefresh String 否 是否允许下拉刷新。默认 NO, 备注:下拉刷新生效的 前提是 allowsBounceVertical 值 为 YES allowsBounceV ertical String 否 是否允许向下拉拽。默认 YES, 支持 YES / NO 28 transparentTitl e String 否 导航栏透明设置。默认 none,支持 always 一直透 明 / auto 滑动自适应 / none 不透明 titlePenetrate String 否 是否允许导航栏点击穿透。 默认 NO,支持 YES / NO showTitleLoadi ng String 否 是否进入时显示导航栏的 loading。默认 NO,支持 YES / NO titleImage String 否 导航栏图片地址 - titleBarColor HexCol or 否 导航栏背景色,十六进制颜 色值(0-255) - backgroundCol or HexCol or 否 页面的背景色,十六进制颜 色值(0-255) - backgroundIm ageColor HexCol or 否 下拉露出显示的背景图底 色,十六进制颜色值(0- 255) - backgroundIm ageUrl String 否 下拉露出显示的背景图链接 - gestureBack String 否 iOS 用,是否支持手势返 回。默认 NO,支持 YES / NO enableScrollBa r Boolea n 否 Android 用,是否显示 WebView 滚动条。默认 YES,支持 YES / NO onReachBotto mDistance Number 否 页面上拉触底时触发时距离 页面底部的距离,单位为 px。相关文档页面事件处理 函数 1.19.0 ,目前 iOS 在 page.json 下设 置无效,只能全 局设置。 29 tabBar 如果你的小程序是一个多 tab 应用(客户端窗口的底部栏可以切换页面),那么 可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页 面。 注意:  通过页面跳转(my.navigateTo)或者页面重定向(my.redirectTo)所到达的页面,即使 它是定义在 tabBar 配置中的页面,也不会显示底部的 tab 栏。  tabBar 的第一个页面必须是首页。 tabBar 配置项有以下: 属性 类型 是否必填 描述 textColor HexColor 否 文字颜色 selectedColor HexColor 否 选中文字颜色 backgroundColor HexColor 否 背景色 items Array 是 每个 tab 配置 每个 item 配置: 属性 类型 是否必填 描述 pagePath String 是 设置页面路径 name String 是 名称 icon String 否 平常图标路径 activeIcon String 否 高亮图标路径 icon 图标推荐大小为 60×60 px 大小,系统会对传入的非推荐尺寸的图片进行非 等比拉伸或缩放。 示例代码: "tabBar": { 30 "textColor": "#dddddd", "selectedColor": "#49a9ee", "backgroundColor": "#ffffff", "items": [ { "pagePath": "pages/index/index", "name": "首页" }, { "pagePath": "pages/logs/logs", "name": "日志" } ] } } app.acss 全局样式 app.acss 作为全局样式,作用于当前小程序的所有页面。 ACSS 是一套样式语言,用于描述 AXML 的组件样式,决定 AXML 的组件的显 示效果。 为适应广大前端开发者,ACSS 和 CSS 规则完全一致,100% 可以用。同时为更 适合开发小程序,对 CSS 进行了扩充。 ACSS 支持 px,rpx,vh,vw 等单位。 rpx rpx(responsive pixel)可以根据屏幕宽度进行自适应,规定屏幕宽为 750rpx。以 Apple iPhone6 为例,屏幕宽度为 375px,共有 750 个物理像 素,则 750rpx = 375px = 750 物理像素,1rpx = 0.5px = 1 物理像素。 设备 rpx 换算 px(屏幕宽度 / 750) px 换算 rpx(750 / 屏幕宽 度) iPhone5 1rpx = 0.42px 1px = 2.34rpx iPhone6 1rpx = 0.5px 1px = 2rpx iPhone6 Plus 1rpx = 0.552px 1px = 1.81rpx 样式导入 使用 @import 语句可以导入外联样式表,@import 后需要加上外联样式表相对 路径,用;表示结束。 示例代码: .sm-button { padding: 5px; } /** app.acss **/ @import "./button.acss"; .md-button { padding: 15px; } 导入路径支持从 node_modules 目录载入第三方模块,例如 page.acss: @import "./button.acss"; /相对路径/ 32 @import "/button.acss"; /项目绝对路径/ @import "third-party/page.acss"; /第三方 npm 包路径/ 内联样式 组件上支持使用 style、class 属性来控制样式。 style 属性 用于接收动态样式,样式在运行时会进行解析。行内样式不支持!important 优先 级规则。 class 属性 用于接收静态样式,属性值是样式规则中类选择器名(样式类名)的集合,样式类 名不需要带上.,多个类名间以空格分隔。请静态样式写进 class 中,避免将静态 样式写进 style 中,以免影响渲染速度。 选择器 同 CSS3 保持一致。 注意:  .a-, .am- 开头的类选择器为系统组件占用,不可使用。  不支持属性选择器。 全局样式与局部样式  app.acss 中的样式为全局样式,作用于每一个页面。  页面文件夹内的 .acss 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 app.acss 中相同的选择器。 本地资源引用 ACSS 文件里的本地资源引用请使用绝对路径的方式,不支持相对路径引用。例 如: /* 支持 / background-image: url('/images/ant.png'); / 不支持 */ background-image: url('./images/ant.png'); 33 app.js 注册小程序 App(object: Object) App() 用于注册小程序,接受一个 Object 作为属性,用来配置小程序的生命周 期等。 App() 必须在 app.js 中调用,必须调用且只能调用一次。 object 属性说明 属性 类型 描述 触发时机 onLaunch Function 生命周期回调:监 听小程序初始化 当小程序初始化完 成时触发,全局只 触发一次 onShow Function 生命周期回调:监 听小程序显示 当小程序启动,或 从后台进入前台显 示时触发 onHide Function 生命周期回调:监 听小程序隐藏 当当前页面被隐藏 时触发,例如跳 转、按下设备 Home 键离开 onError Function 监听小程序错误 当小程序发生 js 错误时触发 onShareAppMessage Function 全局分享配置 - 前台/后台定义:  小程序用户点击右上角关闭,或者按下设备 Home 键离开支付宝时,小程序并不会直接销 毁,而是进入后台。  当用户再次进入支付宝或再次打开小程序时,小程序会从后台进入前台。  只有当小程序进入后台 5 分钟后,或占用系统资源过高,才会被真正销毁。 onLaunch(object: Object) 及 onShow(object: Object) object 属性说明: 属性 类型 描述 34 query Object 当前小程序的 query,从启动参数的 query 字段解析而来 scene number 启动小程序的 场景值 path string 当前小程序的页面地址,从启动参数 page 字段解析而来,page 忽略时默认为首页 referrerInfo Object 来源信息 比如,启动小程序的 schema url 如下: alipays://platformapi/startapp?appId=1999&query=number%3D1&page=x%2Fy%2 Fz  小程序首次启动时,onLaunch 方法可获取 query、path 属性值。  小程序在后台被用 schema 打开,也可从 onShow 方法中获取 query、path 属性值。 App({ onLaunch(options) { // 第一次打开 console.log(options.query); // {number:1} console.log(options.path); // x/y/z }, onShow(options) { // 从后台被 schema 重新打开 console.log(options.query); // {number:1} console.log(options.path); // x/y/z }, }); referrerInfo 子属性说明: 属性 类型 描述 最低版本 appId string 来源小程序 - sourceServiceId string 来源插件,当处于插件运行模式时可见 1.11.0 35 extraData Object 来源小程序传过来的数据。 - 注意:  不要在 onShow 中进行 redirectTo 或 navigateTo 等操作页面栈的行为。  不要在 onLaunch 里调用 getCurrentPages(),因为此时 page 还未生成。 onHide() 小程序从前台进入后台时触发 onHide() 。 示例代码: App({ onHide() { // 进入后台时 console.log('app hide'); }, }); onError(error: String) 小程序发生脚本错误时触发。 示例代码: App({ onError(error) { // 小程序执行出错时 console.log(error); }, }); onShareAppMessage(object: Object) 全局分享配置。当页面未设置 page.onShareAppMessage 时,调用分享会执行 全局的分享设置,具体见 分享 。 globalData 全局数据 App() 中可以设置全局数据 globalData。 示例代码: // app.js App({ globalData: 1 }); getApp 方法 小程序提供了全局的 getApp() 方法,可获取当前小程序实例,一般用于在子页 面中获取顶层应用。 var app = getApp(); console.log(app.globalData); // 获取 globalData 使用过程中,请注意以下几点:  App() 函数中不可以调用 getApp(),可使用 this 可以获取当前小程序实例。  通过 getApp() 获取实例后,请勿私自调用生命周期回调函数。  请区分全局变量及页面局部变量,比如: // app.js App({ //定义全局变量 globalData,在整个 App 中有效 globalData: 1 }); // a.js // 定义页面局部变量 localValue,只在 a.js 有效 var localValue = 'a'; // 获取 app 实例 var app = getApp(); // 拿到全局数据,并改变它 app.globalData++; // b.js // 定义页面局部变量 localValue,只在 b.js 有效 var localValue = 'b'; // 如果 a.js 先运行,globalData 会返回 2 console.log(getApp().globalData); a.js 和 b.js 两个文件中都声明了变量 localValue,但并不会互相影响,因为各 个文件声明的局部变量和函数只在当前文件下有效。 内容来源:https://developer.aliyun.com/article/756818?spm=a2c6h.12873581.0.dArticle756818.26162b70Su1GZy&groupCode=tech_library

KaFei 2020-04-27 13:54:36 0 浏览量 回答数 0

问题

日志的发布历史有哪些?

轩墨 2019-12-01 21:50:57 1618 浏览量 回答数 0

问题

阿里巴巴5大移动/前端开源项目你知道几个?

爵霸 2019-12-01 21:56:01 4777 浏览量 回答数 0

问题

阿里巴巴5大移动/前端开源项目你知道几个?

爵霸 2019-12-01 21:55:57 2783 浏览量 回答数 0

问题

软件测试的新趋势

技术小菜鸟 2019-12-01 21:47:02 6244 浏览量 回答数 1

问题

HTTPDNS域名解析场景下如何使用Cookie?(2)

猫饭先生 2019-12-01 21:50:03 1294 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站