当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS开发高级分享 - iOS 13 中的新框架 — MetriKit

iOS开发高级分享 - iOS 13 中的新框架 — MetriKit

2019年10月24日  | 移动技术网IT编程  | 我要评论

广西防城港人才网,经典搞笑故事,冷面王的腹黑王妃

metrikit是ios 13中用于收集和处理电池和性能指标的新框架。这是在wwdc今年与xctestmetrics和xcode metrics组织者一起,作为一项协调一致的努力的一部分,为开发人员带来关于他们的应用程序在该领域的表现的新见解。

wwdc 2019会话417的图表:“提高电池寿命和性能

苹果会自动从appstore上安装的应用程序中收集度量指标。您可以在xcode 11中通过打开组织者(⌥ ⌘ ⇧ o)并选择新的metrics选项卡。

metrikit是xcode组织者度量的补充,它提供了一种编程方式来接收有关应用程序在该领域中的表现的日常信息。有了这些信息,您可以自己收集、聚合和分析比通过xcode更详细的信息。

文章结尾有礼包

 理解应用度量

度量可以帮助您发现您在本地测试时可能没有看到的问题,并允许您跟踪和更改不同版本的应用程序。在这个最初的版本中,苹果专注于两个对用户最重要的指标:电池使用和性能.

电池使用

电池寿命取决于许多不同的因素。物理方面,如设备的年龄和充电周期的次数是决定性的,

但你的手机使用方式也很重要。

比如cpu的使用、显示器的亮度和屏幕上的颜色,以及收音机用于获取数据或获取当前位置的频率--所有这些都会产生很大的影响。但最重要的是要记住的是,用户非常关心电池的使用寿命。

除了相机有多好外,电荷之间的间隔时间也是很长的。这个这些天当有人买新手机时的决定因素。

所以当他们的新的,昂贵的手机不度过这一天,他们会很不开心的。

直到最近,苹果公司还在电池问题上承担了大部分的责任。

但自从ios 12和它的新电池使用屏在设置中,用户现在可以判断他们最喜欢的应用程序是什么时候被指责的。

幸运的是,有了ios 13,你现在就拥有了所有你需要的东西,以确保你的应用程序不会与合理的能源使用发生冲突。

 

 

 

性能

性能是整个用户体验中的另一个关键因素。正常情况下,我们可能会看数据,如处理器时钟速度或帧速率作为业绩的衡量标准。但相反,苹果专注于不那么抽象和更具可操作性的指标:

挂率

主/ui线程被阻塞的频率有多大,以致应用程序对用户输入没有响应?

发射时间

用户点击图标后,应用程序需要多长时间才能使用?

峰值记忆&悬浮记忆

在进入后台之前,应用程序在峰值时使用了多少内存?

磁盘写入

这个应用程序多久写一次到磁盘,如果你还不知道,那就是相对缓慢运行 (即使是iphone上的闪存!)

使用metrikit

从api使用者的角度来看,很难想象`metrikit`如何更容易合并。您所需要的只是您的应用程序的某些部分作为一个度量订阅者(一个明显的选择是您的`appdelegate`),并将其添加到共享`mxmetricmanager:`

import uikit
import metrickit

@uiapplicationmain
class appdelegate: uiresponder, uiapplicationdelegate {
func application(_ application: uiapplication, didfinishlaunchingwithoptions launchoptions: [uiapplication.launchoptionskey: any]?) -> bool {
mxmetricmanager.shared.add(self)
return true
}

func applicationwillterminate(_ application: uiapplication) {
mxmetricmanager.shared.remove(self)
}
}

extension appdelegate: mxmetricmanagersubscriber {
func didreceive(_ payloads: [mxmetricpayload]) {
...
}
}

ios在使用应用程序时会自动收集样本,并且每天(每24小时)发送一次包含这些指标的聚合报告。

以验证您的`mxmetricmanagersubscriber`正在按预期调用其委托方法,在xcode运行应用程序时,从debug菜单中选择simple metrikit有效载荷。

模拟metrikit有效载荷菜单项要求应用程序在实际设备上运行,并为模拟器构建禁用。

用路标标注关键代码节

除了为您收集的基线统计数据之外,还可以使用`mxsignpost`函数来收集代码中最重要部分的度量。这,这个路标支持api捕获cpu时间、内存和写入磁盘。

例如,如果应用程序的一部分确实对音频流进行了后处理,您可以用公制路标对这些区域进行注释,以确定该工作的能量和性能影响:

let audiologhandle = mxmetricmanager.makeloghandle(category: "audio")

