iOS 从设备日志分析App网络性能

环境准备 Apple Console (控制台程序,MacOS自带) iPhone(iPad等设备也可,不需要越狱) 数据线 iOS App(不需要破解,直接从AppStore安装就可以) 操作步骤 1、通过usb将iPhone手机和Mac电脑连接 2、打开 Apple Console,选中的设备 3、点击开始,可以实时看到设备日志了,然后打开App,运行一段时间。 在日志里面搜索关键字 summary for task,应可以看到对网络性能的统计 字段解析 先摘抄一段日志 16:34:02.523191+0800 MPBBank Task <4C18F624-05B7-427D-AC9D-46C6C69B29C9>.<1> summary for task success {transaction_duration_ms=576, response_status=200, connection=1, protocol="http/1.1", domain_lookup_duration_ms=105, connect_duration_ms=240, secure_connection_duration_ms=167, private_relay=false, request_start_ms=389, request_duration_ms=0, response_start_ms=574, response_duration_ms=1, request_bytes=1629, response_bytes=10056, cache_hit=false} 以上对应 日志时间(16:34:02.523191+0800), 日志发生源的进程(MPBBank,此为招商银行App的进程), 日志信息(Task <6510978A-4EA6-4970-A5A6-1AFBF3B0C0E1>.<1> ….) 主要关注下 日志信息 字段,可以看到其内容为 Task <4C18F624-05B7-427D-AC9D-46C6C69B29C9>.<1> # 任务Id summary for task success # 任务成功统计 { transaction_duration_ms=576, # 传输时长 response_status=200, # 响应码 connection=1, protocol="http/1.1", # 网络协议 domain_lookup_duration_ms=105, # DNS查询时长 connect_duration_ms=240, # 连接时长secure_connection_duration_ms=167, # 安全连接时长 private_relay=false, request_start_ms=389, # 请求开始时刻 request_duration_ms=0, # 请求时长 response_start_ms=574, # 响应开始时刻 response_duration_ms=1, # 响应时长 request_bytes=1629, # 请求报文大小 response_bytes=10056, # 响应报文大小 cache_hit=false # 是否命中缓存 } 基本上从字面意思解释就可以了。 经过反复观察,以上部分数据存在以下关系: transaction_duration_ms = response_start_ms + response_duration_ms,最终计算结果可能会有几毫秒误差。 ...

November 11, 2021 · 1 min · holdsky

iOS WKWebView 播放视频时禁用自动全屏播放

关键属性 webkit-playsinline、 playsinline、 allowsInlineMediaPlayback 需要在html style里面和native 里面同时设置才有效 html video增加样式 webkit-playsinline、 playsinline <video controls="" height="auto" id="video1" playsinline="true" preload="auto" webkit-playsinline="true" width="100%"><source src="xxxxx.mp4" type="video/mp4"> 您的浏览器不支持 HTML5 video 标签。 </source></video> native code 设置 allowsInlineMediaPlayback WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; config.allowsInlineMediaPlayback = YES; WKWebView *webView = [[WKWebView alloc]initWithFrame:CGRectZero configuration:config]; 参考 https://www.zhihu.com/question/21094425

November 8, 2021 · 1 min · holdsky

WebRTC初学Demo

webrtc介绍 简介实现基本的数据通道文件传输修改传输速度限制选择并读取文件数据自动下载文件完整代码音视频通话https访问音视频流完整代码屏幕共享捕捉屏幕完整代码NAT穿透之STUN/TURN信令服务器信令服务实现完整代码 详细请访问 简介 WebRTC(网页实时通信技术),是一系列为了建立端到端文本或者随机数据的规范,标准,API和概念的统称。 任何实现了WebRTC标准的软件之间均可通信,如PC浏览器–手机浏览器、浏览器–App、App–App。通信双方是对等的,但通常还要引入服务端,以便于对等端能够找到对方。 移动端浏览器对WebRTC的支持 Android 4.4以上 iOS 11以上 WebRTC应用不需要非常高性能就能够平稳运行、拥有良好体验。对于WebRTC来说,获取特定硬件的权限也不是必需的。Web应用和原生应用对比: 原生应用会比Web应用更快,拥有更高级别的硬件权限;混合应用的运行速度更慢,不能使用移动设备的全部权限。 原生应用在不同的平台上的代码复用度有待提高;混合应用开发起来会更快,更省钱 结论:如果高性能和极致体验不是软件的必不可少的要求,那么,在绝大多数情况下,用户根本注意不到原生和混合WebRTC应用之间的差别。 实现基本的数据通道 对浏览器而言,WebRTC API处于底层且十分复杂。不过我们可以使用封装好的高级别的API—- simple-peer 是一个基础的,非常洁净的低层P2P连接封装器.下面的示例是 simple-peer 的一个标准例子。 <html> <body> <style> #outgoing { width: 100%; word-wrap: break-word; white-space: normal; } </style> <form> <textarea id="incoming"></textarea> <button type="submit">submit</button> </form> <pre id="outgoing"></pre> <script src="simplepeer.min.js"></script> <script> const p = new SimplePeer({ initiator: location.hash === '#1', trickle: false }) p.on('error', err => console.log('error', err)) p.on('signal', data => { console.log('SIGNAL', JSON.stringify(data)) document.querySelector('#outgoing').textContent = JSON.stringify(data) }) document.querySelector('form').addEventListener('submit', ev => { ev.preventDefault() p.signal(JSON.parse(document.querySelector('#incoming').value)) }) p.on('connect', () => { console.log('CONNECT') p.send('whatever' + Math.random()) }) p.on('data', data => { console.log('data: ' + data) }) </script> </body></html> 演示步骤: ...

October 19, 2021 · 9 min · holdsky

关闭Spotlight

原因无他,导致mac笔记本发热严重,要是一两次也就罢了,每天至少一次CPU 100%,打开活动监视器,都是这个Spotlight造成的。 步骤如下 关闭System Integrity Protection 进入恢复模式:重启电脑, 按住 Command 和 R。 输入命令 csrutil disable 因为Spotlist服务受System Integrity Protection保护,不关闭的话有可能无法关闭Spotlist服务,报错如下 Unload failed: 150: Operation not permitted while System Integrity Protection is engaged 关闭Spotlight服务 sudo mdutil -a -i off sudo mdutil -a -d sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.Spotlight.plist 如果收到报错 Unload failed: 113: Could not find specified service 那就先加载Spotlight服务 sudo mdutil -a -i on sudo launchctl load -w /System/Library/LaunchAgents/com.apple.Spotlight.plist 然后再执行服务卸载 打开System Integrity Protection 进入恢复模式:重启电脑, 按住 Command 和 R。 输入命令 csrutil enable https://macpaw.com/how-to/disable-enable-system-integrity-protection

October 14, 2021 · 1 min · holdsky

iOS HealthKit 健康框架简介