func processaudiostream() {
mxsignpost(.begin, log: audiologhandle, name: "processaudiostream")
...
mxsignpost(.end, log: audiologhandle, name: "processaudiostream")
}

创建用于收集appmetrics的自托管web服务

既然你掌握了这些信息,你会怎么处理呢?我们该怎么填` ... `实现中的占位符`didreceive(_:)?`

你,你们能把它转交给一些付费的分析或事故报告服务,但这其中的乐趣在哪里呢??让我们构建自己的web服务来收集这些以供进一步分析:

用postgresql存储和查询度量

这个 mxmetricpayload 由度量管理器订阅者接收的对象有一个方便的 jsonrepresentation() 方法生成如下内容:

[点击查看 json表示 ]

正如你所看到的,这个表示法有很多地方。为所有这些信息定义模式将是一项艰巨的工作,而且不能保证这种情况今后不会改变。因此,让我们采用nosql范式(尽管是负责任地使用波斯特格斯)通过将有效载荷存储在jsonb列:

create table if not exists metrics (
id bigint generated by default as identity primary key,
payload jsonb not null
);

我们可以使用json算子就像这样:

select (payload -> 'applicationtimemetrics'
->> 'cumulativeforegroundtime')::interval
from metrics;
-- interval
-- ═══════════════════
-- @ 11 mins 40 secs
-- (1 row)

 度量的json表示将时间和内存的度量存储为带有单位的字符串(如"100 ms"和500 kb)。在postgres中,您可以直接将时间度量转换到interval类型但是,您需要创建一个转换为字节计数的函数:

create or replace function parse_byte_count (text)
returns bigint
as $$
select
replace(split_part($1, ' ', 1),',','')::bigint *
case split_part($1, ' ', 2)
when 'kb' then 1024
when 'mb' then 1024 * 1024
when 'gb' then 1024 * 1024 * 1024
end
$$ language 'sql' strict immutable;

 

高级:创建视图

postgresql中的json运算符使用起来可能很麻烦--特别是对于更复杂的查询。其中一种帮助方法是创建一个视图。(物化或以其他方式)要以最方便的表示方式向您投射最重要的信息:

drop view key_performance_indicators;
create view key_performance_indicators as
select
id,
(payload -> 'appversion') as app_version,
(payload -> 'metadata' ->> 'devicetype') as device_type,
(payload -> 'metadata' ->> 'regionformat') as region,
(payload -> 'applicationtimemetrics'
->> 'cumulativeforegroundtime'
)::interval as cumulative_foreground_time,
parse_byte_count(
payload -> 'memorymetrics'
->> 'peakmemoryusage'
) as peak_memory_usage_bytes
from metrics;

使用视图,您可以执行聚合查询在您的所有度量指标中,json有效负载都具有模式支持的关系数据库的方便性:

select avg(cumulative_foreground_time)
from key_performance_indicators;
-- avg
-- ══════════════════
-- @ 9 mins 41 secs

select app_version, percentile_disc(0.5)
within group (order by peak_memory_usage_bytes)
as median
from key_performance_indicators
group by app_version;
-- app_version │ median
-- ═════════════╪═══════════
-- "1.0.1" │ 192500000
-- "1.0.0" │ 204800000

postgresql不能很好地处理camelcase的表名或列名,所以在使用以下函数时要记住这一点jsonb_to_record.

 创建web服务

在本例中,大多数繁重的工作都委托给postgres,这使得服务器端的实现相当枯燥。为了完整起见,以下是ruby(sinatra)和javascript(express)中的一些参考实现:

require 'sinatra/base'
require 'pg'
require 'sequel'

class app < sinatra::base
configure do
db = sequel.connect(env['database_url'])
end

post '/collect' do
db[:metrics].insert(payload: request.body.read)
status 204
end
end

 

发送度量作为json

现在我们已经设置好了一切,最后一步就是实现所需的`mxmetricmanagersubscriber`委托方法`didreceive(_:)`要将这些信息传递给我们的web服务:

extension appdelegate: mxmetricmanagersubscriber {
func didreceive(_ payloads: [mxmetricpayload]) {
for payload in payloads {
let url = url(string: "https://example.com/collect")!

var request = urlrequest(url: url)
request.httpmethod = "post"
request.httpbody = payload.jsonrepresentation()

let task = urlsession.shared.datatask(with: request)
task.priority = urlsessiontask.lowpriority
task.resume()
}
}
}

1024礼包

加入ios开发交流qq群:[1012951431],选择加入一起交流,一起学习,共享学习资料。期待你的加入!(进群可领取礼包)

转载地址 : https://nshipster.com/metrickit/

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网