详细介绍参考 https://developer.apple.com/documentation/healthkit Demo下载 简介 ​ HealthKit 为 iPhone 和 Apple Watch 上的健康和健身数据提供了一个中央存储库。在用户许可的情况下,应用程序与 HealthKit 通信以访问和共享此数据: 收集和存储健康和健身数据 分析和可视化数据 社交互动 下图来自于苹果开发者网站 ​ HealthKit 管理和合并来自多个来源的数据,用户可以在健康应用中查看和管理他们的所有数据,包括添加数据、删除数据和更改应用的权限;用户还可以编辑每种数据类型的分享权限。 隐私 ​ 由于健康数据可能包含敏感的个人信息,因此应用程序必须获得用户的许可才能从 HealthKit 存储区读取数据或向其写入数据,并且应用程序还必须始终采取措施保护这些数据。 ​ HealthKit 为用户提供了更细粒度的数据权限控制。用户必须明确授予每个应用对 HealthKit 存储区读取和写入数据的权限。用户可以针对每种类型的数据分别授予或拒绝权限。例如,用户可以让允许应用读取步数数据,但不允许读取血糖水平。 数据加密存储 ​ 用户的设备在本地存储所有 HealthKit 数据。为了安全起见,当用户锁定设备时,设备会加密 HealthKit 存储。因此,应用在后台运行时可能无法HealthKit存储中读取数据。但是手机被锁定时,应用程序仍然可以写入HealthKit存储。HealthKit 会临时缓存数据,并在用户解锁手机后立即将其保存到加密存储中。 指定应用如何使用健康数据 ​ 除非应用旨在提供健康或健身服务,否则应用不得访问 HealthKit API( 注意:影响应用上架)。此外,作为健康和健身服务的角色必须在营销文本和用户界面中明确。具体来说,以下指南适用于所有 HealthKit 应用程序: 您的应用不得将通过使用 HealthKit 框架获得的信息用于广告或类似服务。 仍然可以在使用 HealthKit 框架的应用程序中投放广告,但不能使用 HealthKit中的数据来投放广告 未经用户明确许可,不得将通过 HealthKit 获得的任何信息透露给第三方。 即使获得许可,也只能将信息分享给向用户提供健康或健身服务的第三方。 不能将通过 HealthKit 获得的信息出售给广告平台、数据经纪人或信息经销商。 如果用户同意,可以与第三方共享他们的 HealthKit 数据以进行 医学研究。 必须向用户明确披露您和您的应用将如何使用他们的 HealthKit 数据。 提供隐私政策 ​ 必须为使用 HealthKit 框架的任何应用程序提供隐私政策。可以在以下站点找到有关创建隐私政策的指南: ...

October 13, 2021 · 2 min · holdsky

Safari Websocket: Invalid HTTP version string: HTTP/1.0

原因是Safari的Websocket连接是基于HTTP/1.1的,需要把Websocket Sever的应答也基于HTTP/1.1 一个不合适应答报文示例: 1、Safari请求基于HTTP/1.1建立WebSocket连接 2、Server应答为基于HTTP/1.0,那么Safari将关闭本次WebSocket连接请求 GET / HTTP/1.1 #Safari请求基于HTTP/1.1建立WebSocket连接 Upgrade: websocket Connection: Upgrade Host: localhost:8000 Origin: http://localhost:8000 Pragma: no-cache Cache-Control: no-cache Sec-WebSocket-Key: psuWu4PKpvC5PlimntI1uw== Sec-WebSocket-Version: 13 Sec-WebSocket-Extensions: x-webkit-deflate-frame User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15 HTTP/1.0 101 Switching Protocols #Server应答为基于HTTP/1.0,那么Safari将关闭本次WebSocket连接请求 Server: SimpleHTTP/0.6 Python/2.7.15 Date: Wed, 08 Sep 2021 07:26:20 GMT Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: Mwq3JIMwIENZgkjooYLJobX4L90=

September 8, 2021 · 1 min · holdsky

macOS 清理磁盘空间

1、缓存和日志 ~/Library/Caches ~/Library/Logs 这两个可以安全地删除 2、其他 - Application Support 里面存放三方App的一些缓存和记录,可以挑选删除。 如 VSCode 相关 ~/Library/Application Support/Code/User/workspaceStorage ~/Library/Application Support/Code/Cache* 3、Xcode 执行命令 xcrun simctl delete unavailable 删除 ~/Library/Developer/CoreSimulator/Caches https://zhuanlan.zhihu.com/p/349862578

September 7, 2021 · 1 min · holdsky

[转载]top block unavailable for requested intra mode

https://blog.51cto.com/fengyuzaitu/2060964 [h264 @ 04241fc0] top block unavailable for requested intra mode [h264 @ 04241fc0] error while decoding MB 2 0, bytestream 243592 [h264 @ 04241fc0] concealing 8160 DC, 8160 AC, 8160 MV errors in I frame [h264 @ 036da7a0] top block unavailable for requested intra mode [h264 @ 036da7a0] error while decoding MB 87 0, bytestream 13676 [h264 @ 036da7a0] concealing 8122 DC, 8122 AC, 8122 MV errors in P frame [swscaler @ 054140c0] deprecated pixel format used, make sure you did set range correctly [h264 @ 0447a540] concealing 7913 DC, 7913 AC, 7913 MV errors in P frame [h264 @ 0447a960] top block unavailable for requested intra modetop block unavailable for requested intra mode -1 [h264 @ 0447a960] error while decoding MB 52 0, bytestream 18938 ...

September 2, 2021 · 1 min · holdsky

ijkplayer 初始化参数 IJKFFOptions

key平台默认取值范围描述ancommon0整数–{0,1}禁用音频vncommon0整数–{0,1}禁用视频nodispcommon0整数–{0,1}禁用图像显示。和vn的区别是:vn不解码不渲染;nodisp解码不渲染volumecommon100整数–[0,100]音量loopcommon1整数设置循环播放次数infbufcommon0整数–{0,1}不限制输入缓冲区大小(对实时流很有用)max-fpscommon31整数–[-1,121]允许的最大播放帧率,当视频的实际帧率大于这个数值时,将丢弃部分视频帧。framedropcommon0整数–[-1,120]ijkplaer以音频帧为时间基准,当视频帧和音频帧不同步时,允许丢弃的视频帧数。seek-at-startcommon0非负整数起始播放位置的偏移量,单位毫秒。例如可以设置从第20秒的位置播放subtitlecommon0整数–{0,1}是否解码字幕数据find_stream_infocommon1整数–{0,1}读取和解码流以使用启发式方法填充丢失的信息。用来优化播放体验。overlay-formatcommonSDL_FCC_RV32{SDL_FCC_YV12,SDL_FCC_I420,SDL_FCC_RV16,SDL_FCC_RV24,SDL_FCC_RV32}图像颜色空间格式。 SDL_FCC_YV12 —- bpp=12, Planar mode: Y + V + U (3 planes) SDL_FCC_I420 —- bpp=12, Planar mode: Y + U + V (3 planes) SDL_FCC_RV16 —- bpp=16, RGB565 SDL_FCC_RV24 —- bpp=24, RGB888 SDL_FCC_RV32 —- bpp=32, RGBX8888start-on-preparedcommon1整数–{0,1}如果设置为1的话,播放准备工作完成后自动开始播放video-pictq-sizecommon3整数–[3,16]视频帧队列大小。max-buffer-sizecommon15 1024 1024整数–[0,15 1024 1024]预读数据的缓冲区大小。min-framescommon50000整数–[2,50000]停止预读的最小帧数。即预读帧数大于等于该值时,将停止预读。first-high-water-mark-mscommon100整数–[100,5000](缓冲)读取线程的第一次唤醒时间,单位毫秒next-high-water-mark-mscommon1000整数-- [100,5000](缓冲)读取线程的第二次唤醒时间,单位毫秒last-high-water-mark-mscommon5000整数–[100,5000](缓冲)读取线程的第三次唤醒时间,单位毫秒acket-bufferingcommon1整数–{0,1}暂停输出,直到停止后读取足够的数据包sync-av-startcommon1整数–{0,1}播放开始时对音视频进行同步操作iformatcommonNULL字符串强制使用指定格式,如RTSP, H264,FLV, MKV, MP4, AVI等no-time-adjustcommon0整数–{0,1}如果使用实时模式而不是调整模式,则返回流中的位置。这个用例主要是在使用自定义的不可搜索数据源时,该数据源以不是流开头的缓冲区开始。我们希望 get_current_position 返回流中的时间,而不是播放器的内部时间。preset-5-1-center-mix-levelcommon_1/sqrt(2)_双精度浮点数–[-32,32]为 5.1 声道预设中央混合电平enable-accurate-seekcommon0整数–{0,1}使用精确寻帧。例如,拖动播放后,会寻找最近的关键帧进行播放,很有可能关键帧的位置不是拖动后的位置,而是较前的位置。可以设置这个参数来解决问题accurate-seek-timeoutcommon5000整数–[0,5000]设置精确寻帧的超时时间。单位,毫秒skip-calc-frame-ratecommon0整数–{0,1}不计算真实的帧率async-init-decodercommon0整数–{0,1}异步创建解码器videotoolboxiOS0{0,1}是否使用videoToolbox框架解码。(非零表示使用)videotoolbox-max-frame-widthiOS0正整数使用videoToolbox框架解码帧画面最大宽度,0表示使用视频原始宽度。当设置大于0的值,且视频原始宽度大于设置值,则会进行相应缩放处理。videotoolbox-asynciOS0{0,1}异步解码模式kVTDecodeFrame_EnableAsynchronousDecompressionvideotoolbox-wait-asynciOS1{0,1}是否调用VTDecompressionSessionWaitForAsynchronousFrames。作用是等待异步解码完成后再返回。例如,在销毁播放器资源前调用,以保证资源能被正确释放。videotoolbox-handle-resolution-changeiOS0{0,1}自动处理分辨率变化

August 30, 2021 · 1 min · holdsky

Xcode调试iPhone真机 :code signature version is no longer supported

Details Unable to install "MyApp" Domain: com.apple.dt.MobileDeviceErrorDomain Code: -402620375 - The code signature version is no longer supported. Domain: com.apple.dt.MobileDeviceErrorDomain Code: -402620375 User Info: { DVTRadarComponentKey = 261622; MobileDeviceErrorCode = "(0xE8008029)"; "com.apple.dtdevicekit.stacktrace" = ( 0 DTDeviceKitBase 0x000000011edd83b8 DTDKCreateNSErrorFromAMDErrorCode + 220 1 DTDeviceKitBase 0x000000011ee16ae1 __90-[DTDKMobileDeviceToken installApplicationBundleAtPath:withOptions:andError:withCallback:]_block_invoke + 155 2 DVTFoundation 0x0000000107881b7c DVTInvokeWithStrongOwnership + 71 3 DTDeviceKitBase 0x000000011ee16822 -[DTDKMobileDeviceToken installApplicationBundleAtPath:withOptions:andError:withCallback:] + 1440 4 IDEiOSSupportCore 0x000000011eccf999 __118-[DVTiOSDevice(DVTiPhoneApplicationInstallation) processAppInstallSet:appUninstallSet:installOptions:completionBlock:]_block_invoke.294 + 3534 5 DVTFoundation 0x00000001079b4931 __DVT_CALLING_CLIENT_BLOCK__ + 7 6 DVTFoundation 0x00000001079b655b __DVTDispatchAsync_block_invoke + 1191 7 libdispatch.dylib 0x00007fff20508603 _dispatch_call_block_and_release + 12 8 libdispatch.dylib 0x00007fff205097e6 _dispatch_client_callout + 8 9 libdispatch.dylib 0x00007fff2050f5ca _dispatch_lane_serial_drain + 606 10 libdispatch.dylib 0x00007fff2051008d _dispatch_lane_invoke + 366 11 libdispatch.dylib 0x00007fff20519bed _dispatch_workloop_worker_thread + 811 12 libsystem_pthread.dylib 0x00007fff206b04c0 _pthread_wqthread + 314 13 libsystem_pthread.dylib 0x00007fff206af493 start_wqthread + 15 ); } - 可能是因为对framework的签名不一致导致,有的是 Do Not Embed, 有的是 Embed and Sign ...

July 30, 2021 · 1 min · holdsky