关于ios:大牛荐书-百度技术大牛都在读的7本书

导读:2月马上就要完结了,各位“技术打工人”有没有从假期模式齐全调整过去呢?为了帮大家疾速充电,咱们特地邀请百度技术大咖举荐了7本压箱底的好书,帮大家排雷避坑,花起码的工夫读最值得读的书。 当然,如果你有想读的技术方向书籍也能够评论区留言通知咱们~ 最初话不多说,间接上本期书单。 第一本 《代码整洁之道》-举荐书籍- 书名:代码整洁之道,Clean Code 作者:[美]Robert C. Martin -举荐理由- 洁净的代码,既在品质上较为牢靠,也为前期保护、降级奠定了良好基础。 作为编程畛域的佼佼者,本书作者给出了一系列卓有成效的整洁代码操作实际。这些实际在本书中体现为一条条规定(或称“启发”),并辅以来自事实我的项目的正、反两面范例。只有遵循这些规定,就能编写出洁净的代码,从而无效晋升代码品质。 第二本 《深度学习-智能时代的外围驱动力量》-举荐书籍- 书名:《深度学习-智能时代的外围驱动力量》; 《The Deep Learning Revolution》 作者:[美]特伦斯·谢诺夫斯基(Terrence Sejnowski) -举荐理由- 特伦斯·谢诺夫斯基是寰球人工智能十大科学家之一、深度学习先驱及奠基者,美国四大国家学院院士,NIPS基金会主席。本书是深度学习的科普作品,以恢宏手法通过3个局部的全景出现了深度学习的倒退、演变和利用。作者以亲历者视角回溯了这段恢宏的历史,也能让咱们对明天的AI有更粗浅的了解和更全局的思考。 本书即回顾了历史,又瞻望了将来, 既有乐观时刻,也有玻尔兹曼机算法突破明斯基乐观论断的石破天惊。通过本书,咱们能够看到算法的冲破、算力的破局以及AI芯片的划时代意义,也能让咱们更粗浅的了解我厂作为当先的AI生态型公司在AI畛域的全面布局,更加动摇的让咱们俯视星空、看到将来。 作为通识作品,本书适宜所有人浏览,读完本书,你会晓得深度学习第一次让人工智能有了灵魂,也能用更通俗易懂的语言答复家人敌人对于人工智能的一系列问题。 第三本 《我不是产品经理:挪动互联网商业模式下的用户增长》-举荐书籍- 书名:《我不是产品经理:挪动互联网商业模式下的用户增长》 作者:岳建雄 -举荐理由- 在流量竞争如此强烈的明天,用户增长的起源也从增量市场转移到存量市场,并产生了各种各样的新玩法。本书从搭建团队到通过策略、数据、技术获取用户均有波及。 既有系统化的办法,又有具体的技术实现,是一本很实用的书,举荐给大家。 第四本 《数字思维》-举荐书籍- 书名: 《数字思维》 《The Digital Mind》 作者: 【葡】阿林多·奥利维拉(Arlindo Oliveira) -举荐理由- 阿林多·奥利维拉是葡萄牙里斯本低等理工学院院长,计算机科学与工程系传授。随着医学和计算技术的提高,咱们终有一天会充沛理解大脑的工作原理,并尝试用数字反对的模式复制智能,非生物思维可能会很快呈现在地球上,这一事实将引发一场迄今为止咱们从未见过的社会反动。 在这本书中,作者将率领咱们踏上一段通往将来的探索之旅,通过形容一系列技术和迷信:麦克斯韦方程组,图灵机,人工生物零碎,神经元网络,机器学习,基因组测序等等,讲述科技的提高如何推动咱们发明出“数字思维”。 本书通俗易懂,适宜所有人浏览。读完本书,会发现计算机和生物学千头万绪的分割,找到计算机、细胞和大脑的共同之处。还会对智能的将来是什么,数字思维与人类如何共处等问题进行深刻思考。 第五本 《硅谷之谜》-举荐书籍- 书名:《硅谷之谜》 作者:吴军 -举荐理由- 美国硅谷在引领了半导体、IT和互联网技术之后,持续引领着人类技术的倒退方向。硅谷诞生了很多可能扭转世界,为人类的文化提高做出奉献的平凡公司。 《硅谷之谜》的作者是驰名自然语言解决和搜寻专家,硅谷风险投资人吴军。作者站在一个更高的档次,仔细分析了硅谷的起源和倒退,对硅谷的创新力进行了粗浅分析,把硅谷的教训晋升到了实践高度,并且解释了为什么只有硅谷真正做到了宽容叛逆、宽容失败、多元文化和回绝平庸。这些特点造就了硅谷几十年的长盛不衰。 第六本 《大规模分布式存储系统原理解析与架构实战》-举荐书籍- 书名: 《大规模分布式存储系统原理解析与架构实战》 作者: 杨传辉 -举荐理由- 分布式系统固有的复杂性加上大规模存储的工程挑战,让真正了解这一体系变得非常不易。 ...

February 25, 2021 · 1 min · jiezi

关于ios:iOS拍个小视频

需要公司混合开发,uni端拍小视频不是很现实,为达到仿微信成果,原生插件走起 思路第1步:1个AVCaptureSession, 1块AVCaptureVideoPreviewLayer[思考兼容替换成AVPreView] 第2步:视频录制需video & audio, 须要对应的AVCaptureDeviceInput,同理对应的AVCaptureVideoDataOutput与AVCaptureAudioDataOutput 第3步:代理中设置output辨别video与audio, 并将对应的CMSampleBufferRef写入到视频文件中 第4步:写入视频文件中,用到AVAssetWriter, 对应video & audio 需两个AVAssetWriterInput, 退出AVAssetWriter 第5步:CMSampleBufferRef一直过去,AssetWriter一直写入,直到进行 上菜 第一步的初始化就不写了,没事能够翻看自己后面的博客 第2步:两个AVCaptureDeviceInput 两个Output, 且设置Output的代理 self.videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&error];if (error) { NSLog(@"获得设施摄入videoInput对象时出错, 谬误起因: %@", error); return;}// 设施增加到会话中if ([self.session canAddInput:self.videoInput]) { [self.session addInput:self.videoInput];}[self.videoOutput setSampleBufferDelegate:self queue:self.videoQueue];if ([self.session canAddOutput:self.videoOutput]) { [self.session addOutput:self.videoOutput];}// 音频相干AVCaptureDevice *adevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];self.audioInput = [[AVCaptureDeviceInput alloc] initWithDevice:adevice error:&error];if ([self.session canAddInput:self.audioInput]) { [self.session addInput:self.audioInput];}[self.audioOutput setSampleBufferDelegate:self queue:self.videoQueue];if ([self.session canAddOutput:self.audioOutput]) { [self.session addOutput:self.audioOutput];}// 视频输入- (AVCaptureVideoDataOutput *)videoOutput { if (!_videoOutput) { _videoOutput = [[AVCaptureVideoDataOutput alloc] init]; _videoOutput.alwaysDiscardsLateVideoFrames = YES; } return _videoOutput;}// 音频输入- (AVCaptureAudioDataOutput *)audioOutput { if (!_audioOutput) { _audioOutput = [[AVCaptureAudioDataOutput alloc] init]; } return _audioOutput;}第3步:启动Session,代理外面操作CMSampleBufferRef ...

February 24, 2021 · 2 min · jiezi

关于ios:iOS拍照定制之AVCaptureVideoDataOutput

问题领导看了后面做的拍照,问了句"哪来的声音", "零碎的,自带的,你看零碎的拍照也有声音" "有方法能去掉吗?挺糟心的" "我试试" 思路路漫漫其修远兮,吾在度娘+SDK中求索 拍砖AVCaptureVideoDataOutput, 代理办法中将CMSampleBufferRef转成UIImage 上码 session设置不提layer设置可参考上篇 [iOS拍照定制之AVCapturePhotoOutput] 以及 上上篇[iOS写在定制相机之前]获取摄像头、取到设施输出增加到session、初始化videoOutput增加入sessionAVCaptureDevice *device = [self cameraDevice];if (!device) { NSLog(@"获得后置摄像头出问题"); return;;}NSError *error = nil;self.videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:device error:nil];// 设施增加到会话中if ([self.captureSession canAddInput:self.videoInput]) { [self.captureSession addInput:self.videoInput];}[self.videoOutput setSampleBufferDelegate:self queue:self.videoQueue];if ([self.captureSession canAddOutput:self.videoOutput]) { [self.captureSession addOutput:self.videoOutput];}// 懒加载- (AVCaptureVideoDataOutput *)videoOutput { if (!_videoOutput) { _videoOutput = [[AVCaptureVideoDataOutput alloc] init]; _videoOutput.alwaysDiscardsLateVideoFrames = YES; _videoOutput.videoSettings = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]; } return _videoOutput;}- (dispatch_queue_t)videoQueue { if (!_videoQueue) { _videoQueue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL); } return _videoQueue;}代理AVCaptureVideoDataOutputSampleBufferDelegate- (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { @autoreleasepool { if (connection == [self.videoOutput connectionWithMediaType:AVMediaTypeVideo]) { // 视频 @synchronized (self) { UIImage *image = [self bufferToImage:sampleBuffer rect:self.scanView.scanRect]; self.uploadImg = image; } } }}CMSampleBufferRef转成UIImage, 该办法有所调整,截图整张图中的某一部分,按需设置。具体获取指定区域图片需本人调整- (UIImage *)bufferToImage:(CMSampleBufferRef)sampleBuffer rect:(CGRect)rect { // Get a CMSampleBuffer's Core Video image buffer for the media data CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); // Lock the base address of the pixel buffer CVPixelBufferLockBaseAddress(imageBuffer, 0); // Get the number of bytes per row for the pixel buffer void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); // Get the number of bytes per row for the pixel buffer size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); // Get the pixel buffer width and height size_t width = CVPixelBufferGetWidth(imageBuffer); size_t height = CVPixelBufferGetHeight(imageBuffer); // Create a device-dependent RGB color space CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // Create a bitmap graphics context with the sample buffer data CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); // Create a Quartz image from the pixel data in the bitmap graphics context CGImageRef quartzImage = CGBitmapContextCreateImage(context); // Unlock the pixel buffer CVPixelBufferUnlockBaseAddress(imageBuffer,0); // Free up the context and color space CGContextRelease(context); CGColorSpaceRelease(colorSpace); // 获取指定区域图片 CGRect dRect; CGSize msize = UIScreen.mainScreen.bounds.size; msize.height = msize.height - 150; CGFloat x = width * rect.origin.x / msize.width; CGFloat y = height * rect.origin.y / msize.height; CGFloat w = width * rect.size.width / msize.width; CGFloat h = height * rect.size.height / msize.height; dRect = CGRectMake(x, y, w, h); CGImageRef partRef = CGImageCreateWithImageInRect(quartzImage, dRect); // Create an image object from the Quartz image UIImage *image = [UIImage imageWithCGImage:partRef]; // Release the Quartz image CGImageRelease(partRef); CGImageRelease(quartzImage); return image;}图有了,出工。怎么用图,业务该干活了

February 24, 2021 · 2 min · jiezi

关于ios:Flutter仿微信的下拉弹框

在挪动开发中,下拉弹框是一种很常见的抉择交互方式,成果如下图所示。对于这种弹框,咱们能够应用Dialog来实现,上面是自定义弹框的次要代码。 Color _bgColor = Colors.white;double cellHeight = 34;double cellWidth=120;typedef ClickCallBack = void Function(int selectIndex, String selectText);class PopMenus { static void showPop( {@required BuildContext context, @required List<String> listData, @required String selText, ClickCallBack clickCallback}) { Widget _buildMenuLineCell(dataArr) { return ListView.separated( itemCount: dataArr.length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (BuildContext context, int index) { return GestureDetector( onTap: () { Navigator.pop(context); if (clickCallback != null) { clickCallback(index, listData[index]); } }, child: Container( height: cellHeight, child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ selText==dataArr[index]? Text(dataArr[index], style: TextStyle(fontSize: 16,color: Colors.blue)):Text(dataArr[index], style: TextStyle(fontSize: 16)) ], ), )); }, separatorBuilder: (context, index) { return Divider( height: 0.1, color: Color(0xFFE6E6E6), ); }, ); } _buildMenusView(dataArr) { var cellH = dataArr.length * cellHeight; var navH = ScreenUtils.navigationBarHeight; navH = navH - ScreenUtils.topSafeHeight; var leftP=(ScreenUtils.screenWidth-cellWidth)/2; return Positioned( left: leftP, top: navH-10, child: Column( crossAxisAlignment: CrossAxisAlignment.end, children: <Widget>[ Container( padding: EdgeInsets.only(right: 10), child: TriangleUpWidget(height: 10,width: 14), ), ClipRRect( borderRadius: BorderRadius.circular(2), child: Container( color: _bgColor, width: cellWidth, height: cellH, child: _buildMenuLineCell(dataArr))) ], ), ); } showDialog( context: context, barrierDismissible: false, builder: (context) { return BasePopMenus(child: _buildMenusView(listData)); }); }}class BasePopMenus extends Dialog { BasePopMenus({ Key key, this.child, }) : super(key: key); final Widget child; @override Widget build(BuildContext context) { return Material( type: MaterialType.transparency, child: Stack( fit: StackFit.expand, children: <Widget>[ GestureDetector(onTap: () => Navigator.pop(context)), child ], ), ); }}如果须要扭转弹框的地位,能够批改_buildMenusView()办法中的Positioned组件的边距代码。下面的代码中用到了一个自定义三角形,代码如下。 ...

February 24, 2021 · 2 min · jiezi

关于ios:iOS拍照定制之AVCapturePhotoOutput

问题领导安顿工作,写个拍照性能,界面跟零碎拍照有点出入 拍完照片,底部显示已拍照片,有个拍照下限[在此不管] 点击已拍照片,能够预览、放大放大查看 思路零碎拍照必定不行了,只能定制,没提是否拍照禁止声音的需要[非偷拍,正经人] 原则上能简略就不简单,拍砖AVCapturePhotoOutput 捋捋首先,你须要一块临时以后场景的layer,这里不提,参考上篇[iOS写在定制相机之前] 其次,定义session + photoOutput 再次,定义拍照事件 最初,代理中取得照片 上菜 session定义 input设置 self.session = [[AVCaptureSession alloc] init];self.session.sessionPreset = AVCaptureSessionPresetPhoto;AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];self.dInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];if ([self.session canAddInput:self.dInput]) { [self.session addInput:self.dInput];}拍照场景layer self.preView = [[AVPreView alloc] init];self.preView.backgroundColor = [UIColor colorWithHexs:0x3f3f3f];self.preView.session = self.session;[self.preView setVideoOrientation:AVCaptureVideoOrientationLandscapeRight];[self.view addSubview:self.preView];[self.preView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.view); make.top.equalTo(self.topView.mas_bottom); make.bottom.equalTo(self.collect.mas_top); make.right.equalTo(rightView.mas_left);}];设置photoOutput self.photoOutput = [[AVCapturePhotoOutput alloc] init];if ([self.session canAddOutput:self.photoOutput]) { [self.session addOutput:self.photoOutput];}[self.photoOutput.connections.lastObject setVideoOrientation:AVCaptureVideoOrientationLandscapeRight];session start [self.session startRunning];拍照点击 AVCapturePhotoSettings *set = [AVCapturePhotoSettings photoSettings];[self.photoOutput capturePhotoWithSettings:set delegate:self];AVCapturePhotoCaptureDelegate ...

February 24, 2021 · 1 min · jiezi

关于ios:原生Android集成React-Native

应用React Native从零开始开发一款挪动利用是一件很惬意的事件,但对于一些曾经上线的产品,齐全摒弃原有利用的历史积淀,全面转向React Native是不事实的。因而,应用React Native去对立原生Android、iOS利用的技术栈,把它作为已有原生利用的扩大模块,是目前混合开发的最无效形式。首先,在原生Android我的项目目录下执行以下命令创立一个package.json文件。 yarn init而后,依据提醒输出对应的配置信息。期待命令执行实现之后,咱们会发现Android我的项目的根目录多了一个package.json文件。接下来,应用如下命令增加React和React Native运行环境的反对脚本。 yarn add react react-native执行完命令后,会发现Android我的项目的根目录下多了一个node_modules文件夹,外面蕴含了React Native开发也运行所需的依赖模块,原则上这个目录是不能复制、挪动和批改的。接下来,应用文本编辑器关上package.json文件,配置React Native的启动脚本,如下代码。 "scripts": { "start": "yarn react-native start", },此时,package.json文件的残缺内容如下所示。 { "name": "AndroidDemo", "version": "1.0.0", "main": "index.js", "license": "MIT", "dependencies": { "react": "^17.0.1", "react-native": "^0.63.4" }, "scripts": { "start": "yarn react-native start" }}而后,在Android我的项目的根目录下创立一个index.js文件,该文件是React Native的入口文件,代码如下。 import React from 'react';import {AppRegistry, StyleSheet, Text, View} from 'react-native';class HelloWorld extends React.Component { render() { return ( <View style={styles.container}> <Text style={styles.hello}>Hello, React Native</Text> </View> ); }}const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', }, hello: { fontSize: 20, textAlign: 'center', margin: 10, },});AppRegistry.registerComponent('MyReactNativeApp', () => HelloWorld);接下来,咱们应用Android Studio关上原生Android我的项目,并在app目录的build.gradle文件的dependencies代码块中增加React Native和JSC引擎依赖,如下所示。 ...

February 24, 2021 · 2 min · jiezi

关于ios:音频社交的变声应用了哪些算法

导读:2021开年以来,音频社交市场随同着Clubhouse的爆火再获资本的关注,国内相干产品荔枝、映客都迎来了股价的大幅上涨,预计将来音频化在社交畛域还会有长期且宽泛的需要。 在挪动互联网技术加持下,音频社交不仅能够满足多场景下的社交需要,体验也迎来了变革,尤其是AI+5G技术,对音频社交的驱动将更为显著。很多社交产品会基于音频技术减少变声、美声、立体声、混响和场景化音效等,来丰盛用户的听感体验。本篇技术分享就来讲讲音频社交场景中的变声是利用了哪些算法来实现的。 01 变声是如何实现的?当咱们日常观看视频时,有时会应用倍速播放。在放慢播放速度时,咱们会感觉视频中的男声听起来有点像“女声”;在加快播放速度时,咱们能听到相似于《疯狂动物城》中那个谈话慢悠悠的“树懒声”。这些其实就是简略的变声。 从技术的角度并不难理解,如果咱们用16k的采样率去采集一个100Hz的正弦波,而用32k或者8k的采样率去播放的话,那么这个正弦波的频率就会晋升一倍(200Hz)或者升高一倍(50Hz)。这样将音频的频率升高或者升高的办法很简略,晋升一倍就是每隔一个抛弃一个样本,加快一倍就是进行一个线性插值。用业余的术语来说,这是一个重采样的过程。依照重采样办法是能够实现一个变调的,但同时也很容易发现,音频的工夫变长或者变短了,和咱们原始输出的音频长度不统一了,这在实时通信中是不能承受的。在实时通信中,咱们要的是一个变调不变速的变声性能,繁多的重采样办法是做不到的。当然除了重采样,咱们还有其余的一些变声办法可能实现变调不变速的需要。 02 变声有哪些常见的算法?常见的变调算法有时域、频域和参量法。时域较易实现,多采纳变速不变调+重采样实现变调不变速等。频域以及参量法就绝对简单,并且计算量相比于时域大了很多。本次次要简略介绍一些常见的时域和频域算法。 在时域内次要是OLA(Overlap-Add)类算法:OLA,同步波形叠加法(Synchronized Overlap-Add, SOLA)、固定同步波形叠加法(Synchronized Overlap-Add and Fixed Synthesis, SOLAFS)、时域基音同步叠加法(Time-Domain Pitch Synchronized Overlap-Add, TD-PSOLA) 波形类似叠加法(waveform similarity overlap-and-add, WSOLA)等,频域内次要是基音同步波形叠加算法(Pitch-Synchronized OLA, PSOLA)等。 1)OLA OLA是最简略粗犷的一种TSM形式。对原始语音进行分帧后,距离一段采样点,反复或者抛弃其中某些语音帧来从新建设语音。这样就实现简略的变音成果。原理如下图所示: a.分帧,对时域音频进行分帧解决; b.在输出信号X上加上一个汉宁窗; c.在第一帧后距离固定点数Ha取出第二帧; d.把第二帧语音加窗后与第一帧overlap-add。 如此操作到语音完结就能重建一个新的变调语音。然而这算法存在肯定的局限性,无奈保障语音是间断的,可能会呈现基音断裂的状况。这样的语音听起来会有咔吧声,造成了语音的失真。 2)波形类似叠加法(waveform similarity overlap-and-add, WSOLA) 理解了简略粗犷的OLA算法后,咱们能够清晰的晓得OLA算法的局限和缺点。当然也晓得造成这种缺点的起因是什么:相位不间断导致的。为了减小基音断裂和相位不间断问题,Verhelst和Roelands提出了波形类似叠加法(WSOLA)。目前开源代码soundtouch应用的就是该算法。其原理如下图: a.在原始音频中取出第一帧,让后对该帧进行加窗,输入到y信号上; b+c. 在虚线蓝色范畴内找到第二帧,第二帧相位参数应该和第一个帧相位对齐,在蓝色范畴内寻找与第二帧最类似的帧作为输入帧,作为y信号的第二帧; d. 最为类似的帧与第一帧overlap-add到y信号上 重点在b.c两步操作中,如何寻找最类似的帧。很多论文中给出了一种最间接的办法,计算“自相干”。尽管WSOLA可能解决基音断裂和相位不间断问题,然而它会影响音色,将WSOLA利用于打击乐乐器的音频时,这种景象将会更加的显著。 3)基音同步波形叠加算法(Pitch-Synchronized OLA, PSOLA) PSOLA的算法原理与WSOLA有所不同,PSOLA在频域解决的,它能进一步达到基音同步的目标。在该算法中,变速和变调是两个独立的过程,由不同的参数管制。先对基音进行检测,标记基音周期。通过标记的基音周期将语音划分为多个合成单元。通过反复或者失落合成单元来实现语速的管制。通过扭转相邻合成单元的重叠长度或者重采样联合变速来扭转语音的基频。 PSOLA是对基频进行批改的,因而很好的爱护了共振峰,不会对音色有太大的影响。不过该算法在频域中进行解决的,计算量大,很难满足实时的变速与变调解决。 03 结束语以上简略介绍了三种常见的变声算法,这三种算法能够粗略实现大叔音、萝莉音以及怪兽声等。然而想要做到变声后的声音听起来更加实在天然,就须要进一步的优化调试了。除了这些算法外,还有其余的变声音效,比方常见的“惊悚声”,使用了vibrato或者tremolo算法,还有“山谷空灵音”使用了echo算法等等,这些算法都是基于传统的信号处理实现的。在传统的信号处理变声办法外,还有更高级的变声算法:AI变声。AI变声相比于传统的信号处理办法,会让变声后的声音更加实在天然。 注:文中图片来源于《A Review of Time-Scale Modification of Music Signals》论文 关注拍乐云Pano,咱们会在后续的文章中继续分享对于音视频、实时通信的产品技术常识。

February 22, 2021 · 1 min · jiezi

关于ios:详解SwiftUI中Divider和Spacer的用法和区别最新

Divider和Spacer都能够用到宰割两个视图,然而它们也有一些区别。通过这篇文章咱们将学到这两个控件的应用形式和它们之间的区别。 到公众号【iOS开发栈】学习更多SwiftUI、iOS开发相干内容。Spacerstruct ContentView: View { var body: some View { VStack { Text("Top").background(Color.red) Spacer() Text("Bottom").background(Color.red) } .frame(width: 100, height: 400, alignment: .center) .background(Color.yellow) }}在“Top”和“Bottom”之间增加一个Spacer控件,会把这两个文字隔开,使这两个文字别离位于最上和最上面。 Spacer(minLength: 30)通过设置minLength能够指定被离开的两个视图的最小间隔,如果不指定的话,会有一个默认的间隔。 DividerVStack { Text("Top").background(Color.red) Divider().background(Color.red) Text("Bottom").background(Color.red)}Top和Bottom之间增加一个Divider控件能够在两个视图之间增加一个距离,和下面的Spacer不同的是两头会呈现一根线,background设置的色彩会影响到这根线的色彩。 并且,被Divider宰割的两个视图两头的间隔是固定的,它们不会挪动到父视图的两端。 另外,把Divider的高度别离设置为0之后,被它宰割的两个视图不会靠在一起。然而把Spacer的高度设置为0,被它宰割的两个视图会靠在一起,就和没有被宰割一样。 到公众号【iOS开发栈】学习更多SwiftUI、iOS开发相干内容。总结这篇文章学习了SwiftUI中Spacer和Divider的用法以及它们之间的区别,这两个控件在SwiftUI中尽管简略然而十分的罕用,咱们肯定要相熟。如果你有任何的问题、倡议都能够通过微博或邮件分割到我自己。

February 20, 2021 · 1 min · jiezi

关于ios:iOS写在定制相机之前

问题不是所有的拍照UIImagePickerController都能搞定,理由如下: 1.产品不整点幺蛾子,哪来体验翻新 2.设计不整点幺蛾子,怎能体现用心 3.经营:这体验跟某宝某信咋不一样??? 4.开发:我是被逼成大佬的!!!1.2.3.层层施压,大厂能搞得,你咋搞不了 思路:定制相机,绕不开的问题:UIImagePickerController中那块实时场景怎么搞? 计划上个别是采纳AVCaptureSession + AVCaptureVideoPreviewLayer AVCaptureVideoPreviewLayer继承CALayer, 设置bounds、frame, 可满足简略需要 But, 横竖屏切换、iPhone与iPad共用、视图成果调整【毕竟下面的1.2.话语权广泛大过开发】等此类情况下,frame的形式哪有束缚来的切实 每个view都有一个layer属性,定制view的layer为AVCaptureVideoPreviewLayer, view束缚调整扭转frame即可 上菜 定义一个view @interface AVPreView : UIView@end设置layerClass + (Class)layerClass { return [AVCaptureVideoPreviewLayer class];}为了实时场景,layer即AVCaptureVideoPreviewLayer 是须要设置一个session的 // 设置属性@property (nonatomic, strong) AVCaptureSession *session;// Getter & Setter- (AVCaptureSession *)session { return [(AVCaptureVideoPreviewLayer *)self.layer session];}- (void)setSession:(AVCaptureSession *)session { [(AVCaptureVideoPreviewLayer *)self.layer setSession:session];}须要设置聚焦之类的,此时须要对view上触碰的点转换成摄像头的地位 -(CGPoint)captureDevicePointForPoint:(CGPoint)point{ AVCaptureVideoPreviewLayer *layer = (AVCaptureVideoPreviewLayer *)self.layer; //将屏幕上点击的地位转化成摄像头的地位 return [layer captureDevicePointOfInterestForPoint:point];}Game Over. Code不行,多敲敲。

February 19, 2021 · 1 min · jiezi

关于ios:iTunes备份异常如何提取恢复

iPhone现已复原出厂,itunes之前已备份过,再用手机复原的时候iTunes提醒从未将iPhone备份到此电脑。没有提醒备份不残缺,文件也没损坏,电脑的MobileSync文件夹里备份文件也都有。请问有什么方法提取复原吗,想复原照片视频和备忘录。请问有什么办法或者辅助软件吗?#iPhone备份#[url]https://book.douban.com/douli...[/url][url]https://movie.douban.com/doul...[/url][url]https://www.douban.com/doulis...[/url][url]https://m.douban.com/doulist/...[/url][url]https://book.douban.com/douli...[/url][url]https://movie.douban.com/doul...[/url][url]https://www.douban.com/doulis...[/url][url]https://m.douban.com/doulist/...[/url][url]https://book.douban.com/douli...[/url][url]https://movie.douban.com/doul...[/url][url]https://www.douban.com/doulis...[/url][url]https://m.douban.com/doulist/...[/url][url]https://book.douban.com/douli...[/url][url]https://movie.douban.com/doul...[/url][url]https://www.douban.com/doulis...[/url][url]https://m.douban.com/doulist/...[/url][url]https://book.douban.com/douli...[/url][url]https://movie.douban.com/doul...[/url][url]https://www.douban.com/doulis...[/url][url]https://m.douban.com/doulist/...[/url][url]https://book.douban.com/douli...[/url][url]https://movie.douban.com/doul...[/url][url]https://www.douban.com/doulis...[/url][url]https://m.douban.com/doulist/...[/url][url]https://book.douban.com/douli...[/url][url]https://movie.douban.com/doul...[/url][url]https://www.douban.com/doulis...[/url][url]https://m.douban.com/doulist/...[/url][url]https://book.douban.com/douli...[/url][url]https://movie.douban.com/doul...[/url]

February 18, 2021 · 1 min · jiezi

关于ios:如何查看手机上网数据iOS-系统抓包介绍

大家好,我是小白。 古代社会中,人们曾经越来越离不开手机了,更离不开网络了。那您晓得当您拜访网络时,网络数据中蕴含哪些内容吗? 接下来跟大家介绍一个术语:抓包。对网络数据进行截获和剖析的过程称为抓包,通过抓包,您能够晓得本人应用的 App 在后盾申请和发送了什么数据。 有时候,这些数据中甚至会蕴含大量的的用户隐衷数据。那么问题来了,如何抓包呢?明天,小白介绍一款 iOS 抓包软件:Stream。 首先关上 App Store,下载并装置 Stream 软件。 关上 Stream 之后,首先装置一下 https 证书,并依照提醒信赖证书。 之后点击开始抓包,如果手机提醒是否容许增加 VPN,点击容许。这样手机拜访的网络数据就会被 Stream 记录下来。 接下来,咱们应用其他软件来拜访网络,比方关上浏览器拜访一个网站,而后关上 Stream 软件,点击抓包历史,抉择最新生成的记录,点击某个申请,就能够看到网络申请的数据了。 不看不晓得,一看吓一跳!咱们拜访的网站竟然传输了大量的用户隐衷数据,存在很大的隐衷透露危险。 明天的分享就到这里完结了,如果您也发现了不平安的、透露隐衷数据的利用,记得揭示身边的敌人哦!我是小白,记得点赞哦!

February 18, 2021 · 1 min · jiezi

关于ios:iOS拍照之系统拍照

拍照在App中应用频次高,入门级别间接调用零碎拍照思路:零碎拍照应用UIImagePickerController 1.设置下plist,否则没权限,报错 2.判断摄像头,获取权限,否则弹出界面黑着 3.设置代理,实现代理 4.代理办法中获取拍照的图片/视频 上菜 plist中增加Privacy - Camera Usage Description,文案依据App须要来权限if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { }设置UIImagePickerControllerUIImagePickerController *vc = [[UIImagePickerController alloc] init];// 设置该属性的时候,呈现拍照与拍视频选项vc.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];vc.sourceType = UIImagePickerControllerSourceTypeCamera;vc.delegate = self;vc.allowsEditing = NO;// 设置摄像头[后置摄像头]vc.cameraDevice = UIImagePickerControllerCameraDeviceRear;// 设置闪光模式vc.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;// 设置摄像头模式vc.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo; // 当该模式设置为video的时候,meidaTypes设置呈现拍照与拍视频选项时,先展现video视频拍摄选项// 录制的最大工夫vc.videoMaximumDuration = 10;// 视频品质vc.videoQuality = UIImagePickerControllerQualityTypeHigh;vc.modalPresentationStyle = UIModalPresentationFullScreen;[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:vc animated:YES completion:nil];代理实现#pragma mark - UINavigationControllerDelegate, UIImagePickerControllerDelegate- (void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info { // 获取选中资源类型 NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { // 拍照后果 UIImage *image = nil; if (picker.allowsEditing) { image = [info objectForKey:UIImagePickerControllerEditedImage]; } else { image = [info objectForKey:UIImagePickerControllerOriginalImage]; } [picker dismissViewControllerAnimated:YES completion:nil]; } else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) { // 视频后果 NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL]; // 视频寄存到零碎相册 [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { if (status == PHAuthorizationStatusAuthorized) { [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url]; } completionHandler:^(BOOL success, NSError * error) { if (success) { NSLog(@"保留视频到相册"); } else { NSLog(@"保留视频到相册失败:%@", error); } }]; } else { NSLog(@"无拜访相册权限"); } dispatch_async(dispatch_get_main_queue(), ^{ [picker dismissViewControllerAnimated:YES completion:nil]; }); }]; }}- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [picker dismissViewControllerAnimated:YES completion:nil];}结语:UIImagePickerController使用方便,可拍照、视频。实用于拍照界面无定制、简略取图这类需要 ...

February 18, 2021 · 1 min · jiezi

关于ios:iOS图片预览放大缩小

思路 图片预览,优先思考根底控件UIImageView、UIButton 图片预览中可能需设置不同的mode,优先思考UIImageView typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, UIViewContentModeScaleAspectFit, UIViewContentModeScaleAspectFill, UIViewContentModeRedraw, UIViewContentModeCenter, UIViewContentModeTop, UIViewContentModeBottom, UIViewContentModeLeft, UIViewContentModeRight, UIViewContentModeTopLeft, UIViewContentModeTopRight, UIViewContentModeBottomLeft, UIViewContentModeBottomRight,}图片放大、放大的思路:1. 手势+frame 2.scrollview的zoomScale 很欢快的决定抉择2,不要问为什么,因为我懒,能用零碎提供的,坚定不折腾 上菜 设置页面属性 @property (nonatomic, strong) UIScrollView *mScroll;@property (nonatomic, strong) UIImageView *imgInfo;界面初始化 self.mScroll = [[UIScrollView alloc] initWithFrame:CGRectZero];self.mScroll.backgroundColor = [UIColor colorWithHexs:0x3f3f3f];self.mScroll.maximumZoomScale = 3.0;self.mScroll.minimumZoomScale = 1;self.mScroll.delegate = self;self.mScroll.showsVerticalScrollIndicator = NO;self.mScroll.showsHorizontalScrollIndicator = NO;[self.view addSubview:self.mScroll];[self.mScroll mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.preView);}];self.imgInfo = [[UIImageView alloc] initWithFrame:CGRectZero];self.imgInfo.clipsToBounds = YES;[self.imgInfo setUserInteractionEnabled:YES];self.imgInfo.backgroundColor = [UIColor colorWithHexs:0x3f3f3f];[self.mScroll addSubview:self.imgInfo];[self.imgInfo mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.mScroll); make.width.equalTo(self.mScroll);}];其中maximumZoomScale与minimumZoomScale示意可缩放水平 ...

February 17, 2021 · 1 min · jiezi

关于ios:Flutter-34Flutter进阶教程数据持久化sqflite使用

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) sqflite数据长久化是在挪动端开发中必不可少的技术手段。咱们总是有一些用户信息,利用资源,列表数据等须要存储起来,这里咱们次要来讲基于SQLite数据库的数据贮存。SQLite,是一款轻型的数据库。它的设计指标是嵌入式的,而且曾经在很多嵌入式产品中应用了它,它占用资源十分的低,在嵌入式设施中,可能只须要几百K的内存就够了。更多详细信息能够参考:维基百科、百度百科。Flutter曾经帮忙咱们封装了操作SQLite的库,它就是:sqflite 集成sqflite库应用sqflite第三方库须要咱们在pubspec.yaml文件先增加库的名字和版本号在dependencies字段下增加: sqflite: ^1.1.3这里以1.1.3为例增加实现后保留一下,VSCode默认会执行pub get帮咱们把须要的库下载下来,同样咱们也能够在我的项目根目录下执行pub get来手动拉取须要的库。 1. 创立本地数据文件static Future<SqfliteManager> _initDataBase() async {SqfliteManager manager = SqfliteManager();String dbPath = await getDatabasesPath() + "/$sqlName";if (manager.db == null) { manager.db = await openDatabase( dbPath, version: 1, onCreate: (db, version) async { /// 如果不存在 以后的表 就创立须要的表 if (await manager.isTableExit(db, tableName) == false) { await db.execute(CREATE_DATA_TABLE); } }, );}return manager;}首先咱们通过getDatabasesPath()函数获取到本地保留数据库文件的门路,在此门路前面拼接上咱们的数据库文件名字,就是保留数据库文件的门路。在iOS中该门路在沙河门路下的Documents文件夹内,在Android中时默认数据库目录。之后咱们申明一个Database对象,用来保留数据库操作对象 Database db;先判断此对象是否存在,如果不存在咱们调用openDatabase来创立这里传入后面获取到的数据库地址,版本号,和onCreate回调函数。在onCreate回调外部判断是否存在咱们须要应用的表名字,如果不存就执行创立数据库表的sql语句。 除了onCreate回调,还有onUpgrade、onDowngrade、onOpen等回调。另外一个参数singleInstance它示意当传入雷同的数据库门路是否返回同一个的实例对象,默认是true2. 插入数据鉴于sqflite帮咱们做了很多工作,所以在应用根本的增、删、改、查也很简略 /// 插入数据 Future<int> insertData(Map<String, dynamic> value) async { return await db.insert(tableName, value); }只须要传入表名字和要插入的数据就行咱们再来看一下insert函数的其余参数 ...

February 16, 2021 · 2 min · jiezi

关于ios:Flutter-33Flutter进阶教程http请求和FutureBuilder

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) 异步申请在挪动开发过程中很多时候咱们都须要依赖异步申请数据而后再来刷新UI。在用户关上界面的时候,先给出一个Loading提醒,等数据申请实现后,咱们再把数据展现在页面上,这是很常见的操作。 异步申请的益处就是不会阻塞主线程,用户尽管在“等”,然而页面不会卡死。同步申请不适应于这种状况,同步申请会呈现页面卡死景象,此时用户不能点击(即便点击也没有成果),体验十分不好。所以大多数时候咱们都是应用异步申请来获取数据 http 库在Flutter中,咱们能够用http库来做网络申请,它反对异步申请,并且有良好的API接口应用http库的步骤: 在我的项目中,关上pubspec.yaml文件找到dependencies字段,在上面增加http: ^0.12.2,其中0.12.2是版本号而后保留pubspec.yaml 并执行pub get命令把咱们要应用的第三方库下载下来具体 pub get命令的应用在之前的文章有介绍过 而后在要应用http库的文件外面引入头文件 import 'package:http/http.dart' as http;发送http申请的代码也比较简单,咱们这里以get申请为例 http.get("https://cdn.jsdelivr.net/gh/johnson8888/blog_pages/images/request_demo_test.json");只有传入要申请的地址即可,这里的URL地址是我本人上传的测试文件。 http 异步申请返回后果后面我晓得http库发送申请是反对异步的,那么异步申请的返回后果咱们该如何接管呢? 通过then函数获取,在get申请之后咱们能够间接跟上then函数来作为回调,在回调外部能够获取到申请的后果http.get(getURL).then((value) { print(value);});这样写的确很不便,但当咱们的网络申请很多,并且一个网络申请依赖另外一个网络申请的时候,这个时候就会多个回调函数嵌套在一起(又称为回调天堂),代码就会显得很凌乱,很不适宜Debug。 应用await来接管异步操作的后果var data = await http.get(getURL);这样写代码就比下面的代码清新多了然而须要留神的是,如果函数外部有被await润饰的办法,那么函数应该被async来润饰,并且返回值须要被Future润饰,Future是一个延时计算的对象,在被await润饰的函数返回的时候能力拿到Future的具体值。示例入下: Future<Map> getData() async { var data = await http.get(getURL); return data.body; }刷新页面咱们后面曾经晓得:调用setState()函数能够刷新页面,所以在http申请之后咱们调用setState()函数即可刷新页面 http.get(getURL).then((value) { print(value); var data = jsonDecode(data.body); setState(() { /// 此处执行刷新页面的代码 });});应用FutureBuilder来刷新页面setState()诚然是能够刷新页面,然而当咱们页面内有多个网络申请的时候,就会不停的调用setState()来全量刷新页面,显然这就有点冗余。Flutter为咱们提供了更好的形式来实现获取数据并且刷新UI的操作,那就是FutureBuilder来看它的初始化办法 const FutureBuilder({ /// key Key key, /// 异步的操作 this.future, /// 初始化数据 this.initialData, /// 构建UI的函数 @required this.builder,})由构造函数可见,咱们须要传入future参数,也就是咱们的耗时操作函数,还须要传入builder函数在builder办法里能够捕捉到两个参数BuildContext context和AsyncSnapshot snap其中snap的属性会携带future的耗时函数的返回值,也就是说:在耗时操作函数返回后果之后,咱们能够在builder办法内获取到这一返回值。所以下面的申请咱们也能够这么来实现: ...

February 15, 2021 · 1 min · jiezi

关于ios:Flutter-32Flutter进阶教程路由Router和导航Navigator以及传值

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) 路由在挪动开发中,咱们管页面之间的跳转叫做路由。在iOS中指的就是ViewController之间的跳转,在Android中就是Activity之间的跳转。路由是在挪动端开发中十分重要的概念,它负责管理着各个页面之间的跳转还有传值工作,是必不可缺少的控件。 路由Map为了不便咱们治理跳转页面,Flutter为咱们 提供了路由Map。路由Map由在main.dart文件外面MaterialApp的参数routes治理,routes参数接管一个Map,Map外面就是咱们我的项目的路由Map,你能够关上我的我的项目看到routes参数如下: routes: { "/": (context) => MainPage(), "TextDemoPage": (context) => TextDemoPage(), "RaisedButtonDemoPage": (context) => RaisedButtonDemoPage(), "FlatButtonDemoPage": (context) => FlatButtonDemoPage(), "OutlineButtonDemoePage": (context) => OutlineButtonDemoePage(), "IconButtonDemoPage": (context) => IconButtonDemoPage(), "ContainerDemoPage": (context) => ContainerDemoPage(), "StatefulWidgetDemoPage": (context) => StatefulWidgetDemoPage(), "TextFieldDemoPage": (context) => TextFieldDemoPage(), "ImageDemoPage": (context) => ImageDemoPage(), "ColumnDemoPage": (context) => ColumnDemoPage(), "RowDemoPage": (context) => RowDemoPage(), "FlexibleDemoPage": (context) => FlexibleDemoPage(), "WrapDemoPage": (context) => WrapDemoPage(), "ListViewDemoPage": (context) => ListViewDemoPage(), "GridViewDemoPage": (context) => GridViewDemoPage(), "BottomNavigationBarDemoPage": (context) => BottomNavigationBarDemoPage(), "RouterDemoPage": (context) => RouterDemoPage(), "RouterDemoPage2": (context) => RouterDemoPage2(),},其中key为/对应的Value是整个Flutter我的项目的入口页面,这里须要另外一个很重要的参数initialRoute来配合应用咱们给initialRoute参数传值如下: ...

February 14, 2021 · 1 min · jiezi

关于ios:Flutter-31Flutter进阶教程底部导航栏BottomNavigationBar使用

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) BottomNavigationBarBottomNavigationBar 和 BottomNavigationBarItem 配合来独特展现Flutter外面的底部状态栏,底部状态栏是在挪动端很重要的控件。 先看一下 BottomNavigationBar构造方法 BottomNavigationBar({ // key Key key, /// BottomNavigationBarItem 数组 @required this.items, /// 点击事件办法 this.onTap, /// 以后选中的 元素下标 this.currentIndex = 0, /// 底部导航栏的Z坐标 this.elevation, /// 默认是 BottomNavigationBarType.shifting 个别咱们应用 BottomNavigationBarType.fixed this.type, /// 选中我的项目色彩的值 Color fixedColor, /// 背景色彩 this.backgroundColor, /// BottomNavigationBarItem图标的大小 this.iconSize = 24.0, /// 选中时图标和文字的色彩 Color selectedItemColor, /// 未选中时图标和文字的色彩 this.unselectedItemColor, // 选中时的子Item的款式 this.selectedIconTheme, /// 未选中时的子Item的款式 this.unselectedIconTheme, // 选中时字体大小 this.selectedFontSize = 14.0, /// 未选中时的字体大小 this.unselectedFontSize = 12.0, /// 选中的时候的字体款式 this.selectedLabelStyle, /// 未选中时的字体款式 this.unselectedLabelStyle, /// 是否为未抉择的BottomNavigationBarItem显示标签 this.showSelectedLabels = true, //// 是否为选定的BottomNavigationBarItem显示标签 this.showUnselectedLabels, /// pc端或web端应用 this.mouseCursor,})咱们来做一个点击底部状态栏按钮切换色彩的Demo ...

February 13, 2021 · 1 min · jiezi

关于ios:Flutter-212Flutter手把手教程UI布局和Widget网格列表GridView

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) GridViewGridView 是一个好用的网格布局控件,它的很多属性跟后面提到的ListView是一样的,反复的属性这里就不赘述了。咱们重点理解初始化办法GridView.count的应用,还有两个代理SliverGridDelegateWithFixedCrossAxisCount、SliverGridDelegateWithMaxCrossAxisExtent的参数以及应用。 GridView.count咱们先来看GridView.count的构造函数 GridView.count({ /// key Key key, /// 布局方向 Axis scrollDirection = Axis.vertical, /// 是否 倒序显示 bool reverse = false, /// ScrollController用于管制滚动地位和监听滚动事件 ScrollController controller, /// 是否应用默认的controller bool primary, /// 滚动成果 能够通过此参数 设置 GridView 不可滚动 ScrollPhysics physics, /// 是否依据子控件的总长度来设置 GridView 的长度,默认值为false bool shrinkWrap = false, /// padding EdgeInsetsGeometry padding, /// 穿插轴 子控件的个数 @required int crossAxisCount, /// 主轴方向的间距 double mainAxisSpacing = 0.0, /// 穿插轴方向子元素的间距 double crossAxisSpacing = 0.0, /// 子控件的宽高比例 double childAspectRatio = 1.0, // 在 敞开屏幕时 是否开释子控件 bool addAutomaticKeepAlives = true, /// 是否 防止列表项重绘 bool addRepaintBoundaries = true, /// 该属性示意是否把子控件包装在IndexedSemantics里,用来提供无障碍语义 bool addSemanticIndexes = true, // 预加载子控件的个数 double cacheExtent, /// 子控件的数组 List<Widget> children = const <Widget>[], /// 子控件的数量 int semanticChildCount, DragStartBehavior dragStartBehavior = DragStartBehavior.start, ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual,})这里要说的是有两个比拟重要的参数crossAxisSpacing和childAspectRatio,这个两个参数是用来定义子控件大小的。 ...

February 12, 2021 · 1 min · jiezi

关于ios:Flutter-211Flutter手把手教程UI布局和Widget列表ListView

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) ListViewListView是在挪动端十分常见的控件,在大多数的展现场景中都离不开ListView。在Flutter中对ListView的封装也十分好,简略几行代码就能够满足咱们布局一个滚动列表的需要。 先来看一下构造函数: ListView({ /// key Key key, /// 布局方向 Axis scrollDirection = Axis.vertical, /// 是否 倒序显示 bool reverse = false, /// ScrollController用于管制滚动地位和监听滚动事件 ScrollController controller, /// 是否应用默认的controller bool primary, /// 滚动成果 能够通过此参数 设置 ListView 不可滚动 ScrollPhysics physics, /// 是否依据子控件的总长度来设置ListView的长度,默认值为false bool shrinkWrap = false, /// padding EdgeInsetsGeometry padding, /// 子控件高度 this.itemExtent, // 在 敞开屏幕时 是否开释子控件 bool addAutomaticKeepAlives = true, /// 是否 防止列表项重绘 bool addRepaintBoundaries = true, /// 该属性示意是否把子控件包装在IndexedSemantics里,用来提供无障碍语义 bool addSemanticIndexes = true, // 预加载子控件的个数 double cacheExtent, /// 子控件数组 List<Widget> children = const <Widget>[], /// 子控件的个数 int semanticChildCount, DragStartBehavior dragStartBehavior = DragStartBehavior.start, ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual,})builderFlutter给咱们提供了四种结构ListView的办法,有ListView()、ListView.builder()、ListView.separated()、ListView.custom()、 ...

February 10, 2021 · 2 min · jiezi

关于ios:001-dealloc-block-讲好一个故事iOS-面试题

1, 开篇本文试图答复,如下问题: 1, 对象 dealloc 的时候,用一个 block 代替 dealloc 办法 不是类级别管制,是对象级别管制 2,关联对象 3,锁 本文是面试照着念主题,第 2 篇本文有参考 C.../CYLDeallocBlockExecutor 1, 怎么用好 block,让 dealloc 再见因为对象开释的时候,对象的关联对象也会开释。 把对象开释的时候,要执行的 block ,放在其关联对象的 dealloc 办法中。 附加:typedef void (^VoidBlock)(void);@interface BlockExecutor : NSObject { VoidBlock block;}@property (nonatomic, readwrite, copy) VoidBlock block;- (id)initWithBlock:(VoidBlock)block;@end@implementation BlockExecutor@synthesize block;- (id)initWithBlock:(VoidBlock)aBlock{ self = [super init]; if (self) { block = [aBlock copy]; } return self;}- (void)dealloc{ if (block != nil) { block(); block = nil; }}@endconst void *runAtDeallocBlockKey = &runAtDeallocBlockKey;@interface NSObject (RunAtDealloc)- (void)runAtDealloc:(VoidBlock)block;@end@implementation NSObject (RunAtDealloc)- (void)runAtDealloc:(VoidBlock)block{ if (block) { BlockExecutor *executor = [[BlockExecutor alloc] initWithBlock:block]; objc_setAssociatedObject(self, runAtDeallocBlockKey, executor, OBJC_ASSOCIATION_RETAIN); }}@end调用 ...

February 10, 2021 · 3 min · jiezi

关于ios:Flutter-210Flutter手把手教程UI布局和Widget流式布局Wrap

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) Wrap在Flutter中Wrap是流式布局控件,Row和Column在布局上是很好用,然而有一个毛病,如果当子控件数量过多导致Row或Column装载不下的时候,就会呈现UI页面上的谬误。Wrap能够完满的防止这个问题,当控件过多一行显示不全的时候,Wrap能够换行显示。 当然Wrap跟Row和Column有着很多类似的中央。咱们先来看Wrap的构造函数: Wrap({ // Key Key key, // 子控件显示方向, 有垂直方向 程度方向两个值 this.direction = Axis.horizontal, /// 子控件的 布局形式 跟Column的 mainAxisalignment相似 this.alignment = WrapAlignment.start, /// 子控件 主轴方向间距 this.spacing = 0.0, /// 子控件 穿插方向的 布局形式 this.runAlignment = WrapAlignment.start, /// 子控件 穿插方向间距 this.runSpacing = 0.0, /// 穿插轴的对齐形式 与 Column 的crossAxisAlignment 一样 this.crossAxisAlignment = WrapCrossAlignment.start, /// 书写方向 与 Column的 textDirection 一样 this.textDirection, /// Wrap穿插轴方向上子控件的布局方向 this.verticalDirection = VerticalDirection.down, /// 裁剪形式 this.clipBehavior = Clip.hardEdge, /// 子控件 List<Widget> children = const <Widget>[],}) 上面咱们就来看看这些参数 ...

February 9, 2021 · 1 min · jiezi

关于ios:Flutter-29Flutter手把手教程UI布局和Widget弹性布局控件Flexible

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) FlexibleFlexible能够帮忙Row、Column、Flex的子控件充斥父控件,它的用法很灵便,也具备权重的属性。跟Flexible相相似的控件还有Expanded。先来看Flexible的构造函数 const Flexible({ /// key Key key, // 默认 flex 的值为 1 this.flex = 1, /// 默认 fit参数为 FlexFit.loose 示意子控件能够以最小的大小来布局 this.fit = FlexFit.loose, @required Widget child,}) 按比例布局Flexible的参数flex是示意比例的值。 如果咱们在Column外部有三个子控件,每个控件的flex值都设置为1那么这三个子控件的高度都是Column高度(Row的状况下就是宽度)的三分之一,也就是三个子控件均分了Column的高度(Row的状况下就是宽度) Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Flexible( child: Image.asset("images/image_demo.jpg"), flex: 1, ), Flexible( child: Image.asset("images/image_demo.jpg"), flex: 1, ), Flexible( child: Image.asset("images/image_demo.jpg"), flex: 1, ), ],)如下图: 而后咱们把flex的值别离设置为1、2、3,那么这个三个控件的高度别离是五分之一、五分之二、五分之三的高度 Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Flexible( child: Image.asset("images/image_demo.jpg"), flex: 1, ), Flexible( child: Image.asset("images/image_demo.jpg"), flex: 2, ), Flexible( child: Image.asset("images/image_demo.jpg"), flex: 3, ), ],)成果如下图: ...

February 9, 2021 · 1 min · jiezi

关于ios:Flutter-28Flutter手把手教程UI布局和Widget水平布局控件Row

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) RowRow是在Flutter中常见的布局控件,它负责程度方向布局。Column负责垂直方向布局,二者都是继承于Flex,相似于iOS外面的UIScrollView,然而又有很多不同。 Row的构造函数与Column的构造函数根本是一样的 Row({ /// key Key key, /// Row的对其形式 默认是 MainAxisAlignment.start MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start, /// 示意Row在垂直方向占用的大小,默认是 max,示意尽可能的充斥垂直方向空间。如果这是 min示意尽量小的占用垂直方向空间 MainAxisSize mainAxisSize = MainAxisSize.max, /// 程度方向对其形式 默认是 居中对齐 CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, /// 子控件的布局程序,不同国家书写习惯的不同(中文、英语从左往右书写,阿拉伯文从右往左书写),这个参数能够帮忙咱们调整布局显示程序 TextDirection textDirection, /// 示意垂直方向的对其方向 VerticalDirection verticalDirection = VerticalDirection.down, /// 基线对齐形式 TextBaseline textBaseline, /// 子控件 List<Widget> children = const <Widget>[],})mainAxisAlignmentmainAxisAlignment接管一个MainAxisAlignment类型的枚举,MainAxisAlignment共有六个枚举值,如下: 枚举值形容start与 开始的地位对齐end与 完结的地位对齐center居中对齐spaceBetween把残余的空间拆分成n-1份(n是子控件的个数) 每一份都插入到子控件之间spaceEvenly把残余的空间拆分成n+1份(n是子控件的个数) 而后均匀分布spaceAround把残余空间拆分成 2n 份(n是子控件的个数) 每个子控件高低各放一份MainAxisAlignment.start 居左侧 MainAxisAlignment.center 居两头 ...

February 8, 2021 · 1 min · jiezi

关于ios:前端面试每日-31-第662天

明天的知识点 (2021.02.07) —— 第662天 (我也要出题)[html] 你感觉新开发一个网站最艰难的是哪些局部?[css] 请应用纯css画出一条虚线,并设置虚线的间隙(不能应用图片)[js] 浏览器中的剪切板是如何监听复制事件的?[软技能] 说说你对程序员都会修电脑的了解《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

February 7, 2021 · 1 min · jiezi

关于ios:为了能让你们用上flutter我准备做几期视频教程

前言又到了一年一度的春节假期,又是拉开人与人之间差距的时刻了!去年因为疫情的起因,我在家自学了近一个月的flutter,而后在github上啪啦啪啦地写了一堆flutter我的项目,收到相当不错的反应. 上面是我那个期间写的flutter我的项目,感兴趣的能够拿去把玩把玩。 flutter残缺学习我的项目FlutterSample: https://github.com/xuexiangjys/FlutterSampleflutter模版我的项目flutter_template: https://github.com/xuexiangjys/flutter_templateflutter版本更新插件flutter_xupdate: https://github.com/xuexiangjys/flutter_xupdateflutter版本更新弹窗组件flutter_update_dialog: https://github.com/xuexiangjys/flutter_update_dialogflutter版本更新案例flutter_app_update_example: https://github.com/xuexiangjys/flutter_app_update_example那么往年的春节你打算怎么过呢?有没有好好考虑一下,趁着他人都在假期里打游戏刷抖音旷废工夫,跟着我好好学习一把,来一个弯道超车呢? 决定做几期视频教程其实学习flutter并不是很难,只有你有肯定的挪动端开发教训的话,置信你能够在很短的工夫就能够轻松把握flutter的开发. 之前也写过一些介绍flutter的文章, 不过感觉大家的播种并不是很大,可能只是简略地看看而没有亲自上手去做一些理论的利用开发,并不能激发大家的趣味. 其实我之前就已经说过:要想学习一门技术,最好的形式就是入手去做.很多时候从书本上或者文章中获取到的常识是相当便宜的,这种常识放在考试中可能还算管用,然而当咱们走进社会后就会发现,那些个常识基本上是踏出了校门就会遗记的,因为那些常识自身就不属于你,只有那些在你理论入手实际中领悟到的常识,才是真正属于你的. 所以为了可能进步大家的入手能力,帮忙大家更无效地学习,同时也是帮忙我本人复习一部分的flutter常识,我决定启动Flutter系列视频教程制作. 上面是我做的第一期flutter视频,干货满满哟: https://www.bilibili.com/vide... 对标的就是我之前公布的文章: 疾速上手系列--Flutter利用开发模板 在将来的工夫里,我将陆续做一些flutter相干的教学视频分享给大家,因为思否不反对视频的上传, 感兴趣的能够关注一下我的哔哩哔哩账号: xuexiangjys, 或者是我的微信公众号: 【我的Android开源之旅】,我会定期公布到以上两个平台上的哟.

February 6, 2021 · 1 min · jiezi

关于ios:IOS-为什么-UIPanGestureRecognizer-不起作用

如果你设置的 UIPanGestureRecognizer 不起作用,可能是因为 UIPanGestureRecognizer 初始化形式不对。 如上面代码所示,如果你在成员变量外面初始化,并且指定 target 为 self,这会导致 onPan 办法无奈被调用。 class YourView: UIView { var uiPan = UIPanGestureRecognizer(target: self, action: #selector(onPan)) init() { addGestureRecognizer(uiPan) } @objc func onPan() { //... }}能够抉择先初始化,随后在绑定 target。 上面的代码将会失常工作。 class YourView: UIView { var uiPan = UIPanGestureRecognizer() init() { uiPan.addTarget(self, action: #selector(onPan)) addGestureRecognizer(uiPan) } @objc func onPan() { //... }}

February 5, 2021 · 1 min · jiezi

关于ios:开源-MoonLight-助你实现更好的-iOSMac-自动化性能测试

作者:MoonLight 开源我的项目作者、声网Agora Echoo J什么是 MoonLight?MoonLight 是 iOS/Mac 上的轻量化的性能测试组件,它能够独自集成在任何 App 中实现自动化性能数据的采集,你能够十分轻松的获取到 App CPU、System CPU、App Memory、System GPU 以及 GPU Info 的数据。MoonLight 由声网Agora 开发,并已开源至 Github。 开源地址:https://github.com/AgoraIO-Community/MoonLight 比照其余的性能测试工具InstrumentsMoonLight采集到的性能数据是根本和Instruments保持一致的。具体的优劣比照如下: Instruments无奈实现性能自动化,无奈将获取到的性能数据提取进去进行剖析,最初提供进来的性能数据准确度不够,存在人为误差。MoonLight能够解决这个问题。Instruments无奈实现近程性能测试,天然也无奈实现高并发的性能测试,通常来说须要一台设施连贯USB线后测试,而后一台测试完再测试下一台。MoonLight能够一次性测试十分多台,也没有必须连贯数据线的要求。高版本的Instruments无奈测试一些低端零碎机器的性能,MoonLight能够完满反对。对于macOS上的App, Instruments是不反对GPU的输入,MoonLight反对。进过测试,GPU的输入和macOS自带的流动管理器GPU输入保持一致。Instruments长处是数据可视化,并且能够提供内存透露测试。MoonLight临时不提供数据可视化,然而因为MoonLight是可编程的,当开发者拿到相干的性能数据后, 能够自行实现数据上报或者可视化的解决。GTGT不反对macOS,MoonLight反对。GT采集到的App Memory数据和Instruments是不统一的。GT 无奈输入 GPU、System CPU, 然而MoonLight能够。GT集成到App中,须要增加十分多的依赖库,勾销掉Bitcode反对,本身也比拟宏大,并且会减少App的包大小。MoonLight更轻量化,对于iOS仅仅只须要减少一个零碎库,对于Mac不须要减少任何的零碎库。PerfdogPerfdog无奈反对macOS上的App的性能测试。Perfdog并非是一个自动化的性能测试工具,长处是数据可视化。Perfdog并非是一个开源的测试工具,之前在iOS 14上呈现过App CPU不准的Bug, 而咱们也并不分明其实现的原理和代码,将来仍旧有可能在某些零碎上呈现性能项测试不准的状况。RequirementsiOS 8.0+macOS 10.11+InstallationCocoapodsiOS:Warning! For iOS, do not use it on AppStore release. Recommend use it on debug mode. pod 'MoonLight_iOS', :configurations => ['Debug']macOS:pod 'MoonLight_macOS'Usage// Step1: create MoonLight instance and set sampling interval. _moonLight = [[MoonLight alloc]initWithDelegate:self timeInterval:1];// Step2: start timer. [_moonLight startTimer];// Step3: through the callback, you can get all the performance data per interval.- (void)captureOutputAppCPU:(float)appCPU systemCPU:(float)systemCPU appMemory:(float)appMemory gpuUsage:(float)gpuUsage gpuInfo:(NSString *)gpuInfo { NSLog(@"appMemory:%f", appMemory); NSLog(@"appCPU:%f", appCPU); NSLog(@"gpuUsage:%f", gpuUsage); NSLog(@"systemCPU:%f", systemCPU); NSLog(@"gpuInfo:%@", gpuInfo);}// Step4:if you want to stop capturing the performance data, use "stopTimer". [_moonLight stopTimer];MoonLight 自测的后果iOS/Mac MoonLight 本身的性能耗费非常低,简直能够忽略不计;测试的过程中,性能输入稳固;App CPU、System CPU、App Memory、GPU 能够和Instruments或者流动监视器后果保持一致。 ...

February 3, 2021 · 1 min · jiezi

关于ios:DevOps进行时iOS应用自动推送的方法研究与实践-IDCF

摘要主动推送指通过主动的形式将挪动端利用推送至相应的公布平台供客户下载应用。目前研发核心曾经实现了开放平台、主机平台以及挪动平台等支流开发语言的集中构建,随着挪动端利用逐步成为人们生存中应用最频繁的程序,研发核心挪动端利用也呈井喷式的增长,iOS平台作为挪动端重要的组成部分之一,因为其自身产品零碎的独特性以及挪动利用迭代频繁的特点,在实现了集中构建当前,推送至苹果商店这一环节始终处于手工上传的形式。 为了适应我的项目投产须要与核心构建公布整体倒退思路保持一致,在进行了大量我的项目实际的根底上本文提出了可借鉴的主动构建推送办法,旨在帮忙我的项目实现齐全自动化的构建推送,将指标码间接推送至苹果商店,无效治理我的项目证书和代码的同时,缩小不必要的交互,进步投产效率并为后续的测试和自动化部署积攒丰盛的教训。 关键词:主动推送、TFS、指标码、继续集成 一、钻研背景苹果操作系统次要包含OSX和iOS,其次要的开发语言为Objective-C、Swift以及Javascript,应用LLVM编译器框架零碎,前端应用Clang编译器。目前研发核心投产运行的苹果利用次要应用Objective-C和Javascript语言开发,苹果公司为每一个利用都设置了证书以保障信息在互联网中平安传输,分为公司版证书程序和企业版证书程序,这两类证书对程序的公布路径起着至关重要的作用: 公司版证书:属于“组织”类别,性能用处与个人版证书统一,容许多个开发者合作开发,只能用于将利用公布至苹果App Store。企业版证书:属于“组织”类别,容许多个开发者合作开发,只能用于将利用公布至企业外部应用。因为iOS利用具备上述特点,证书对于iOS利用的投产和上线起到了至关重要的作用并且与研发核心现有投产体系存在较大差别,目前大多采纳手动公布的模式。面对挪动端利用投产上线的理论状况,在实现集中构建工作当前,将利用公布至苹果App Store这一环节的自动化形式成为亟待解决的问题。 二、技术术语2.1 编译一般来说编译过程次要分为以下四局部: 预处理(Pre-process),把宏替换,删除正文信息,将头文件进行开展,产生.i文件。编译(Compliling),把.i文件转换成汇编语言产生.s文件。汇编(Asembly),将.s文件转换成机器编码文件,产生.o文件。链接(Link),对.o文件中的所提到的的库文件进行援用(包含多个.o文件进行link),生成最初的可执行文件。2.2 开发语言iOS开发语言次要包含:C语言根底、Objective-C、Swift以及Javascript编程语言。 Objective-C:是裁减C的面向对象编程语言,它是一个用C写成很小的运行库,令应用程序尺寸减少很小,齐全兼容C语言,能够应用GCC和Clang运行的零碎上进行编译,目前研发核心次要应用该语言进行开发。Swift:于2014年WWDC公布的新开发语言,可与Objective-C独特运行于Mac OS和iOS平台,为了使Swift语言易用性和功能性更加杰出,苹果公司也在一直的对编译器进行优化和改良。以目前最新版本Xcode7版本为例,应用LLVM7.1(Xcode7.3)编译器,该编译器是自Xcode5将GCC编译器勾销后始终应用的,LLVM编译器的前端是Clang,反对C、C++、Objective-C和Objective-C++等编程语言。JavaScript:该脚本语言是苹果公司在iOS7之后推出的基于JavaScriptCore.framework框架的开发方式,实现Objective-C与Javascript互相调用并传参的办法,应用此框架能够在iOS利用中运行JavaScript脚本,也就是HybirdApp混合模式挪动利用,即其中蕴含原生的构造有内嵌有web组件,这种App不仅性能和用户体验能够达到和原生所差无几的水平,更大的劣势在于bug修复快,版本迭代无需从新编译公布,目前研发核心越来越多的我的项目开始采纳此种开发模式。2.3 iOS构建公布因素iOS利用从构建到公布利用个别会经验三个阶段:在Xcode(苹果程序开发工具)上运行调试、在设施上运行调试和编译公布。 苹果为了避免非法设施和非开发人员调试和公布利用,须要应用配置概要文件(Provisioning Profiles)管制利用在设施上运行调试和编译公布。配置概要文件由证书(certificates)、我的项目标识(Identifiers)以及设施(Devices)组成,具体的编译公布流程如下: 图1 证书(Certificates):苹果官网颁布的证书,分为开发证书和公布证书两种,苹果是发布者,而后装置,这个证书的Mac就是拥有者。苹果就会给电脑授予这个证书所对应的权力,简略来说,证书是iOS利用开发的根底,也是构建的必要组成部分。我的项目标识(Identifiers):Identifiers即“标识符”,约等于是我的项目的身份证,用于区别苹果利用,每个利用都有各自惟一的标识符,我的项目标识包含:App ID其实就是一个App的身份证,一个App的地位标识。在Project中称为Bundle ID。在Member Center、Project、ITunes Connect都是须要此ID去标识APP的唯一性。Bundle ID在不同环境下的体现关系,如下图所示: 图2 在创立App ID过程中能够配置该利用的权限,比方是否用到了PassBook,GameCenter,以及更常见的push服务,如果选中了push服务,那么就能够创立生成具备推送服务的App ID,所以,在所有和推送相干的配置中,首先要做的就是先开明反对推送服务的App ID。 设施(Devices):Devices作用为创立测试设施,只有在此列表中的设施能力装置真机调试阶段的苹果利用,未在该列表中的设施则不能装置,个别状况下该列表中设施总数不能超过100个。配置概要文件(Provisioning Profiles):配置概要文件是很有苹果特点的设置,该文件将证书(Certificates) 、我的项目标识(Identifiers)、设施(Devices)联合起来,造成一个形容证书、标识符的形容文件。通过Xcode编译的过程将配置概要文件与程序关联起来从而造成待发布苹果App。三、问题形容推送是将构建并测试通过的苹果利用公布到利用市场期待审核的过程,对于苹果利用而言,个别分为两局部: 第一局部是将待投产的程序包上传至苹果服务器进行程序及配置文件的主动扫描,次要在代码层面进行查看。第二局部是在机器扫描通过后进行利用市场公布的最初检测,次要针对程序的性能和性能进行人为测试。通过后期集中构建状况剖析和经验总结,在实现了全行苹果利用集中构建的根底上,如何代替人工上传形式,将待投产程序主动推送至苹果服务器进行审核,成为了影响苹果继续集成效率的关键点,经后期手动推送利用的状况剖析和经验总结,对我的项目症结有了大抵的分类和判断,总体来说iOS主动推送次要问题集中在如下几点: 1)推送形式多样iOS分为两种形式推送形式: 一种是通过开发工具Xcode在手动实现构建后间接通过界面上传至苹果商店。第二种是通过Xcode中自带的上传工具Application Loader进行上传,尽管界面不同,但其最终上传界面和代码没有本质区别。2)推送环境非凡iOS我的项目开发需在苹果操作系统macOS中进行,开发工具个别采纳Xcode,目前研发核心苹果集中构建在内网环境中解决,尽管构建环境对立,但因为两网隔离的制约,推送至苹果商店及相干公布平台形式不尽相同。 3)推送管理工具多样iOS我的项目开发大多在苹果笔记本上进行,配置库采纳GIT版本控制系统较多,公布后果除了苹果平台以外,没有对立的管理机制,在代码品质、版本稳定性以及版本追溯等方面对我的项目投产上线产生极大的影响。 4)公布操作简单人工成本高苹果公司对每一个公布的iOS利用都采纳证书受权机制,通过编译将证书进行注入,起到认证和治理的目标,但因为证书的唯一性,在日常开发过程中是无奈应用苹果受权证书进行打包并生成iOS利用的,尤其这对须要进行大规模测试的我的项目来说影响较大,我的项目上线则须要将代码拷贝至组织级构建管理员处进行编译后公布。 为了更好的解决iOS我的项目推送问题,应从推送形式动手,梳理iOS利用推送特点的同时,总结出实用于不同我的项目状况的推送办法,解决因为公布形式和公布路径不同对苹果利用投产产生的影响,晋升整体集成效率,升高投产危险。 四、解决方案4.1 构建推送日志剖析通过大量的手工编译和推送并对日志进行剖析总结得出目前研发核心iOS利用推送一共分为两种状况: 一种是公布至苹果商店对客进行下载,这种我的项目须要公布至苹果商店供苹果设施客户进行下载。第二种是企业外部需要间接在企业外部发放应用的利用。通过查看Build日志能够进一步的理解苹果程序编译推送过程的工作原理晋升开发及治理工作效率,在少数状况下Build编译日志暗藏了大量的信息,其中常常会有一些通用的编译命令,以这些命令为根底能够更好的对编译日志进行模块化的解读和钻研。 CompileC...:次要用来编译.m和.c文件,在每一个target中被宽泛应用,生成两头文件.o,个别呈现在Compile步骤的行首地位。 图3 Libtool...:次要是从指标文件中构建library,即生成.a文件,个别呈现在创立.a文件的过程中。 图4 CreateUniversalBinary...:将上阶段生成.a文件合并为一个通用的二进制文件。 图5 Ld:与Libtool性能类似是一个linker的工具,被用来构建可执行文件,即生成最终的.ipa文件,该命令个别较长呈现在构建指标码阶段。 根据上述命令剖析就能够很清晰的理解苹果程序的编译过程,以我的项目中某一target为例,如下图所示,该target作用是生成可执行文件须要的.a文件,即libDZNEmptyDataSet.a,其中应用了CompileC、Libtool以及CreateUniversalBinary等命令对源码进行解决。 图6 在编译实现后Xcode自带的Application Loader提供了一整套命令行工具 altool,帮忙我的项目解决我的项目指标码文件的验证和上传工作。 altool --validate-app -f file -u username [-p password] [--output-format xml] ...

February 3, 2021 · 2 min · jiezi

关于ios:iOS-145-有啥新功能Apple-Watch-也能解锁-iPhone-了

苹果明天公布了行将公布的 iOS 14.5 和 iPadOS 14.5 更新的第一个 Beta 版本,咱们在其中发现了一些值得注意的变动。 Apple Watch iPhone 解锁除了减少戴着口罩解锁 iPhone 的性能外,iOS 14.5 和 watchOS 7.4 还有一个新的“应用 Apple Watch 解锁”性能,该性能使 iPhone 能够应用通过解锁并通过身份验证的 Apple Watch 作为辅助身份验证办法。 启用此性能后,无需摘下口罩或输出明码即可解锁 iPhone。它既须要运行 iOS 14.5 的 iPhone,也须要运行 watchOS 7.4 的 Apple Watch,并且必须在“设置”利用中启用该性能,办法是转到Face ID和明码并在“应用 Apple Watch 解锁”上切换。 能够将解锁的 Apple Watch 与 Face ID 配对应用,而无需输出明码即可解锁 iPhone,然而它不能用于验证 Apple Pay 或 App Store 的购买。这些依然须要残缺的 Face ID 面部扫描或明码。 双卡 5G 反对iOS 14.5 在 iPhone 12 上以 Dual-SIM 模式引入了对 5G 的寰球反对。 ...

February 2, 2021 · 2 min · jiezi

关于ios:iOS-145测试版发布戴口罩也能轻松解锁iPhone

来自外媒音讯,近日苹果公布了iOS 14.5开发者测试版,其中有一个值得关注的变动,更新后iPhone将容许戴口罩的用户通过Face ID解锁他们的iPhone。 但须要iPhone的客人戴着Apple Watch,该性能才会无效。在手表自身曾经解锁的前提下,只须要像平常一样看着你的iPhone就能够,随后手表会轻微的触动,让你晓得解锁胜利。 该性能必须在应用前手动启用 ,容许Face ID持续进行解锁,只管面部辨认精度低得了很多,但手表曾经被认证,所以并不必放心平安问题,通过测试发现 APP Store 购买等性能目前还不能通过这种形式验证。 其实苹果公司去年5月份就开始着手钻研「在佩戴口罩的情境下解锁」的问题,目前的策略是,当用户的脸部被遮挡时,会提醒Face ID更疾速地将用户转移到明码输出屏幕。实际操作中,这个扭转让用户常常不得不期待过长时间。 除了以上这种办法外,有音讯还称苹果正在测试光学显示屏内指纹传感器,可能最快往年就会在iPhone中亮相。 除了在Face ID上的改良之外,iOS 14.5还为iPhone和iPad带来了对Xbox系列S/X和PlayStation 5控制器的反对,同时还扩充了绝对较新的、按需健身+锤炼的兼容性。一旦装置更新,健身利用将取得将这些锤炼的音频和视频,并扣除从Apple Watch收集的锤炼指标,流式传输到第三方、兼容AirPlay 2的智能电视的能力。 还有一点十分值得关注,这个测试版将第一个全面实施苹果利用追踪通明措施,该措施要求利用开发者在收集用户的 「广告商身份辨认 」之前明确征求用户的批准,这段代码容许公司匿名监控用户的在线和利用内行为,为用户提供有针对性的广告。

February 2, 2021 · 1 min · jiezi

关于ios:Flutter-27Flutter手把手教程UI布局和Widget垂直布局控件Column

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) ColumnColumn是在Flutter中常见的布局控件,它负责垂直方向布局。Row负责程度方向布局,二者都是继承于Flex,相似于iOS外面的UIScrollView,然而又有很多不同。先来看一下Column的构造函数 Column({ /// key Key key, /// Column的对其形式 默认是 MainAxisAlignment.start MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start, /// 示意Column在垂直方向占用的大小,默认是 max,示意尽可能的充斥垂直方向空间。如果这是 min示意尽量小的占用垂直方向空间 MainAxisSize mainAxisSize = MainAxisSize.max, /// 横轴对其形式 默认是 居中对齐 CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, /// 子控件的布局程序,不同国家书写习惯的不同(中文、英语从左往右书写,阿拉伯文从右往左书写),这个参数能够帮忙咱们调整布局显示程序 TextDirection textDirection, /// 示意垂直方向的对其方向 VerticalDirection verticalDirection = VerticalDirection.down, /// 基线对齐形式 在Row外面会有应用 TextBaseline textBaseline, /// 子控件 List<Widget> children = const <Widget>[],}) mainAxisAlignmentmainAxisAlignment接管一个MainAxisAlignment类型的枚举,MainAxisAlignment共有六个枚举值,如下: 枚举值形容start与 开始的地位对齐end与 完结的地位对齐center居中对齐spaceBetween把残余的空间拆分成n-1份(n是子控件的个数) 每一份都插入到子控件之间spaceEvenly把残余的空间拆分成n+1份(n是子控件的个数) 而后均匀分布spaceAround把残余空间拆分成 2n 份(n是子控件的个数) 每个子控件高低各放一份看形容比拟艰涩,咱们间接来看成果: MainAxisAlignment.start居顶部 MainAxisAlignment.center居两头 MainAxisAlignment.end居底部 ...

January 31, 2021 · 1 min · jiezi

关于ios:Flutter-26Flutter手把手教程UI布局Image控件NetworkImageAssetImage

Image是一个罕用的控件,它能够帮忙咱们显示图片,图片的资源能够是来自网络、本地或者是内存。在挪动端的开发中会大量应用Image来展现一些图文,理解和把握Image控件是十分有必要的。 AssetImage 和 Image.assetAssetImage是Flutter提供的一个能够从本地读取图片资源的类,咱们能够应用它来读取图片。同样Flutter还提供了Image.asset这个构造方法间接来帮忙咱们读取图片资源并返回一个Image对象。其实Image.asset是对AssetImage一层更高级的封装。 留神:要读取本地图片咱们首先须要在pubspec.yaml文件里配置本地图片资源的门路,咱们这里在assets这个字段下新增了- images/image_demo.jpg这个文件。后续将会有一篇专门的博客来解说资源的治理。1. AssetImage Image( image: AssetImage("images/image_demo.jpg"), width: 80, height: 80,)2. Image.asset Image.asset( "images/image_demo.jpg", width: 80, height: 80,)两个办法都是传入一个本地文件门路就能够了。 NetworkImage 和 Image.networkNetworkImage是一个能够从网络下载图片的类,它自身是异步的。Image.network是对NetworkImage的封装,它须要传入一个URL地址就能够返回一个Image对象。这两个的设计跟AssetImage和Image.asset的设计基本一致。3. NetworkImage Image( image: NetworkImage("http://www.fulade.me/img/avatar.jpg"), width: 80, height: 80,)4. Image.network Image.network( "http://www.fulade.me/img/avatar.jpg", width: 80, height: 80,)Alignmentalignment是Image的一个很重要的参数,它能够帮忙咱们设置图片的地位。有以下几个枚举值 参数形容topCenter居中靠上topRight右上角centerLeft居中靠左center居中centerRight居中靠右bottomLeft居右下角bottomCenter居中靠下bottomRight居右下角BoxFitfit参数是很重要的布局参数,当咱们的图片内容跟Image设置的大小不齐全吻合的时候,fit的参数值BoxFit能够帮忙咱们做最优的调整和显示5. BoxFit.containfit的默认值是BoxFit.contain。由下图咱们不难看出,BoxFit.contain会等比例缩放,放弃图片的原始的比例并且显示在Image内。 6. BoxFit.fill由图可见BoxFit.fill会充斥整个容器,如果图片大小与容器不齐全吻合,可能会呈现拉伸。 7. BoxFit.coverBoxFit.cover会放弃图片资源的大小,如果超过的局部会被裁掉不会显示。 8. BoxFit.fitWidthBoxFit.fitWidth会使宽度充斥整个容器,高度会按比例缩放,图片不会被拉伸,超出容器的局部会被剪裁。 9. BoxFit.fitHeightBoxFit.fitHeight跟BoxFit.fitWidth类似,高度会充斥整个容器,宽度会按比例缩放,图片不会被拉伸,超出容器的局部会被剪裁。 10. BoxFit.nonenone示意没有设置显示策略,以原始大小居中来显示。 11. BoxFit.scaleDown当图片资源大于容器的时候,成果相当于 BoxFit.none,当组件比图片小时,成果相当于 BoxFit.contain。 对于加载过的图片Flutter是会帮忙咱们做内存缓存,最大缓存数量是1000,最大缓存内存空间是100M。想体验以上的示例的运行成果,能够到我的Github仓库我的项目flutter_app->lib->routes->image_page.dart查看,并且能够下载下来运行并体验。

January 29, 2021 · 1 min · jiezi

关于ios:Flutter-25FlutterTextField使用InputDecoration和FocusedNode

TextFieldTextField是一个罕用的控件,同时它也是一个组合控件,由多个控件组合而成。这是来自Material官方网站的的图片TextField是由7个控件组成,其中有些控件默认不显示,咱们能够对各个控件独自设置想要的款式来满足不同的UI展现需要。上面咱们就来列举几种常见的款式: 1. 简略的TextField TextField( decoration: InputDecoration( labelText: "最根本的的TextField", ),)TextField接管一个InputDecoration作为参数,InputDecoration初始化的参数labelText能够帮忙咱们定义placeholder。labelText模式会灰色的,选中之后会变为蓝色,并且TextField底部会有一条蓝色线条。 2. 限度字符的长度 TextField( maxLength: 10, decoration: InputDecoration( labelText: "最多10个字符", ),)maxLength能够设置最长字符个数,如果超过这个限度再次输出不会有显示,并且在TextField在有右下角有以后字符个数的标记,此处是10/10。 3. 限度行数 TextField( maxLines: 2, decoration: InputDecoration( labelText: "两行文字,超出的文字上翻", ),)maxLines参数能够设置行数,比方这里设置的是2,默认只会显示两行,超过两行的局部只能通过高低滚动来显示。 默认行数是1,超过的局部会往左缩进。4. labelText设置色彩 TextField( decoration: InputDecoration( labelText: "labelText 有色彩", labelStyle: TextStyle(color: Colors.red), ),)InputDecoration能够设置labelStyle参数,接管一个TextStyle对象,TextStyle这个咱们比拟相熟,在之前解说Text的文章中曾经做了很多详解了。设置色彩之后,当点击TextField之后,文字会变小,色彩也是设置好的色彩。 5. 左侧Icon TextField( decoration: InputDecoration( icon: Icon(Icons.account_box), labelText: "左侧有一个Icon", ),)icon参数能够传入一个Icon对象用来显示在TextField的左侧,咱们能够传入各式各样的Icon,满足咱们更丰盛的展现需要。 6. 右侧Icon suffix和suffixIcon TextField( decoration: InputDecoration( labelText: "右侧的两个Icon suffix 和 suffixIcon", suffix: Icon(Icons.account_box), suffixIcon: Icon(Icons.add), ),)suffixIcon默认是显示在右侧的,TextField被点击之后会显示为被选中状态,suffix默认不显示,只有入选中TextField的时候才会显示进去。 7. 辅助提醒 ...

January 29, 2021 · 1 min · jiezi

关于ios:WKWebView-请求拦截探索与实践

图片起源:https://unsplash.com本文作者:谢贫贱背景WebView 在挪动端的利用场景随处可见,在云音乐里也作为许多外围业务的入口。为了满足云音乐日益简单的业务场景,咱们始终在继续一直的优化 WebView 的性能。其中能够短时间内晋升 WebView 加载速度的技术之一就是离线包技术。该技术可能节俭网络加载耗时,对于体积较大的网页晋升成果尤为显著。离线包技术中最要害的环节就是拦挡 WebView 收回的申请将资源映射到本地离线包,而对于 WKWebView 的申请拦挡 iOS 零碎原生并没有提供间接的能力,因而本文将围绕 WKWebView 申请拦挡进行探讨。 调研咱们钻研了业内已有的 WKWebView 申请拦挡计划,次要分为如下两种: NSURLProtocolNSURLProtocol 默认会拦挡所有通过 URL Loading System 的申请,因而只有 WKWebView 收回的申请通过 URL Loading System 就能够被拦挡。通过咱们的尝试,发现 WKWebView 独立于利用过程运行,收回去的申请默认是不会通过 URL Loading System,须要咱们额定进行 hook 能力反对,具体的形式能够参考 NSURLProtocol对WKWebView的解决。 WKURLSchemeHandlerWKURLSchemeHandler 是 iOS 11 引入的新个性,负责自定义申请的数据管理,如果须要反对 scheme 为 http 或 https申请的数据管理则须要 hook WKWebView 的 handlesURLScheme: 办法,而后返回NO即可。通过一番尝试和剖析,咱们从以下几个方面将两种计划进行比照: 隔离性:NSURLProtocol 一经注册就是全局开启。一般来讲咱们只会拦挡本人的业务页面,但应用了 NSURLProtocol 的形式后会导致利用内单干的三方页面也会被拦挡从而被净化。WKURLSchemeHandler 则能够以页面为维度进行隔离,因为是跟随着 WKWebViewConfiguration 进行配置。稳定性:NSURLProtocol 拦挡过程中会失落 Body,WKURLSchemeHandler 在 iOS 11.3 之前 (不蕴含) 也会失落 Body,在 iOS 11.3 当前 WebKit 做了优化只会失落 Blob 类型数据。一致性:WKWebView 收回的申请被 NSURLProtocol 拦挡后行为可能产生扭转,比方想勾销 video 标签的视频加载个别都是将资源地址 (src) 设置为空,但此时 stopLoading 办法却不会调用,相比而言 WKURLSchemeHandler 体现失常。调研的论断是:WKURLSchemeHandler 在隔离性、稳定性、一致性上体现优于 NSURLProtocol,然而想在生产环境投入使用必须要解决 Body 失落的问题。 ...

January 28, 2021 · 4 min · jiezi

关于ios:iOS-ReplayKit-与-RTC

作者:声网Agora Cavan在日益繁多的直播场景中,如果你也是某位游戏主播的粉丝的话,有一种直播形式是你肯定不生疏的,那就是咱们明天要聊的屏幕分享。 直播场景下的屏幕分享,不仅要将以后显示器所展现的画面分享给远端,也要将声音传输进来,包含利用的声音,以及主播的声音。鉴于这两点需要,咱们能够简略剖析出,进行一次屏幕分享的直播所须要的媒体流如下: 一条显示器画面的视频流一条利用声音的音频流一条主播声音的音频流ReplayKit 是苹果提供的用于 iOS 零碎进行屏幕录制的框架。 首先咱们来看看苹果提供的用于屏幕录制的 ReplayKit 的数据回调接口: override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) { DispatchQueue.main.async { switch sampleBufferType { case .video: AgoraUploader.sendVideoBuffer(sampleBuffer) case .audioApp: AgoraUploader.sendAudioAppBuffer(sampleBuffer) case .audioMic: AgoraUploader.sendAudioMicBuffer(sampleBuffer) @unknown default: break } } }从枚举 sampleBufferType 上,咱们不难看出,刚好能合乎咱们上述对媒体流的需要。 视频格局guard let videoFrame = CMSampleBufferGetImageBuffer(sampleBuffer) else { return} let type = CVPixelBufferGetPixelFormatType(videoFrame)type = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange通过 CVPixelBufferGetPixelFormatType,咱们能够获取到每帧的视频格式为 yuv420。 帧率通过打印接口的回调次数,能够晓得每秒可能获取的视频帧为30次,也就是帧率为 30。 格局与帧率都能合乎 Agora RTC 所能接管的范畴,所以通过 Agora RTC 的 pushExternalVideoFrame 就能够将视频分享到远端了。 agoraKit.pushExternalVideoFrame(frame)插入一个小常识显示器所显示的帧来自于一个帧缓存区,个别常见的为双缓存或三缓存。当屏幕显示完一帧后,收回一个垂直同步信号(V-Sync),通知帧缓存区切换到下一帧的缓存上,而后显示器开始读取新的一帧数据做显示。 ...

January 27, 2021 · 2 min · jiezi

关于ios:技术分享-美术教学中视频矫正是怎么做的

近年来,在线教育行业进入了倒退的快车道,人们对于教育的需要越来越明确、要求越来越高,通过一番大浪淘沙,咱们发现只有产品优质、器重用户体验的机构能力在后疫情时代经久不衰、愈发昌盛。在素质教育赛道中,以在线美术教学为外围的美术宝、画啦啦,以在线书法教学为外围的河小象以本身实力领跑了细分赛道,用科技推动素质教育的提高。值得一提的是,美术宝教育在业内率先采纳了“Art loop”实时视频透视改正零碎,以解决挪动设施终端在教学直播场景中产生的透视、变形、偏色等一系列问题,并还原线下授课体验和交互,进步学员的专一度。在这些线上美术、书法教学场景中,视频改正技术成为了音视频技术之上的加分项。本文会从技术的角度为大家介绍拍乐云在视频改正技术中的实践经验。一、什么是视频改正? “基于参数估计的自在几何变换算法”的视频改正技术,是基于实时音视频之上的技术优化,通过独有的图像处理算法,对视频画面进行改正的技术。举个例子,美术线上课堂中,学生近程在画纸上绘画,摄像头对着画纸,通常难以保障摄像头能够正对画纸核心进行拍摄,一旦偏离画纸核心,拍摄出的视频中,画纸会变形,这项技术能够使老师将学生的视频进行失真改正,将拍摄进去的梯形画纸调整成为长方形。 二、视频改正的技术关键点有哪些? 用手机等设施拍摄图像时,如果摄像头无奈正对被拍摄像对象(如画板),会产生一系列的几何失真,这是因为摄像头在拍摄时,真实世界是三维空间,展现在手机上时,曾经变成了二维立体。物体与摄像头的实在空间关系,能够由被拍摄对象在空间内的几何地位关系,估算失去被拍摄对象的几何失真参数,而后从新计算拟进行改正区域与真失被拍摄对象的映射关系。将失去的映射关系利用低复杂度高效的解决算法,对原始视频进行解决,失去改正后的视频。其中,要害的技术点包含:1、独创的几何失真参数估计a、将拍摄的物体,例如画板,在拍摄空间进行数学建模,建设空间坐标系;b、依据物体在空间内的地位关系,估算摄像头的采集参数,特地是平移、旋转、缩放和投影参数。 2、独创的映射关系计算,将摄像头的采集参数与假如的鸟瞰摄像采集参数进行映射,失去实在的视频渲染参数矩阵 3、高效疾速的视频解决算法,在实时视频通信中,视频数据量微小,该技术须要对视频中每个像素进行映射变换,运算量随像素点数的减少,急剧减少,为此,咱们设计了高度并行的解决算法,使得每个像素点都可独立进行运算,从面能够利用GPU进行减速解决,即便超高清视频都能够在毫秒级别进行解决。 相干开发指南页面: Android: VideoQuadTransform com.pano.rtc.api.Constants.PanoOptionType 枚举类型参考developer.pano.video iOS: kPanoOptionQuadTransform PanoEnumerates.h 文件参考developer.pano.video 以上就是对于视频改正的一些分享,欢送大家体验。关注拍乐云Pano的公众号,咱们会在后续的文章中分享更多对于音视频开发的技术常识。

January 25, 2021 · 1 min · jiezi

关于ios:间谍软件盯上-iPhone-用户数月内或遭受大规模攻击

以色列特务软件公司 NSO 团体销售的 Pegasus 特务软件据称能够追踪地位和拜访明码。 这个特务软件曾经被应用了将近一年的工夫,利用了 iPhone 在 iOS 14 更新前的一个显著破绽,装备了一种计算机平安超级武器,零脚印、零点击、零日破绽,利用 iMessage 中的一个破绽,只需按下一个按钮,就能管制一部 iPhone。 特务软件可跟踪用户地位、拜访明码,还不会留下任何痕迹Pegasus 不会在指标手机上留下任何可见的痕迹,只需发送一条受害者基本不须要点击的信息就能够装置,甚至能够在运行过后最新版本的 iOS 的手机上运行。 多伦多大学公民实验室的钻研人员说,他们发现了所谓的黑客工具,被称为“ Kismet”。如果 Kismet 能够被认为是用来绕过 iPhone 的安全性的特洛伊木马,那么 NSO 团体销售的另一个被称为 Pegasus 的软件就是外部的士兵。依据钻研人员的说法,Pegasus 有着惊人的弱小性能。 Pegasus 特务软件有能力跟踪地位、拜访明码和存储手机上的证书,通过麦克风记录音频,包含加密电话的录音,它还能管制手机的摄像头拍照。 公民实验室示意,他们曾经发现了 37 个已知的 Kismet 被 NSO 客户用来攻打的例子。但钻研人员示意,“鉴于 NSO 团体客户群的寰球影响力,以及简直所有 iPhone 设施在 iOS 14 降级之前都有显著的破绽。咱们狐疑,咱们察看到的感化只是此次攻打所应用的全副攻打中的极小一部分。” NSO 称从未收集个人信息NSO 团体成立于 2010 年,始终在钻研特务软件技术,据称其 Pegasus 特务软件十分受欢迎,但免费也很高,仅安装费就须要 50 万美元。 去年 5 月该公司被指控入侵了 WhatsApp 用户的手机,收集了集体地位、音讯、图片等数据。但 NSO 团体方面回应称,其产品不会收集个人信息,也不会拜访用户在云中存储的任何数据。 NSO 团体示意,其产品用于“打击重大的有组织立功和反恐”,任何重大违反其政策的证据都将受到考察。该团体还在申明中示意:“正如咱们重复申明的那样,咱们无奈取得任何无关咱们的零碎用于监控的个人身份的信息。” 苹果呐喊客户下载最新版本软件,以爱护集体数据安全在一份申明中,一位苹果发言人说: “在苹果,咱们的团队不知疲倦地工作,以增强咱们用户数据和设施的平安。iOS 14在平安方面是一个重大的飞跃,并提供了新的进攻这类攻打的保护措施。钻研中形容的攻打是针对特定集体的高度攻打指标。咱们始终呐喊客户下载最新版本的软件,以爱护本人和他们的数据。” 只管第一次宣称应用 Kismet 的攻打产生在今年夏天,但公民实验室宣称,来自受到入侵的手机的日志表明,早在 2019 年 10 月,就有人应用了相干的零点击零日破绽技术。 ...

January 21, 2021 · 1 min · jiezi

关于ios:iOS微信小程序在接口请求时一直pending

简述:在应用uni-app开发微信小程序时,iOS手机在领取的时候,申请接口始终pending,安卓手机没问题,模拟器也没问题,只有iOS真机调试的时候有问题。接口在其它页面能够失常申请,唯独在领取页面始终pending,不能失常走上面的流程。 因为安卓没事儿,所以应该不是服务器的问题,所以我就始终在找前端的问题。看到pending的上一个页面渲染的接口能失常申请,所以我先把上一个接口正文掉了,正文掉就好了。 过后感觉很奇怪,就追根溯源看看这个接口外面做了什么吧。外面有一个setInterval领取倒计时的定时器,猜想是不是定时器外面做的货色太多了,把过程跑满了,所以就卡在接口那了呢? 把页面渲染的接口放开,把外面定时器的start正文试了一下,验证了我的想法,果然是定时器外面的代码的问题。 先前写的代码的确堪忧: self.timer = setInterval(() => {var today = new Date()//以后工夫var D,H,M,S;var shenyu = this.stopTime.getTime()-today.getTime(),//倒计时毫秒数shengyuD = parseInt(shenyu/(60*60*24*1000)),//转换为天D = parseInt(shenyu)-parseInt(shengyuD*60*60*24*1000),//除去天的毫秒数shengyuH = parseInt(D/(60*60*1000)),//除去天的毫秒数转换成小时H = D-shengyuH*60*60*1000,//除去天、小时的毫秒数shengyuM = parseInt(H/(60*1000)),//除去天的毫秒数转换成分钟M = H-shengyuM*60*1000;//除去天、小时、分的毫秒数S = parseInt((shenyu-shengyuD*60*60*24*1000-shengyuH*60*60*1000-shengyuM*60*1000)/1000)//除去天、小时、分的毫秒数转化为秒if(shenyu>0){ //赋值 var timeText; if(shengyuM < 0 && S < 0){ timeText = '00:00'; }else{ shengyuH = shengyuH<10 ? ('0'+shengyuH):shengyuH; shengyuM = shengyuM<10 ? ('0'+shengyuM):shengyuM; S = S<10 ? ('0'+S):S; timeText = shengyuH+':'+shengyuM+':'+S; } self.timeText = timeText;}else{ clearInterval(self.timer);}}, 1000);1秒一获取以后工夫 1秒一计算以后工夫 。。咳咳... ...

January 20, 2021 · 1 min · jiezi

关于ios:AVAssetReader视频数据读取

AVAssetReader介绍能够通过AVAssetReader获取视频文件里媒体样本,能够间接从存储器中读取未解码的原始媒体样本,取得解码成可渲染模式的样本。文档里阐明AVAssetrader管道外部是多线程的。初始化之后,读取器在应用前加载并解决正当数量的样本数据,以copyNextSampleBuffer(AVAssetReaderOutput)等检索操作的提早非常低。但AVAssetReader还是不适用于实时源,并且它的性能也不能保障用于实时操作。因为应用前须要加载并解决一些样本数据,导致占用的内存可能会比拟大,须要留神同一时间应用的reader个数不要过多,视频像素越高,占用的内存也会越大。  AVAssetReader初始化应用AVAsset对AVAssetReader进行初始化,后面也说了初始化之后就会加载样本数据,所以这一步就曾经会对内存产生印象,如果内存缓和就不要事后初始化。 NSError *createReaderError; _reader = [[AVAssetReader alloc]initWithAsset:_asset error:&createReaderError];  AVAssetReader设置Output在开始读取之前,须要增加output来管制读取初始化应用的asset中哪些track,以及配置如何读取。AVAssetReaderOutput还有其余的子类实现,如AVAssetReaderVideoCompositionOutput,AVAssetReaderAudioMixOutput和AVAssetReaderSampleReferenceOutput。这里应用AVAssetReaderTrackOutput演示。须要一个track来初始化,track从asset中获取。 NSArray tracks = [_asset tracksWithMediaType:AVMediaTypeAudio];if (tracks.count > 0) { AVAssetTrack audioTrack = [tracks objectAtIndex:0];}或者 NSArray tracks = [_asset tracksWithMediaType:AVMediaTypeVideo];if (tracks.count > 0) { AVAssetTrack videoTrack = [tracks objectAtIndex:0];}还能够对输入的格局进行配置,更多配置能够查阅文档。 NSDictionary * const VideoAssetTrackReaderOutputOptions = @{(id) kCVPixelBufferOpenGLESCompatibilityKey : @(YES), (id) kCVPixelBufferIOSurfacePropertiesKey : [NSDictionary dictionary], (NSString*)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)};_readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:_track outputSettings:VideoAssetTrackReaderOutputOptions];if ([_reader canAddOutput:_readerOutput]) { [_reader addOutput:_readerOutput];}  seek操作AVAssetReader并不适宜频繁随机读取的操作,如果须要频繁seek可能须要别的形式实现。在开始读取之前,能够对读取的范畴进行设置,当开始读取后不能够批改,只能程序向后读。有两种计划来调整读取范畴: output中能够设置supportsRandomAccess,当为true时,能够重置读取范畴,但须要调用方调用copyNextSampleBuffer,直到该办法返回NULL。或者从新初始化一个AVAssetReader来设置读取工夫。如果尝试第一种计划,须要应用seek,能够尝试每次设置一个不太长的区间,以保障读取残缺个区间不会耗时太多,且工夫距离最好以关键帧划分。  读取数据_reader.timeRange = range;[_reader startReading]; _sampleBuffer = [_readerOutput copyNextSampleBuffer];CMSampleBuffer中提供了办法获取解码数据,比方获取图像信息能够应用 ...

January 18, 2021 · 2 min · jiezi

关于ios:flutter使用C代码库IOS篇

1) 和原生IOS开发的技术一样,编译出.a动态库(下文称之为libtclib.a,蕴含简略的native_add函数)。 2) 确认flutter的dart插件产生的我的项目的IOS局部应用obj-c语言: 3) 应用xcode关上Runner.xcworkspace,在linkBinaryWithLibraries里把libtclib.a蕴含进来,还须要在LibarySearchPaths把libtclib.a的门路放进去。 4) main.dart里的内容: 内容和上一篇《flutter应用C代码库—Android篇》一样。 编译运行,会发现,编译失常通过,但运行时,报错了,报告找不到相应的native_add这个symbol。 我偶尔在AppDelegate.m文件中测试了对native_add的调用: 而后编译运行,意外发现整个APP运行失常了! 剖析起因:如果没有在AppDelegate.m里对native_add的调用,那么xcode的编译器(留神是编译obj-c的,不是flutter的编译器)会认为native_add没有用,从而不链接进可执行文件中(我还没有弄明确xcode的编译器是基于单个函数、还是分段、还是基于动态库文件来决定链接的。比方,同一个动态库有两个函数A和B,如果A在AppDelegate.m被调用,B没有,那么xcode链接时,是只链接A还是整个动态库都链接进去?),这是因为xcode的编译器是不晓得在main.dart调用了native_add的。等到main.dart去lookup这个native_add函数symbol的时候,天然就找不到了。 所以,为了保险起见,在flutter中须要间接用到的函数(间接用到的函数没关系,xcode会主动剖析而后链接进来),在AppDelegate.m中先调用一遍。然而如果真的调用一遍,耗时耗电不说,还会产生副作用,为此,用一点技巧: 先写一个touch函数,这个touch函数能够放在动态库中,也能够放在AppDelegate.m中,而后在AppDelegate.m中,这么调用一下: touch_api(0); 这样,等于坑骗了一把xcode编译器,让他误以为咱们的利用中调用了相干的函数,就把相干的函数链接进来了。 留神,如果这样是不行的: xcode编译器还是有点智商的,它会剖析出并没有真正调用native_times和native_add两个函数,所以不会去链接。但如果变成下面的调用形式,就能够骗过xcode编译器了。

January 18, 2021 · 1 min · jiezi

关于ios:3倍提升高德地图极致性能优化之路

1.导读 随着挪动互联网的成熟倒退,挪动利用技术上呈现出多样化的趋势,业务上偏向打造平台及超级入口,超级利用应运而生。但业务疾速扩张与无限的系统资源必然是抵触的,如何实现多(能力服务的高增长)、快(体验晦涩)、好(兼容稳固)、省(资源成本低),让大象也能跳舞,成为摆在超级利用背后必须解决的问题。 随同着高德地图APP近几年的高速倒退,也面临到这些问题,从2019年开始,咱们开启了一系列性能优化专项,对高德地图APP进行了深刻性能剖析和极致优化,获得比较显著的成果。在这个过程中总结了一系列优化思路和技术计划,心愿对同样面临超级利用性能问题的你有所帮忙。 通过一系列优化动作,咱们在保障业务需要失常迭代新增的根底上,启动、外围链路交互、行中内存、包大小等多方面均实现了性能的成倍晋升,尤其是低端机上达到了3倍+的晋升,从多个维度改善了用户性能体验。 启动攻坚:启动耗时升高70%+,实现2s地图元素实现展现,并管控放弃在稳固低水位,呈降落趋势。外围链路交互优化:在搜寻、路线等链路上实现中高端机型秒开、低端机型2s内关上,整体晋升用户晦涩交互体验 。行中内存优化:全机型优化了30%左右,进步稳定性。包大小攻坚:双端体积升高20%,进步装置转换率。2.性能优化业务背景 某段时间,高德地图APP面临着性能好转、管控艰难的问题。以启动耗时为例,双端启动期待体感显著,并且历史上治理后呈现重复,整体呈上升趋势,咱们思考问题背地的问题,次要有以下几个方面: 业务宏大 超级利用个别都经验这样的倒退过程。首先,利用提供服务给用户,用户开始增长,增长的用户会产生更多的需要。利用为满足新增需要一直迭代,提供新的服务。新的服务推动用户进一步增长,进入下一个循环。正是在这个正循环倒退中,利用像滚雪球一样越滚越大,终于成为超级利用。 然而,随着业务需要的一直增长,业务量和复杂度也随着回升,系统资源会越占越多。但机器资源是无限的,资源的抢夺不可避免地会导致性能问题,从而影响用户体验和业务扩大,成为超级利用正循环倒退的拦路虎。 高德地图也同样经验了这样的过程,随着这几年的疾速倒退,利用从手机扩大到了车机,平台从iOS、Android扩大了Windows和Liunx,笼罩10多种出行形式的同时,还在一直提供组队、视频、语音、AR等新服务。与此相应的是单端代码行超百万行,线程上百,工作上千,造成了继续的性能压力。 环境简单 性能问题面临的另一个次要挑战是超级利用的环境简单。一方面,随着挪动设施的长线倒退,零碎碎片化状况越来越重大,Android零碎横跨11个主版本,iOS横跨14个主版本,加之设施厂商对系统进行各种各样的革新,进一步减少了零碎的碎片化;另一方面,用户挪动设施的环境是十分不稳固的,电量、温度的变动以及其余利用的抢占都会造成内存、CPU、GPU等资源稳定。简单不可控的环境为统一的性能体验的放弃减少了很大的难度。 但作为大用户体量的超级利用,任何环境的体验都要保障。特地是地图畛域,用户习惯对不同产品间接比照,任何环境下性能体验问题,都会间接影响产品的整体口碑,导致用户散失。所以须要兼顾所有环境,不只是支流机型零碎和场景,在长尾场景与机型零碎上也必须晦涩运行,这就要求超级利用这头大象岂但要在舞台上跳舞,在凳子上、甚至在水里也能跳舞。 技术链路长 为了满足研发效率晋升、产品动态化等多样需要,挪动利用技术上除反对原生开发外,也要反对小程序、Web H5、C根底库等跨平台、容器化、动态化开发。从高德APP来看,最顶层业务除了OC、Java外,还反对JS开发。撑持层提供了AJX、小程序、原生、C等多种容器框架,同时还波及JS、JNI等桥接层。最上面则用C++提供地图各个引擎能力,这里包含OpenGL、定位传感器交融等多种底层能力。技术链路自上而下开始变得长且简单,链路上任何一环都可能导致性能问题,原有的单技术语言的排查工具曾经无奈定位明确性能卡点模块,为性能排查和管控带来挑战。 3.解法:低成本优化迁徙,长线管控 基于下面的问题,原有传统的一招鲜的优化计划,显然解决不了需要日益增长和简单环境下的性能统一体验。所以,咱们在专项实际过程中,积淀了一套自适应资源调度框架,解决历史性能问题的同时,可能在不影响现有的研发效率的状况下,低成本优化迁徙,实现新业务高性能的开发。此外,从零碎底层进行全维度资源监控,主动定位散发问题,来实现长线管控,防止先治理后反弹的状况。 自适应资源调度框架 自适应资源调度框架在利用运行过程中,感知采集运行环境。而后对不同环境状态进行不同的调度决策,生成相应的性能优化策略,最终依据优化策略执行对应优化性能。与此同时,监测调度上下文以及调度策略执行成果,并将其反馈给调度决策零碎,从而为进一步的决策调优提供信息输出。这样,能够做到在不同的运行环境下都能达到可预期的极致性能体验。并且,整个过程,对业务无需额定开发,做到无感接入,防止影响业务开发效率。 • 环境感知 感知环境分为硬件设施、业务场景、用户行为和零碎状态四个维度: 硬件设施上,一方面通过团体实验室对已知设施进行评测跑分确定高中低端机型,另一方面在用户设施上本地对硬件进行实时算力评估。业务场景上,将业务分为前台展现、后盾运行、交互操作等几类,个别状况下前台正在进行交互操作的业务场景优先级最高,后盾数据预处理业务场景优先级最低。对于同类别业务场景,依据业务UV、交易量、资源耗费等维度进行PK,确定细分优先级。用户行为上,联合服务用户画像和本地实时推算,确定用户性能偏好和操作习惯,为下一步针对用户的精准优化决策做筹备。零碎状态上,一方面通过零碎提供接口获取诸如内存正告、温度正告及省电模式等来获取零碎极其状态,另一方面通过对内存、线程、CPU和电量进行监控,来实时确定零碎性能资源状况。• 调度决策 感知到环境状态之后,调度零碎将联合各种状态与调度规定,进行业务以及资源调配决策: 降级规定:在低端设施上或者系统资源缓和告警(如内存、温度告警)时,敞开高耗能性能或者低优先级性能。避让规定:高优先级性能运行时,低优先级性能进行避让,如用户点击搜寻框时到搜寻后果齐全展现到时间段内,后盾低优工作进行暂停避让,保障用户交互体验。预处理规定:根据用户操作及习惯进行预处理,如某用户通常在启动3s后,点击搜寻,则在3s之前对该用户搜寻后果进行预加载,从而在用户点击时出现极致的交互体验成果。拥塞管制规定:在设施资源缓和时,被动升高资源申请量,如CPU忙碌时,被动升高线程并发量;这样在高优工作到来时,避免出现资源紧缺申请不到资源性能体验问题。• 策略执行 策略执行分为工作执行和硬件调优:其中工作执行,次要是通过内存缓存、数据库、线程池和网络库对相应工作的进行运行管制,来间接实现对各类资源的调度管制。而硬件调优,则是通过与零碎厂商单干,间接对硬件资源进行管制,如CPU密集的高优业务开始运行时,将进步CPU频率,并将其运行线程绑定到大核上,防止线程来回切换损耗性能,最大化地调度系统资源来晋升性能。 • 成果监测 在资源调度过程中对各个模块进行监测,并将环境状态、调度策略、执行记录、业务成果、资源耗费等状况反馈给调度零碎,调度系则统以此来评判本次调度策略的优劣,以做进一步的调优。 全维度资源监控 因为技术链路长、关联模块简单,原来呈现性能问题时,须要所有相干方集中排查,check所有的改变代码,依赖集体教训判断代码的老本来定位问题,合作和排查老本都很高,导致性能管控无效落地阻力很大。所以咱们就思考,性能问题的基本是硬件资源的竞争,那能不能逆向解题,反过来对资源老本进行监控,如果发现异常再回溯产生老本的代码,以及分发给相应owner. 那基于这个思路,在构建的时候,首先通过代码扫描建设代码模块关联库。而后,进行老本和调用栈采集。采集实现后,对基线版本和以后版本的老本进行比照,如果发现异常,则通过符号反解异样老本的调用栈间接定位到问题代码。另外,基于问题代码查找代码模块关联库,来定位问题模块,最初将问题精确分发给模块相应的owner,最终实现问题的主动定位和散发,反对团队并行解题。 管控流程体系 性能的无效长线管控,除了下面的资源监控平台,还须要配套的流程体系及组织保障。所以在APP的生命周期每个阶段都建设了从测试剖析到修复验证的闭环管控。前置监控在迭代开发阶段,早发现早解决。在集成阶段监控每一个改变,保障及时处理。线上通过实时监控和动静下发,实现疾速修复。 4.总结与思考 信心大于计划 超级利用的性能问题往往关联多方业务,须要多方团队合作,所以自上而下对性能的器重水平和优化信心是决定成败的要害,打通任督二脉,能力事倍功半,把优化计划顺利落地。 攻城难,守城更难 业务与技术都在疾速迭代,要想保障优化成绩避免反弹,管控是必须的,而管控就会有解放和效率影响,管控过程中就难免会遇到各种各样的阻力。所以一方面技术上,建设规范规定,配合提效工具和优化流程,尽量避免影响业务开发。另一方面,团队须要具备独特认知,性能体验与性能体验等同重要,用户比照心智很强,性能体验往往与产品口碑间接挂钩。 性能优化永远在路上 目前,咱们很多优化策略以及数据参数还是从实验室调校而来。将来,咱们会进一步摸索云端一体、端智能等技术,做到更懂用户,贴合业务和用户特点,实现性能体验的个性化晋升。

January 15, 2021 · 1 min · jiezi

关于ios:OpenStack存储设施Swift

Swift为OpenStack提供一种分布式、继续虚构对象存储,它相似于Amazon Web Service的S3简略存储服务。Swift具备跨节点百级对象的存储能力。Swift内建冗余和生效备援治理,也可能解决归档和媒体流,特地是对大数据(千兆字节)和大容量(多对象数量)的测度十分高效。 更多分享专研swift性能及特点: 海量对象存储大文件(对象)存储数据冗余治理归档能力-----解决大数据集为虚拟机和云利用提供数据容器解决流媒体对象平安存储备份与归档良好的可伸缩性 Swift组件:--Swift账户--Swift容器--Swift对象--Swift代理--Swift RING Swift代理服务器 --用户都是通过Swift-API与代理服务器进行交互,代理服务器正是接管外界申请的门卫,它检测非法的实体地位并路由它们的申请。--此外,代理服务器也同时解决实体生效而转移时,故障切换的实体反复路由申请。 Swift对象服务器--对象服务器是一种二进制存储,它负责解决本地存储中的对象数据的存储、检索和删除。对象都是文件系统中寄存的典型的二进制文件,具备扩大文件属性的元数据(xattr)。--留神:xattr格局被Linux中的ext3/4,XFS,Btrfs,JFS和ReiserFS所反对,然而并没有无效测试证实在XFS,JFS,ReiserFS,Reiser4和ZFS下也同样能运行良好。不过,XFS被认为是以后最好的抉择。 Swift容器服务器--容器服务器将列出一个容器中的所有对象,默认对象列表将存储为SQLite文件(译者注:也能够批改为MySQL,装置中就是以MySQL为例)。容器服务器也会统计容器中蕴含的对象数量及容器的存储空间消耗。 Swift账户服务器--账户服务器与容器服务器相似,将列出容器中的对象。 Ring(索引环)--Ring容器记录着Swift中物理存储对象的地位信息,它是实在物理存储地位的实体名的虚构映射,相似于查找及定位不同集群的实体实在物理地位的索引服务。这里所谓的实体指账户、容器、对象,它们都领有属于本人的不同的Rings。查看原文

January 15, 2021 · 1 min · jiezi

关于ios:移动应用如何制作得更精美这款工具的新功能真的可以了解一下

点击获取工具>>DevExpress领有.NET开发须要的所有平台控件,蕴含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、实用于 Visual Studio的CodeRush等一系列辅助工具。 DevExpress Xamarin.Forms Controls v20.2公布了全新的CollectionView组件、附带新的图表类型、加强布局性能等,助力打造与时俱进的挪动利用,欢送下载最新版体验! 全新的Collection视图全新的Xamarin.Forms CollectionView组件显示数据我的项目汇合,其性能包含: 反对垂直和程度布局反对我的项目拖放(从新排序我的项目)数据排序、过滤和分组我的项目模板(数据我的项目/组题目)拉动刷新加载更多单项和多项抉择Dark和Light主题 图表新的样条系列 此版本在Xamarin.Forms和本机挪动图表库中引入了一种新的样条线图表类型。 点和段着色器 v20.2向Xamarin Forms和机挪动图表库中引入了点和段着色器,这项新性能可让您依据数据为系列点和线/面线段定义色彩,您能够应用预约义的着色器(例如,每种色彩或值范畴)或依据须要实现自定义算法。 轴标签格局加强 Xamarin Chart View当初能够主动设置日期工夫和数字轴标签的格局,此性能使您能够在图表轴内显示扩大信息。 数据表单布局加强 字段编辑器当初能够跨多个行(只需应用DataFormItem类的RowSpan属性)。新的DataFormView.EditorLabelHorizontalAlignment和DataFormItem.LabelHorizontalAlignment 属性使您能够程度对齐显示在数据编辑器上方的标签。 数据网格虚构程度滚动 新的AllowVirtualHorizontalScrolling属性极大地提高了Xamarin.Forms DataGridView的性能(当应用大量列时),如果启用此选项,则当用户程度滚动网格时,DataGridView仅出现在屏幕上显示的列并更新其UI元素。 DevExpress单元编辑器 在以前的版本中,DevExpress Xamarin.Forms数据网格应用规范编辑器来显示和编辑单元格值。 在v20.2中,Xamarin DataGrid改为应用以下DevExpress编辑器: TextEditMultilineEditNumericEditDateEditCheckEditv20.2还包含三种新的列类型: ComboBoxColumnAutoCompleteColumTimeColumn主动筛选行 Xamarin.Forms DataGrid视图附带一个新的Auto-Filter Row选项,应用它能够将搜寻性能整合到您的挪动应用程序中。当用户在Auto-Filter Row列中输出关键字时,数据网格仅显示与指定关键字匹配的那些记录。 您能够依据与列关联的数据类型来管制所应用的搜寻运算符(LIKE,CONTAINS,EQUALS等)。 要显示主动过滤器行,请启用ShowAutoFilterRow选项。 保留/还原布局 当初,您能够将DataGrid布局保留到流中,并依据须要将其还原,新的Save / Restore API蕴含以下办法: SaveLayoutToStream - 将布局保留为XML格局的指定流。RestoreLayoutFromStream - 从指定的流还原布局。*上DevExpress中文网,获取第一手最新产品资讯! DevExpress技术交换群3:700924826      欢送一起进群探讨

January 14, 2021 · 1 min · jiezi

关于ios:如何一举拿下大厂Offer面经附面试题

筹备 其实我很早就开始筹备了,精确来说也不算筹备,只是始终在总结iOS相干方面的常识,然而还是有大把工夫能够本人学习一些感兴趣的方向。从过完年回来,我就有打算的温习和总结了一些常识。 看过的书籍,这里并不是泛泛的读一遍,而是具体了解了大多数内容,艰深一点就是能够用本人的话将相应的常识解读出 来 。《Android开发艺术摸索》(这本书真心不错,我重复读了4、5遍)、《iOS群英传》(比拟靠近开发应用,因为做过一些利用开发,读起来还是比较简单的,读了2遍)、《剑指offer》(感觉面试中碰到的算法,70%都能找到相应的题目,保障所有的题都能够手写进去就行)。4个月精读了以上书籍,还有其余的都是简略理解,这里就不列举了,读完这些书,应该能够让你上一个档次吧(妈妈再也不必放心我面试啦…)。 刷题,次要是LeetCode(大略刷了300道题左右,每天3-6道,保持下来,须要多温习,因为很多题过一段时间会遗记),还有看过一些牛课网。 看他人的面试教训,次要在网上,这里我列举两个比拟好的。 1、 iOS客户端面试题集锦2、 iOS阿里面试题锦集投递简历 一份好的简历是十分有必要的,须要突出你的重点和闪光点,具体怎么写简历能够参考 iOS面试高薪,进阶 你会这些呢嘛?(继续更新中)CodeKK说简历 有了一份好简历,接下来就是投递简历,个别是:拉钩+BOSS直聘+内推,从我这次面试机会来看,三者比例是2:2:1,如果被刷掉也不要灰心,当初大公司基本上各个部门都有本人的hr,能够在拉头和BOSS上多投递一些,万一其余部门看中你呢? 面试经验 这里我仅仅记录一些问过的题目(能记住的),答案我就不写进去,基本上都能够在网上找到相应的答案。 一面 1、iOS一些优化计划 2、最罕用的版本控制工具是什么,能大略讲讲原理么 3、UNIX常用命令 4、c语言在iOS开发中的重要性 5、源代码管理工具的作用 二面 二面面试官是Eva?反正应该不是做iOS的,iOS的相干常识问的也不多,大多是我的项目上的货色。 atomic的多线程平安 聊我的项目,都具体做了什么。 nonatomic在本人治理内存的环境 三面 应该是Eva吧,次要理解一些集体的状况,以及一些我的项目,最初问了冀望的薪资,而后当场就给了offer。 快手 一面 问了对于数据库的一些问题,SQLite的相干操作,没方法,我在华为惟一一个做的和iOS相干的我的项目,然而不太善于数据库。 网络相干的问题,网络的五层模型,又问了TCP和TIP,还有iOS相干的长连贯,这里问的比拟深。 开始iOS相干的常识,视觉控制器的生命周期(view的生命周期)内存告急的解决(手动开释不可见视图的内存和成员变量) 第一面这就算过关了期待二面。 二面 问了我的项目相干的问题,这部分依据本人的我的项目教训,因为大家的教训都不同,这里我就不具体说了。 设定一个场景,怎么去实现相应的性能,因为快手这个部门想做社交,因而这里是问我是如何实现微信的联系人页面(包含与服务端有什么样的交互) 最初也是一个算法,写出所有数组的子序列 二面面试官是这个组的Eva,跟我讲了当初这个组的倒退状况和快手当初的状况,因为快手成长很快,所以不能仅仅依附一个APP,还须要在其余方面进行一些尝试,而这个组的工作就是在一些方面做一些尝试,大略就是这个样子。 三面 HR上来很亲切,问了我一些面试的状况,难不难之类的,而后又聊了聊我大学和研究生状况,我只想说我“too simple , too naive “,大略理解我后,只跟我聊我的有余,以此来压低我冀望的薪水。说了一下薪资冀望,加了微信,让我回去期待,说发offer大略是2周工夫,因为须要走各种审批流程,让我不要焦急。 快手是一个很年老的公司,技术还是须要肯定的积攒,心愿不要像小咖秀一样过眼云烟。 美团外卖 一面 1、简历上写的我的项目问了一遍,而后开始问知识点。 2、volley的源代码,在图片缓存局部探讨了挺长时间,http中缓存机制, 3、视觉控制器的生命周期 4、数据库 5、多线程(NSTread、NSOPeration、GCDA+block) 6、http协定get post的区别 7、手机适配一些计划 8、真机调试、我的项目上线注意事项 9、静态方法是否能被重写 这些大略聊了1个半小时,开始的时候还有些缓和,缓缓聊开了,就好多了,面试官的语速有点快,老是须要面试官反复一遍,我也不经意间语速也变快了,不过能看进去面试官还是很厉害的。 二面 2次握手和3次挥手的起因,以及为什么须要这样做。 1、id和nill代表什么(nill和NULL的区别) 2、向一个nill对象发送音讯会产生什么? 3、过程与线程区别 5、写一个NSString类的实现 6、http中的同步和异步 聊了一些我的项目上做的货色,问了问职业规划 ...

January 11, 2021 · 1 min · jiezi

关于ios:如何一举拿下大厂Offer面经附面试题

筹备 其实我很早就开始筹备了,精确来说也不算筹备,只是始终在总结iOS相干方面的常识,然而还是有大把工夫能够本人学习一些感兴趣的方向。从过完年回来,我就有打算的温习和总结了一些常识。 看过的书籍,这里并不是泛泛的读一遍,而是具体了解了大多数内容,艰深一点就是能够用本人的话将相应的常识解读出 来 。《Android开发艺术摸索》(这本书真心不错,我重复读了4、5遍)、《iOS群英传》(比拟靠近开发应用,因为做过一些利用开发,读起来还是比较简单的,读了2遍)、《剑指offer》(感觉面试中碰到的算法,70%都能找到相应的题目,保障所有的题都能够手写进去就行)。4个月精读了以上书籍,还有其余的都是简略理解,这里就不列举了,读完这些书,应该能够让你上一个档次吧(妈妈再也不必放心我面试啦…)。 刷题,次要是LeetCode(大略刷了300道题左右,每天3-6道,保持下来,须要多温习,因为很多题过一段时间会遗记),还有看过一些牛课网。 看他人的面试教训,次要在网上,这里我列举两个比拟好的。 1、 iOS客户端面试题集锦2、 iOS阿里面试题锦集投递简历 一份好的简历是十分有必要的,须要突出你的重点和闪光点,具体怎么写简历能够参考 iOS面试高薪,进阶 你会这些呢嘛?(继续更新中)CodeKK说简历 有了一份好简历,接下来就是投递简历,个别是:拉钩+BOSS直聘+内推,从我这次面试机会来看,三者比例是2:2:1,如果被刷掉也不要灰心,当初大公司基本上各个部门都有本人的hr,能够在拉头和BOSS上多投递一些,万一其余部门看中你呢? 面试经验 这里我仅仅记录一些问过的题目(能记住的),答案我就不写进去,基本上都能够在网上找到相应的答案。 一面 1、iOS一些优化计划 2、最罕用的版本控制工具是什么,能大略讲讲原理么 3、UNIX常用命令 4、c语言在iOS开发中的重要性 5、源代码管理工具的作用 二面 二面面试官是Eva?反正应该不是做iOS的,iOS的相干常识问的也不多,大多是我的项目上的货色。 atomic的多线程平安 聊我的项目,都具体做了什么。 nonatomic在本人治理内存的环境 三面 应该是Eva吧,次要理解一些集体的状况,以及一些我的项目,最初问了冀望的薪资,而后当场就给了offer。 快手 一面 问了对于数据库的一些问题,SQLite的相干操作,没方法,我在华为惟一一个做的和iOS相干的我的项目,然而不太善于数据库。 网络相干的问题,网络的五层模型,又问了TCP和TIP,还有iOS相干的长连贯,这里问的比拟深。 开始iOS相干的常识,视觉控制器的生命周期(view的生命周期)内存告急的解决(手动开释不可见视图的内存和成员变量) 第一面这就算过关了期待二面。 二面 问了我的项目相干的问题,这部分依据本人的我的项目教训,因为大家的教训都不同,这里我就不具体说了。 设定一个场景,怎么去实现相应的性能,因为快手这个部门想做社交,因而这里是问我是如何实现微信的联系人页面(包含与服务端有什么样的交互) 最初也是一个算法,写出所有数组的子序列 二面面试官是这个组的Eva,跟我讲了当初这个组的倒退状况和快手当初的状况,因为快手成长很快,所以不能仅仅依附一个APP,还须要在其余方面进行一些尝试,而这个组的工作就是在一些方面做一些尝试,大略就是这个样子。 三面 HR上来很亲切,问了我一些面试的状况,难不难之类的,而后又聊了聊我大学和研究生状况,我只想说我“too simple , too naive “,大略理解我后,只跟我聊我的有余,以此来压低我冀望的薪水。说了一下薪资冀望,加了微信,让我回去期待,说发offer大略是2周工夫,因为须要走各种审批流程,让我不要焦急。 快手是一个很年老的公司,技术还是须要肯定的积攒,心愿不要像小咖秀一样过眼云烟。 美团外卖 一面 1、简历上写的我的项目问了一遍,而后开始问知识点。 2、volley的源代码,在图片缓存局部探讨了挺长时间,http中缓存机制, 3、视觉控制器的生命周期 4、数据库 5、多线程(NSTread、NSOPeration、GCDA+block) 6、http协定get post的区别 7、手机适配一些计划 8、真机调试、我的项目上线注意事项 9、静态方法是否能被重写 这些大略聊了1个半小时,开始的时候还有些缓和,缓缓聊开了,就好多了,面试官的语速有点快,老是须要面试官反复一遍,我也不经意间语速也变快了,不过能看进去面试官还是很厉害的。 二面 2次握手和3次挥手的起因,以及为什么须要这样做。 1、id和nill代表什么(nill和NULL的区别) 2、向一个nill对象发送音讯会产生什么? 3、过程与线程区别 5、写一个NSString类的实现 6、http中的同步和异步 聊了一些我的项目上做的货色,问了问职业规划 ...

January 11, 2021 · 1 min · jiezi

关于ios:带多个Submeshes模型合并显示异常

1)多个Submeshes模型合并,显示异样2)Addressable如何删除旧资源3)对NGUI字体错乱的解决方案4)GLSL link error: L0010 Uniform '_Color' differ on precision5)iOS键盘上的输入框提醒内容如何去掉 这是第233篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) ScriptQ:测试一个Skinmesh合并性能,发现当Mesh蕴含多个Submeshes时,合并胜利后,无奈渲染显示进去。当测试的Mesh不蕴含Submeshes时,能够合并显示。难道CombineMeshes只能合并不带Submeshes的Mesh? 注:不论是应用r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);带上所有材质,还是r.sharedMesh.CombineMeshes(combineInstances.ToArray(), true, false) ;合并一张贴图材质,带多个Submeshes的模型只能合并无奈渲染显示进去。不带多个Submeshes的模型却可能失常合并显示。 A:测试发现,须要对每个CombineInstance从新指定三角面,能力失常显示带多个Submeshes的模型。如下代码: foreach (SkinnedMeshRenderer smr in allSkineMeshList){ for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++) { CombineInstance ci = new CombineInstance(); ci.mesh = smr.sharedMesh; ci.mesh.triangles = smr.sharedMesh.triangles; //这里从新指定 ci.subMeshIndex = sub; ci.transform = matrix * smr.transform.localToWorldMatrix; combineInstances.Add(ci); } 感激题主牛头人不服@UWA问答社区提供了答复 AddressableQ:目前打算应用Addressable来实现资源热更新,理论真机测试发现当资源更新后,旧的资源Addressable并不会把它删除,同时能够看到App占用的数据文件会越来越大。请问有什么方法能够把指定的Group或Label的资源删除吗? A:咱们用的是笼罩式更新的流程(不是增量更新),Addressables版本是1.15.1。在把Bundle Naming设置为Filename后发现,在Caching中的AssetBundle目录还是带有 Hash值的。 图中可看到AssetBundle包名曾经是Group的名字了,然而下载到Caching中还是有Hash。 而后咱们是这么解决的:还是开启文件名的Hash,将Caching中的AssetBundle文件夹名保留到PlayerPrefs中,当检测到有下载的时候,读出PlayerPrefs中的值,把旧的对应AssetBundle包删除,并更新PlayerPrefs。 获取以后Catalog中所有AssetBundle文件夹名的办法,是从Addressables中复制进去的。 // 取得以后catalog中所有 assetbundle 保留的文件夹名 // 这个函数中援用到的办法没有列出,能够去 addressables 中源码中找 // 示例:CollectBundleNames(new string[]{ "SkllIcons", "ItemIcons", "AvatarIcons" }) private static List<string> CollectBundleNames(object[] keys) { List<string> result = new List<string>();#if ENABLE_CACHING foreach(var key in keys) { IList<IResourceLocation> locations; if (key is IResourceLocation resourceLocation && resourceLocation.HasDependencies) { foreach (var dep in resourceLocation.Dependencies) { if (dep.Data is AssetBundleRequestOptions options) { result.Add(options.BundleName); } } } else if (GetResourceLocations(key, typeof(object), out locations)) { var deps = GatherDependenciesFromLocations(locations); foreach (var dep in deps) { if (dep.Data is AssetBundleRequestOptions options) { result.Add(options.BundleName); } } } }#endif return result; } 删除AssetBundle包文件夹的办法: ...

January 11, 2021 · 1 min · jiezi

关于ios:OpenGL-渲染管线

OpenGL 渲染管线 前一半:模型坐标 MC ->世界坐标 WC ->VC , View Coordinates( 相机坐标, ) 变换矩阵, 合成变换 谬误: M = M( view ) M ( model ) 正确: 首先,要把相机坐标系,变换到模型坐标系中 须要 M( view ) 的逆变换M = M( view 逆, - 1 ) M ( model )glut, opengl 的一个扩大 opengl 是一个状态机 进入,某一个状态

January 11, 2021 · 1 min · jiezi

关于ios:iOS面试梳理-2020年8月初

本次面试周期为一周,筹备工夫为一周。 本次面试共投递25家,约面11家,最初大厂只面了360、字节,理论面了9家,收到4家offer。 事实证明:iOS有人要,很香。阐明:16年毕业,非重点大学,非计算机专业,本科 通过这次面试,对本人的定位又有了更多的认知,因为之前工作教训的起因,音视频这块将会成为我今后的次要方向,下一次心愿能做到一个资深iOS音视频工程师,我也会把更多工夫放到这下面。 的确算法能考查一个人的聪慧水平,这段时间齐全被女票碾压,好在算法多做一些,总结法则,也能把人训练的更聪慧,像奥数一样。 倡议大家用C写算法题;平时leetcode也用C。 主观面试感触最右印象较差,面试官不nice;360最佳,很仔细,很喜爱他们的leader;其余公司均不错简直每一家都有算法题,但整体难度不大(大部分是动静布局+树的遍历)360 音视频岗位主观评估:面的是音视频中台的岗位,本认为HR会举荐业务岗,筹备不充沛 一面: 以往直播和相机的业务考查AVFoundation、GPUImage两道算法题(诘问优化)二面: AVPlayer实现原理、数据缓存OpenGL ES 解决流程硬编、软编直播整体流程滤镜实现原理而后回去让我等告诉,说一周内。 抖音 业务岗主观评估:吐槽下,猎头给我很多面试题,让我背,后果一个都没遇到; 心愿大家遇到一个好的面试官 大数相加树的遍历(递归,队列两种形式)事件响应机制(传递链、响应链、手势)算法写进去了但花了50分钟,而后一个小时就过来了,我。。。能力有余,leetcode还要持续。 天真互动主观评估:这家尽管是守业公司,有三面,算上HR是4面,最初一面我感觉面试官程度超高,应该是个大神,被虐,但还是拿到了他家的offer。 xcode 证书校验过程json转model实现动静库动态库区别用纯AVFoundation框架,向视频中退出一个水印怎么做GPUImag框架介绍网络如何优化camke用法视频从采集到显示,最终写入文件流程AVPlayer缓存技术视频如何2倍播放,2倍速导出charles原理samplebuffer与pixelbuffer区别CMTime构造这个人的问题业余水平不逊于360。 最右一面 crash解体怎么解,解体到底层代码AVplayer 遍播遍下载如何设计一个网络库二面 FBO、H264、GPUImage3、大图加载、PCM计算工夫、如何实现宰割滤镜、音视频编码美术宝主观评估:我感觉是最高效的,简洁 kvoblocknotificationrunloop二面有个算法题两次面试加一起50分钟,而后就发offer,牛。 其余公司主观评估:大小公司都会有算法,有的用牛客网,有的用leetcode,纯手撸,无提醒。 NSCache 利用场景 与NSDictionary区别git工作流常见的锁,哪个性能最差,以及起因app逆向剖析leak工具应用charles原理http与https区别组件化思路继续集成计划copy、assign区别内存对齐sel、_cmd、isaTagged pointer剪刀石头布最长不反复字符串大量的数字排序leetcode 32leetcode 1237leetcode 828leetcode 283leetcode j67leetcode 116函数调用机制音讯转发h5、js总结iOS底层: kvo、runtime、kvc、notification、runloop、关键字(copy、assign、strong)、block、GCD其实货色不多,了解底层对于记忆规定,有很大帮忙。倡议源码和《iOS和OS X多线程和内存治理》一起看,以及一些大神的文章 音视频方向: 从AVFoundation动手,而后GPUImage,在而后OpenGL ES、MetalKitffmpeg、opencvc\c++rtmp、webrtc其余: 组件化设计模式与准则网络继续集成团队合作流程面试没有遇到Swift的问题,有点意外,这次面试,大概有一半应用swift,有一家纯swift开发,其余都是混编,或者有业务线是swift。 倡议大家先找到工作再辞职,除非工作太忙,没工夫。 对于Swiftswift我也筹备了,预计明年,swift相干的问题会暴发进去 泛型束缚关联类型类型擦除where应用codable 如何实现key映射AnyIteratorsequenceindexablecollectionmap、filter、reduce、sorted如何实现链式编程(snapkit)函数派发机制(class、struct、extension、protocol)kvo生效怎么办内存治理 pwt、vwt内存,对立类型的变量可选值与非选值内存有什么区别材料举荐如果你正在跳槽或者正筹备跳槽无妨动动小手,增加一下咱们的交换群1012951431来获取一份具体的大厂面试材料为你的跳槽多添一份保障。

January 5, 2021 · 1 min · jiezi

关于ios:iOS-开发技术体系

iOS 开发技术体系图: 层级次要框架Cocoa TouchUIKit 等MediaCore Graphics 、OpenGl ES、Core Animation 等Core ServicesCore Data、Foundation 等Core OSAccelerate Framework、External Accessory Framework、Security Framework、System 等从图中能够看到,要想编写成型的产品,须要的不仅仅是语言自身,同时许多库须要协同应用。语言只是产品开发的“胶水”,而框架和下面的这些库才是 iOS 产品的骨架。Swift 语言可能无缝的调用所有库。Cocoa 是苹果开发体系的统称,Cocoa 蕴含一些次要的 OC 对象库,咱们称这些对象库为框架。框架是由许多类、办法、函数和文档依照肯定的逻辑组织起来的汇合,以使研发程序更容易。为所有程序开发奠定根底的框架称为 Foundation 框架。术语 Cocoa:是指 Foundation 、Core Data 和 AppKit(Application Kit) 框架框架。用于 Mac OS X 设施上的利用程序开发。术语 Cocoa Touch:是指 Foundation 、Core Data 和 UIKit 框架。用于 iOS 设施上的利用程序开发。1、Core OS 核心层:蕴含 Accelerate Framework、External Accessory Framework、Security Framework、System 等几个框架,根本都是基于 C 语言的接口。是最靠近于操作系统的一层,在这个档次上,次要实现硬件以及操作系统接口封装。2、Core Services 外围服务层:蕴含Address Book Framework、CFNetwork Framework、Core Data Framework、Core Foundation Framework、Core Location Framework、Core Media Framework、Core Telephony Framework、Event Kit Framework、Foundation Framework、Mobile Core Services Framework、Quick Look Framework、Store Kit Framework、System Configuration Framework、Block Objects、Grand Central Dispatch、In App Purchase、Location Services、SQLite、XML Support 等一些框架,也根本都是基于 C 语言的接口。 Foundation 框架提供了字符串、数值的治理、容器及枚举、分布式计算、事件循环、URL 与数据流操作、国际化,以及其余与图形用户界面没有间接关系的性能。其中类和常数罕用“NS”前缀来标记。Core Data 框架次要在数据模型、数据存储方面发挥作用。在程序运行的时候,Core Data 框架会创立并治理数据模型的实例,同时还对外提供数据模型拜访接口。除此之外,Core Data 还能够将对象数据存储在 SQLite 数据库以取得性能优化、治理 undo/redo(撤销/重做)等操作,还反对在内存中对数据进行归类、过滤及组织数据。作为一名一个开发者,有一个学习的气氛跟一个交换圈子特地重要,这有个iOS交换群,不论你是小白还是大牛欢送入驻 ,分享BAT,阿里面试题、面试教训,探讨逆向安防等技术! ...

January 5, 2021 · 1 min · jiezi

关于ios:如何学习iOS逆向工程干货

逆向工程       逆向工程是一种产品设计技术再现的过程,对某一指标产品进行动态或动态分析钻研,从而演绎得出该产品的解决流程,性能构造以及技术形成等设计因素,而后把剖析进去的技术用于本人的产品。         逆向剖析的作用:                     ①:缩短开发周期                     ②:升高开发成本                     ③:寻找技术冲破 语言入门       如果你要逆向剖析iOS利用相干的货色,当然你得相熟Object-C这门语言,不要求对开发理解的如许深刻,然而首先得能了解它的语法,看懂Object-C的代码,并可能本人用这门语言写一些简略的利用及功能模块。 相熟工具       逆向工程往往须要借助一些工具,首先须要筹备一台越狱的机器,可能纯熟应用以下工具:             ①openSSH:登录越狱机器,进行文件传输等等。             ②Cycript:运行一些动静js脚本。             ③lldb:动静调试利用,查看运行时变量的值。             ④class-dump: 导出利用头文件,查看利用类和成员信息。             ⑤Keychain dumper:导出越狱设施的keychain。             ⑥Snoop-it,introspy:动静追踪剖析工具。             ⑦Hopper,IDA:动态反汇编剖析工具。             ⑧theos:开发tweak,进行动静hook。 举荐《iOS利用逆向工程》这本书,作者领有多年逆向开发实践经验,能够跟着外面讲的常识缓缓学习。总之,肯定要实际,肯定要实际,肯定要实际!(重要的事说三遍) 持续深刻文件构造       再深刻一些的话,须要相熟macho文件构造,包含它的形成,每一部分的作用,以及动静加载过程,而后能够进一步看看class-dump的源码。 深刻原理       应用工具,决不能只停留在工具的外表,肯定要晓得工具外部是怎么实现的,它的原理的是什么,本人是不是能够对它进行改良等等,比方theos的原理,Method Swizzling,fishhook等等。 知己知彼       再说到逆向剖析其实就是一个“攻”的过程,那么必定不是一帆风顺的,有攻就有防,当初很多利用对于避免被逆向剖析也做了很多不同的措施比方:反注入,反调试,反反汇编这些。作为一个逆向剖析者,同时也须要对防的过程和可能应用的办法有肯定的理解,能力更好的去寻找突破口。 相熟汇编       动态剖析中不免须要去浏览汇编代码,晓得各种寄存器的作用,以及对堆栈的操作过程。 后续倡议             ① 多关注一些github开源我的项目,包含下面说的那些              ② 多关注国内国外博客论坛,比方:逆向将来,iosre              ③ 多实际,看再多的货色,都要实际进去 ...

January 5, 2021 · 1 min · jiezi

关于ios:iOS安全审计入门

iOS沙盒 iOS沙盒机制简述起来就是,iOS应用程序只能在为该程序创立的文件系统中读取文件,不能够去其余中央拜访,此区域称为沙盒,所有的非代码文件都要保留在此,如图像、图标、声音、映像以及文本文件等。 归纳起来就是以下3点: 1、每个应用程序都有本人的存储空间;2、应用程序不能翻过本人的围墙去拜访别的存储空间的内容; 3、应用程序申请的数据都要通过权限检测,如果不符合条件的话,不会被放行。 当然,越狱的iOS设施不受此束缚。 所有在iOS程序都是在沙箱环境中运行,这种隔离是由操作系统保护,并基于其余四个不同的要害组件,四个组件别离是: Entitlements、Container、Powerbox和XPC 服务。 EntitlementsEntitlements是包含利用签名在内的一系列属性配置的列表。 为了启动其余性能,如icloud、推送告诉或Apple Pay,咱们须要给应用程序指定相应的权限。 换句话说,应用程序启动的越多,则沙盒外面的内容就越多。 Containers(容器)咱们晓得,在iOS中,每个程序都在本人的容器中运行。 启动应用程序时,会为应用程序的过程设置两个环境变量: HOME和CFFIXED_USER_HOME。。通过这种形式,操作系统会让利用认为本人的home目录处在iOS管制之下。 如果应用程序试图拜访真正的零碎用户主目录,沙盒会予以回绝。 Powerbox如果应用程序试图拜访本人的沙盒以外的文件,零碎会回绝该申请。 而iOS提供了一个称为Powerbox的可信中介过程,应用程序能够调用该过程来表明本人有权拜访本人沙箱之外的某个文件。 在收到相似的拜访申请之后,零碎会提醒用户抉择哪些文件能够被利用拜访。 一旦该用户做出抉择,那么该文件被间接提供给应用程序。 XPC Services为了容许开发者执行雷同利用组件的特权拆散,iOS启用了一种叫做XPC的过程间通信技术。 单个的XPC服务在本人的沙箱中运行,这也就意味着不同的XPC服务具备不同的权限集。 应用程序的XPC服务只能由应用程序自身拜访,而其寿命则齐全由操作系统管制。 对于越狱(倡议)为了对应用程序进行彻底的审计,你须要对iOS设施进行越狱操作,尽管说不越狱也能进行测试,但其功力就降落了很多,甚至还会导致有些审查无奈发展(咱们会对须要越狱的局部加以标注)。 对于越狱,本文不做探讨,有趣味的看官能够参考以下地址: http://resources.infosecinstitute.com/ios-application-security-part-1-setting-up-a-mobile-pentesting-platform/ 近程 API大部分挪动利用都依赖内部Web的API执行用户认证、同步、或者利用的本地数据备份等申请。 为了执行API测试,须要通过以下形式代理挪动应用程序申请: 在管制机上运行代理(比如说Burp)。 要设置该设施的代理申请到另一台主机,请参考官网指南(传送门)。 要在本地挪动应用程序上执行网络通信的查看列表如下: 1.与近程API的纯文本通信;2.短少SSL证书锁定; 3.SSL配置谬误。 与近程API的纯文本通信首先查看的就是,应用程序应用SSL/TLS进行网络通讯。 如果采纳明文HTTP协定,应用程序在中间人攻打中就会变得异样软弱,一个潜在的攻击者可能截获并批改app与API的网络数据。 短少SLL证书锁定证书锁定是将主机和预期的SSL证书或公钥相关联的过程。 在iOS设施设置为通过受控代理正确代理网络流量后,启动应用程序并尝试通过登录来生成网络流量。 如果利用回绝了这次连贯,那么证书锁定就曾经被正确设置了,相同,就可能会对挪动应用程序流量执行中间人攻打。 【须要越狱】如果证书锁定被执行了,尝试应用SSL kill Switch(一个黑盒工具,能够在iOS和OS X中组织SSL证书验证),以便更好的理解API端点和利用调用的参数。 SSL配置谬误在挪动利用开发的过程中,开发者为了可能放慢开发过程,就可能承受任何自签名的SSL证书。 当应用程序部署在Apple Store中时,可能就会遗记对签名进行查看。 所以,子对利用进行审计时,要确保利用能够接管任何类型的自签名证书。 动态剖析在本文中,咱们用Yelp作为例子来解说。既然是例子,那这个利用是没有任何破绽或者利用的。 抉择它,纯正是为了形容如何进行iOS应用程序的平安审计。 一个应用程序的动态剖析波及审查和撤销应用程序二进制文件。 上面是一些执行的工具和须要审计的列表: Needle该工具有如下性能能够失常应用: 容许应用程序二进制文件,存储,动静和动态剖析(前提是,该源代码拜访可用)。 当然,咱们还能够用它将Cycript和Frida进行hooking。 Needle由Python语言汇编而成,很容易就通过shell来启动: python needle.py Needle须要一些选项能力连贯到iOS设施(须要在其上运行OpenSSH服务器)。 在上面的例子中,iOS设施的IP是192.168.2.3,并且咱们须要连贯到默认SSH端口22,并应用metadata(元数据)模块提取一些根本的信息。 set IP 192.168.2.3set PORT 22use metadatarun 运行上述命令的后果,显示了应用程序在设施文件系统中的地位、反对的CPU架构以及进行审计所需的最低iOS版本等等。 ...

January 5, 2021 · 2 min · jiezi

关于ios:iOS安全审计入门

iOS沙盒 iOS沙盒机制简述起来就是,iOS应用程序只能在为该程序创立的文件系统中读取文件,不能够去其余中央拜访,此区域称为沙盒,所有的非代码文件都要保留在此,如图像、图标、声音、映像以及文本文件等。 归纳起来就是以下3点: 1、每个应用程序都有本人的存储空间;2、应用程序不能翻过本人的围墙去拜访别的存储空间的内容; 3、应用程序申请的数据都要通过权限检测,如果不符合条件的话,不会被放行。 当然,越狱的iOS设施不受此束缚。 所有在iOS程序都是在沙箱环境中运行,这种隔离是由操作系统保护,并基于其余四个不同的要害组件,四个组件别离是: Entitlements、Container、Powerbox和XPC 服务。 EntitlementsEntitlements是包含利用签名在内的一系列属性配置的列表。 为了启动其余性能,如icloud、推送告诉或Apple Pay,咱们须要给应用程序指定相应的权限。 换句话说,应用程序启动的越多,则沙盒外面的内容就越多。 Containers(容器)咱们晓得,在iOS中,每个程序都在本人的容器中运行。 启动应用程序时,会为应用程序的过程设置两个环境变量: HOME和CFFIXED_USER_HOME。。通过这种形式,操作系统会让利用认为本人的home目录处在iOS管制之下。 如果应用程序试图拜访真正的零碎用户主目录,沙盒会予以回绝。 Powerbox如果应用程序试图拜访本人的沙盒以外的文件,零碎会回绝该申请。 而iOS提供了一个称为Powerbox的可信中介过程,应用程序能够调用该过程来表明本人有权拜访本人沙箱之外的某个文件。 在收到相似的拜访申请之后,零碎会提醒用户抉择哪些文件能够被利用拜访。 一旦该用户做出抉择,那么该文件被间接提供给应用程序。 XPC Services为了容许开发者执行雷同利用组件的特权拆散,iOS启用了一种叫做XPC的过程间通信技术。 单个的XPC服务在本人的沙箱中运行,这也就意味着不同的XPC服务具备不同的权限集。 应用程序的XPC服务只能由应用程序自身拜访,而其寿命则齐全由操作系统管制。 对于越狱(倡议)为了对应用程序进行彻底的审计,你须要对iOS设施进行越狱操作,尽管说不越狱也能进行测试,但其功力就降落了很多,甚至还会导致有些审查无奈发展(咱们会对须要越狱的局部加以标注)。 对于越狱,本文不做探讨,有趣味的看官能够参考以下地址: http://resources.infosecinstitute.com/ios-application-security-part-1-setting-up-a-mobile-pentesting-platform/ 近程 API大部分挪动利用都依赖内部Web的API执行用户认证、同步、或者利用的本地数据备份等申请。 为了执行API测试,须要通过以下形式代理挪动应用程序申请: 在管制机上运行代理(比如说Burp)。 要设置该设施的代理申请到另一台主机,请参考官网指南(传送门)。 要在本地挪动应用程序上执行网络通信的查看列表如下: 1.与近程API的纯文本通信;2.短少SSL证书锁定; 3.SSL配置谬误。 与近程API的纯文本通信首先查看的就是,应用程序应用SSL/TLS进行网络通讯。 如果采纳明文HTTP协定,应用程序在中间人攻打中就会变得异样软弱,一个潜在的攻击者可能截获并批改app与API的网络数据。 短少SLL证书锁定证书锁定是将主机和预期的SSL证书或公钥相关联的过程。 在iOS设施设置为通过受控代理正确代理网络流量后,启动应用程序并尝试通过登录来生成网络流量。 如果利用回绝了这次连贯,那么证书锁定就曾经被正确设置了,相同,就可能会对挪动应用程序流量执行中间人攻打。 【须要越狱】如果证书锁定被执行了,尝试应用SSL kill Switch(一个黑盒工具,能够在iOS和OS X中组织SSL证书验证),以便更好的理解API端点和利用调用的参数。 SSL配置谬误在挪动利用开发的过程中,开发者为了可能放慢开发过程,就可能承受任何自签名的SSL证书。 当应用程序部署在Apple Store中时,可能就会遗记对签名进行查看。 所以,子对利用进行审计时,要确保利用能够接管任何类型的自签名证书。 动态剖析在本文中,咱们用Yelp作为例子来解说。既然是例子,那这个利用是没有任何破绽或者利用的。 抉择它,纯正是为了形容如何进行iOS应用程序的平安审计。 一个应用程序的动态剖析波及审查和撤销应用程序二进制文件。 上面是一些执行的工具和须要审计的列表: Needle该工具有如下性能能够失常应用: 容许应用程序二进制文件,存储,动静和动态剖析(前提是,该源代码拜访可用)。 当然,咱们还能够用它将Cycript和Frida进行hooking。 Needle由Python语言汇编而成,很容易就通过shell来启动: python needle.py Needle须要一些选项能力连贯到iOS设施(须要在其上运行OpenSSH服务器)。 在上面的例子中,iOS设施的IP是192.168.2.3,并且咱们须要连贯到默认SSH端口22,并应用metadata(元数据)模块提取一些根本的信息。 set IP 192.168.2.3set PORT 22use metadatarun 运行上述命令的后果,显示了应用程序在设施文件系统中的地位、反对的CPU架构以及进行审计所需的最低iOS版本等等。 ...

January 5, 2021 · 2 min · jiezi

关于ios:IOS-UIViewController-API生命周期详解

在UIKit框架中只有一个根制图控制器。视图控制器用来治理界面和解决界面的类对象,程序启动前必须创立根视图控制器。所有视图控制器都须要自定义实现,必须继承于UIViewController 实现。xcode新创建的我的项目默认是通过info.plist 文件配置 main.storyboard 文件主动创立根视图ViewController。继承于UIView创立根视图控制器#import "AppDeletegate.h"...code- (void) didFinishLuanchingWithOptions:(NSDictionary *)luanchOptions { // 设置屏幕宽高 self.window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen]]; // 设置视图控制器为window根节点 self.window.rootViewController = [[UIViewController alloc] init];}...code自定义ViewController#import "ViewController.h"@implementation ViewController// 当视图控制器第一次被加载显示视图- (void) viewDidLoad{ [super viewDidLoad]; //创立子视图 UIView *view = [[UIView alloc] init]; view.frame = CGReactMake(0, 0, 300, 45); view.backgroundColor = [UIColor greenColor]; // 退出视图 [self.view addSubView:view];}@end增加子视图控制器#import "ViewController.h"@implementation ViewController// 当视图控制器第一次被加载显示视图- (void) viewDidLoad{ [super viewDidLoad]; self.view.backgroundColor = [UIColor blueColor];}// 当屏幕被点击时候触发-(void)touchesBegan:(NNSet<UITouch *> *)touches withEvent:(UIEvent *)event{ UIViewController *sonViewController = [[UIViewController alloc] init]; [self presentViewController: sonViewController animate:YES complation:nil];}@endAPI(void)touchesBegan:(NNSet<UITouch *> *)touches withEvent:(UIEvent *)event 当屏幕被点击时候触发。(void)presentViewController:(UIViewController *) animate:(BOOL) completion:(callbacl) 显示一个视图控制器到屏幕上,参数1:UIViewController 新的视图控制器对象,参数2:animate 是否开启动画成果,参数3:completion: 执行实现后的回调函数,不须要传nil即可。(void)dismissViewControllerAniamted:(BOOL) completion:(callback) 使以后视图控制器在屏幕隐没,参数1:animte 是否开启动画成果,参数2:completion 执行实现后的回调函数,不须要传nil即可。(void)removeFromSuperView 将以后视图实例从父级删除(void)bringSubViewToFront: UIView* 将一个子视图调整到最顶级绘制(void)sendSubViewToBack: UIView* 将一个子视图调整到最低层绘制#### 生命钩子 ...

January 3, 2021 · 1 min · jiezi

关于ios:IOS-模态弹窗与操作版使用-UIAlertController

IOS8 当前UIAlertView 改用 UIAlertController 实现模态窗和操作板。UIAlertController 的应用与UIAlerView 十分不同,它实际上是把弹窗内容与显示方式、按钮列表、拆散。实现起来非常简单。如下1.调用静态方法创立弹窗控制器 alertControllerWithTitle申明弹窗控制器,title 示意弹窗的题目,message示意弹窗文字内容,重点是preferredStyle 示意弹窗的显示方式,UIAlertControllerStyleActionSheet操作版形式显示,UIAlertControllerStyleAlert 模态窗形式 // 创立控制器 UIAlertController* alertConrtoll = [UIAlertController alertControllerWithTitle:@"谬误" message:@"网络谬误,获取失败" preferredStyle:UIAlertControllerStyleActionSheet];2.为弹窗控制器减少按钮 UIAlertActionUIAlertActions 是弹窗按钮类,通过静态方法actionWithTitle 创立,style示意按钮格调,handler是按钮被点击的回调函数。咱们创立完按钮组件通过 addAction退出弹窗控制器 // 创立弹窗按钮组件 UIAlertAction* okBtn = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler: nil]; UIAlertAction* cancelBtn = [UIAlertAction actionWithTitle:@"从新获取" style:UIAlertActionStyleCancel handler: nil]; // 增加按钮 [alertConrtoll addAction:okBtn]; [alertConrtoll addAction:cancelBtn];显示弹窗显示弹窗和插入视图控制器办法统一。 [self presentViewController:alertConrtoll animated:YES completion:nil];UIAlertController 属性名称类型阐明默认值titleNSString题目 preferredStyleUIAlertControllerStyle弹窗显示方式,只读 actionsNSArray<UIAlertAction *>弹窗按钮列表,只读 UIAlertAction 属性名称类型阐明默认值enabledBOOL是否启用 titleNSString题目 styleUIAlertActionStyle按钮格调UIAlertActionStyleDefaultUIAlertController API+ (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle 创立弹窗控制器并且设置题目,内容,显示格调- (void)addTextFieldWithConfigurationHandler:(void (^ __nullable)(UITextField *textField))configurationHandler 增加可输出弹窗UIAlertAction API+ (instancetype)actionWithTitle:(nullable NSString *)title style:(UIAlertActionStyle)style handler:(void (^ __nullable)(UIAlertAction *action))handler 创立弹窗按钮并且设置题目和格调、处理事件

January 3, 2021 · 1 min · jiezi

关于ios:IOS-单行文本输入框-UITextField-使用

UITextField 继承 UIControl 类,只反对单行输出和显示,可输出明码类型。反对实现代理 UITextFieldDelegate属性名称类型阐明默认值textNSString文本输出值 textColorUIColor文本色彩 UIFontUIFont文本大小 textAlignmentNSTextAlignment文本方向NSLeftTextAlignmentborderStyleUITextBorderStyle边框格调UITextBorderStyleNoneplaceholderNSString提醒文本 clearsOnBeginEditingBOOL开始编辑时候清空内容NOadjustsFontSizeToFitWidthBOOL以宽度主动调整字体大小NObackgroundUIImage背景 clearButtonModeUITextFieldViewMode设置什么时候显示革除按钮UITextFieldViewModeNeverleftViewUIView右边视图 rightViewUIView左边视图 inputViewUIView响应输出时候显示的视图 leftViewModeUITextFieldViewMode设置什么时候显示右边视图模式UITextFieldViewModeNeverrightViewModeUITextFieldViewMode设置什么时候显示左边视图模式UITextFieldViewModeNeverAPI- (BOOL)endEditing:(BOOL)force; 是否强制勾销以后输出行为##### 代理协定函数 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField; 当开始编辑前,返回NO能够阻止编辑- (void)textFieldDidBeginEditing:(UITextField *)textField 当编辑输出完结触发(BOOL)textFieldShouldEndEditing:(UITextField *)textField 完结编辑前,返回NO能够阻止编辑完结(void)textFieldDidEndEditing:(UITextField *)textField 编辑完结- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 当输出内容产生扭转触发,range示意扭转地位和长度。返回NO可阻止扭转- (void)textFieldDidChangeSelection:(UITextField *)textField 输出内容产生扭转后触发,IOS13反对。- (BOOL)textFieldShouldClear:(UITextField *)textField 当内容产生革除触发,返回NO阻止革除(BOOL)textFieldShouldReturn:(UITextField *)textField 当按下回车键触发,返回NO可阻止默认行为参考代码 UITextField* _textField = [[UITextField alloc] init]; // 设置地位 _textField.frame = CGRectMake(50, 100, 300, 60); // 设置圆角边框格调 _textField.borderStyle = UITextBorderStyleRoundedRect; // 设置值 _textField.text = @""; // 设置提醒语 _textField.placeholder = @"请输出用户名"; // 设置键盘类型 _textField.keyboardType = UIKeyboardAppearanceDefault; // 设置代理 _textField.delegate = self; // 设置是否为明码类型 _textField.secureTextEntry = NO; UITextField* _passwdText = [[UITextField alloc] init]; _passwdText.frame = CGRectMake(50, 200, 300, 60); _passwdText.borderStyle = UITextBorderStyleRoundedRect; _passwdText.placeholder = @"请输出明码"; _passwdText.keyboardType = UIKeyboardAppearanceDefault; _passwdText.secureTextEntry = YES; [self.view addSubview:_textField]; [self.view addSubview:_passwdText];

January 3, 2021 · 1 min · jiezi

关于ios:IOS-定义手势监听器详解利用-UIGestureRecognizer-进行捏合旋转平移点击长按手势事件响应

IOS中咱们能够通过UITouch进行触摸事件监听,然而UITouch实现捏合、旋转、长按等手势事件监听十分麻烦。IOS中提供 UIGestureRecognizer 的子类帮咱们简洁等实现捏合、旋转等非凡手势监听。并且一个视图可增加多个不同等手势监听器。开启userInteractionEnabledIOS 中UIView 默认是不可响应事件的,咱们须要开启 userInteractionEnabled 方可进行事件响应。上面代码中咱们创立了一个图片视图,并且开始事件响应。UIView 通过 addGestureRecognizer 进行增加手势监听器和 removeGestureRecognizer 删除手势监听器// 创立图片视图- (void) creareImg { UIImage* image = [UIImage imageNamed:@"zz.jpeg"]; _imageView = [[UIImageView alloc] initWithImage:image]; UIScreen* screen = [UIScreen mainScreen]; const int width = 200; const int height = 100; const float x = screen.bounds.size.width / 2 - width / 2; const float y = screen.bounds.size.height / 2 - height; _imageView.frame = CGRectMake(x, y, width, height); _imageView.userInteractionEnabled = YES; [self.view addSubview:_imageView];}理解UIGestrueRecognizer在开始应用自定义手势之前咱们先理解一下 UIGestrueRecognizer 的,因为自定义都是基于 UIGestrueRecognizer 继承实现的。 UIGestrueRecognizer 是一个手势监听器,它能够设置多个手指同时触发触发事件等行为。它具备代理协定 UIGestureRecognizerDelegate 上面我来看一下它次要的属性和API、代理办法。属性名称类型阐明默认值stateUIGestureRecognizerState以后手势状态,可分为手势开始,手势扭转,手势完结等等 enabledBOOL是否启用YESviewUIView手势监听的视图 requiresExclusiveTouchTypeBOOL是否疏忽其余手势类型,设置为YES将只响应一种手势类型NOnumberOfTouchesNSUInteger多少根手指触发手势1API- (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action 初始化并增加事件监听函数- (void)addTarget:(id)target action:(SEL)action 增加事件监听函数- (void)removeTarget:(nullable id)target action:(nullable SEL)action 删除事件监听函数- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer 增加其余手势抵触生效器,当触发以后手势时,指定的手势将生效。- (CGPoint)locationInView:(nullable UIView*)view 获取绝对于指定视图的坐标地位- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(nullable UIView*)view 获取指定手指绝对指定视图的坐标地位代理协定- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 手势筹备开启时候触发,返回NO则勾销手势。- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 当手势与其余手势同时产生辨认时候触发,返回YES运行两个手势同时进行,返回NO则阻止同时辨认。- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 是否给事件接管手指。在手势开始触发事件触发前触发,返回NO能够阻止事件获取触摸的手指。- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press 是否给按下事件接管手指,在按下手势事件触发前触发。返回NO可阻止事件获取触摸的手指。咱们理解革除GestureRecognizer 类,上面咱们来理解其子类手势的应用。UITapGestureRecognizer 点击手势点击手势,可设置手指数量、点击次数触发的手势// 创立点击手势- (void) createTapGes { _imageView.userInteractionEnabled = YES; // 开启响应事件属性 UITapGestureRecognizer* tapOneGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(big)]; // 创立手势 tapOneGes.numberOfTapsRequired = 1; // 触发事件的点击次数 tapOneGes.numberOfTouchesRequired = 1; // 触发事件的手指数量 [_imageView addGestureRecognizer:tapOneGes]; // 增加手势监听器}// 点击触发事件- (void) big { UIScreen* screen = [UIScreen mainScreen]; [UIView beginAnimations:nil context:nil]; // 开始布局动画 _imageView.frame = CGRectMake(0, 0, screen.bounds.size.width, screen.bounds.size.height); [UIView commitAnimations]; // 完结布局动画}UIPinchGestureRecognizer 捏合手势捏合手势,示意双指捏合缩放的手势触发。罕用于对图片查看缩放事件监听// 捏合手势- (void) createPinchGes { UIPinchGestureRecognizer* pinch = [[UIPinchGestureRecognizer alloc] init]; // 创立手势 [pinch addTarget:self action:@selector(scale:)]; // 增加事件函数 pinch.delegate = self; // 设置代理 [_imageView addGestureRecognizer:pinch]; // 视图增加手势监听器}- (void) scale: (UIPinchGestureRecognizer*) pinch { UIView* IView = pinch.view; // 获取监听的视图 CGAffineTransform transiform = CGAffineTransformScale(IView.transform, pinch.scale, pinch.scale); // 计算缩放后的矩阵 if (transiform.a < 0.4) { // 缩放小于0.4阻止 transiform.a = 0.4; transiform.d = 0.4; } IView.transform = transiform; // 从新设置矩阵 pinch.scale = 1; // 重置缩放矩阵,否则手势会始终累加}// 增加容许多个手势触发代理函数- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}下面代码中咱们通过获取捏合手势的scale 属性获取用户捏合缩放的大小。并且应用内置api CGAffineTransformScale 从新计算了视图的2D矩阵(矩阵示意图像变形,能够理解一下图形学),留神!最初一步中必须重置手势的scale 否则会始终累加导致计算矩阵谬误,如果不想重置的话那就须要批改 CGAffineTransformScale 的第一个参数为根底矩阵参数。 ...

January 3, 2021 · 3 min · jiezi

关于ios:iOS-中-MIDI-的处理结合-AudioKit-源代码

MIDI, MIDI 不是音频数据MIDI 乐器数字接口, Musical Instrument Digital Interface MIDI 计算机能了解的乐谱,计算机和电子乐器都能够解决的乐器格局 MIDI 不是音频信号,不蕴含 pcm buffer 通过音序器 sequencer,联合音频数据 / 乐器 ,播放 MIDI Event 数据 ( 通过音色库 SoundFont,播放乐器的声音 ) 通过 AVAudioSequencer ,简略播放 连贯 AVAudioEngine 的输出和输入, 输出 AVAudioUnitSampler → 混频器 engine.mainMixerNode → 输入 engine.outputNode 拿 AVAudioEngine ,创立 AVAudioSequencer ,就能够播放 MIDI 了 配置 AVAudioEngine 的输入输出输出 AVAudioUnitSampler → 混频器 engine.mainMixerNode // 连贯输出、输入 var engine = AVAudioEngine() var sampler = AVAudioUnitSampler() engine.attach(sampler) // 节点 node 的 bus 0 是输入, // bus 1 是输出 let outputHWFormat = engine.outputNode.outputFormat(forBus: 0) engine.connect(sampler, to: engine.mainMixerNode, format: outputHWFormat) guard let bankURL = Bundle.main.url(forResource: soundFontMuseCoreName, withExtension: "sf2") else { fatalError("\(self.soundFontMuseCoreName).sf2 file not found.") } // 载入资源 do { try self.sampler.loadSoundBankInstrument(at: bankURL, program: 0, bankMSB: UInt8(kAUSampler_DefaultMelodicBankMSB), bankLSB: UInt8(kAUSampler_DefaultBankLSB)) try engine.start() } catch { print(error) } 混频器 engine.mainMixerNode → 输入 engine.outputNode, 不须要解决,就用 AVAudioEngine 默认的用 AVAudioSequencer ,播放 MIDIAVAudioSequencer 能够用不同的音频轨道 track,对应不同的乐器声音 ...

December 31, 2020 · 4 min · jiezi

关于ios:iOS-初探-AFNetworking

本文不对AFNetworking作全面的解析,仅比照解析一下2.x和3.x的差别。 AFNetworking源码剖析全套教程点击获取1. AFNetworking分为如下5个功能模块: 网络通信模块(AFURLSessionManager、AFHTTPSessionManger)网络状态监听模块(Reachability)网络通信安全策略模块(Security)网络通信信息序列化/反序列化模块(Serialization)对于iOS UIKit库的扩大(UIKit)AFNetworking 2.x须要常驻线程而3.x不须要常驻线程2.x常驻线程用来并发申请和解决数据回调,防止多个网络申请的线程开销(不必开拓一个线程,就保活一条线程);而3.x不须要常驻线程是因为NSURLSession能够指定回调delegateQueue,NSURLConnection不行;NSURLConnection的一大痛点就是:发动申请后,须要始终处于期待回调的状态。而3.x后NSURLSession解决了这个问题;NSURLSession发动的申请,不再须要在以后线程进行回调,能够指定回调的delegateQueue,这样就不必为了期待代理回调办法而保活线程了3.x须要设置最大并发数为1(self.operationQueue.maxConcurrentOperationCount = 1),2.x为什么不须要性能不一样:3.x的operationQueue是用来接管NSURLSessionDelegate回调的,鉴于一些多线程数据拜访的安全性思考,设置了maxConcurrentOperationCount = 1来达到并发的申请串行的进行回调的成果。而2.x的operationQueue是用来增加operation进行并发申请的,所以不要设置为1留神:并发数并不等于所开拓的线程数,具体开拓几条线程由零碎决定 3. x为什么要串行回调- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task { NSParameterAssert(task); AFURLSessionManagerTaskDelegate *delegate = nil; [self.lock lock]; //给所要拜访的资源加锁,避免造成数据凌乱 delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)]; [self.lock unlock]; return delegate;} 从代码能够看出,这边对self.mutableTaskDelegatesKeyedByTaskIdentifier的拜访进行了加锁,目标是保障多线程环境下的数据安全。既然加了锁,就算maxConcurrentOperationCount不设为1,当某个申请正在回调时,下一个申请还是得期待始终到上个申请获取完所要的资源后解锁,所以这边并发回调也是没有意义的。相同多task回调导致的多线程并发,还会导致性能的节约查看原文

December 29, 2020 · 1 min · jiezi

关于ios:Swift-文件处理-完成文件移动

实现了 Swift 文件解决: 强迫症文本解析 之后, 就能够挪动文件了 背景:学习 AudioKit/AudioKit 的源代码,有一个库 AudioKit/Cookbook, 他的例子都在一层,批改调试不不便, 建设分层的物理文件夹,再建设分层的 Xcode 工程逻辑目录,会不便很多 思路前文曾经解析进去,须要的文件夹名称,和对应的构造体名 ( SwiftUI 中的 View 是构造体, 个别的 View 是 class ) 通过查找,把对应的构造体名,换成对应的文件门路, 创立文件夹,挪动文件,出工 代码实现命令行程序中,采纳了这个库 JohnSundell/Files 从类名到文件门路先介绍下 classNameResult 的数据结构, classNameResult 是一个二维数组, 他的元素 element[0] 是文件夹名称, 他的元素 element[1...] 是对应的 View 构造体名 let outCnt = classNameResult.countvar result = [[File]](repeating: [File](), count: outCnt)// 间接指定,须要解决的文件夹门路let path = "\(NSHomeDirectory())/Downloads/Cookbook-main 2/Cookbook/Cookbook/Recipes"let folder = try Folder(path: path)// while 循环之前,个别 var i = 0// 这里,后面的代码 i 循环过了, // i 重置为 0, 接着作循环i = 0// 3 层循环while i < outCnt { // 对于每一个 destination 文件夹 var j = 1 let innerCnt = classNameResult[i].count while j < innerCnt{ // 对于每一个须要解决的构造体名称 third: for file in folder.files { // 对于本来存在的文件夹,外面的每一个文件 do { // swift 读取文件内容 let content = try String(contentsOfFile: file.path, encoding: .utf8) // swift 读取文件内容蕴含 if content.contains("struct \(classNameResult[i][j])"){ result[i].append(file) break third } } catch { print(error) } } j += 1 } i += 1}创立文件夹,与挪动文件i = 0let manager = FileManager.defaultwhile i < outCnt { // 先创立文件夹 let folderPath = path + "/\(classNameResult[i][0])" do { try manager.createDirectory(atPath: folderPath, withIntermediateDirectories: false, attributes: nil) } catch { fatalError() } let destinationFolder = try Folder(path: folderPath) for tbdFile in result[i]{ // 判断存不存在 // 可能一个文件外面,有多个构造体, // 解决后面的构造体,把文件挪动了 // 解决到前面的时候,该文件就不存在了 if manager.fileExists(atPath: tbdFile.path){ try tbdFile.move(to: destinationFolder) } } i += 1}创立文件夹办法func createDirectory(atPath path: String, withIntermediateDirectories createIntermediates: Bool, attributes: [FileAttributeKey : Any]? = nil) throws其中第二个参数 ...

December 28, 2020 · 2 min · jiezi

关于ios:最新阿里体育iOS岗面试题

前言面试之前并不理解阿里体育这个公司,三面的时候依据面试官的介绍,阿里体育是阿里巴巴的投资公司,治理团队和阿里巴巴没有关系,然而开发流程却是恪守的阿里巴巴的标准,阿里体育并不算是阿里巴巴的子公司,这点要留神。阿里体育整个公司规模不大,客户端技术研发人员截至目前只有10人左右,某种程度上算是一个守业公司。 一面(电话面试)一面电话面试比拟根底,全是一些特地常见的根底题 对属性修饰词理解多少(形容一下所以的属性修饰词和用法及注意事项,留神不要说漏了)对于block的理解,波及__block、__weak、__strong的具体用法及原理对于多线程的一些认识,波及NSTread NSOperation GCD,并且会依据你的答案在多问一些,不过都是根底问题就是SDWebImage加载图片的流程(须要对SDWebImage的源码有肯定的理解才行) 其余的问题临时不记得了,不过只有好好温习,根本都能答上 二面(面试)二面全是针对你的简历上的我的项目经验进行发问编程题:求两个view的最近公共父试图。编程题:反转一个由字母和空格组成的字符串 三面(部门leader面试)对开发流程上有什么本人独到的见解,之前之前开发遇到过那些问题,都是怎么解决的,具体说说如果给你一个从没做过的难题让你去解决,怎么做等等编程题:大数相加(网上搜“编程题大数相加”能找到一堆答案) 四面(hr面试)最骄傲或能拿的出手的工作是什么为什么到职(陈词滥调的问题),及为什么抉择上家公司,为什么要来面试阿里体育对阿里体育及面试官的认识薪资待遇。我开的条件是15k*14薪,作为一个两年教训的研发,不晓得开高了还是低了 总结一面的技术面试,面试官问的过于简略和通俗了,给我的感觉是面试官自身本人的技术实力也不强二面面试官只针对我的项目经验进行一些简略的发问,并没有深刻的进行探讨,给我的感觉是面试官的我的项目教训可能也不是很丰盛。在编程题的时候,明明是一道简略的编程题,我在给出正确的解题思路后,要求我具体的写明代码,说实话,其实是有点排挤面试时手写代码这种事件的三面只是简略和leader聊一聊我的项目经验和对开发的一些了解,并没有什么特地的四面是hr面试,说实话,我是冲着阿里的名声去面试的,当晓得阿里体育并不算阿里巴巴的子公司时,其实就不太想继续下去了,最初也只是草草完结,最初hr说要和共事商量一下,让我回去等音讯(感觉也不像是间接被拒)总的来说,阿里体育作为一家阿里巴巴投资的守业公司,工作环境和待遇应该是都不错的。面试体验给我的感觉是像一个小公司,比不上百度、腾讯这种大公司的面试的难度、广度、给人的压迫感等等。 结交人脉最初举荐个我的iOS交换群:642363427'有一个独特的圈子很重要,结识人脉!外面都是iOS开发,全栈倒退,欢送入驻,共同进步!(群内会收费提供一些群主珍藏的收费学习书籍材料以及整顿好的几百道面试题和答案文档!)**——点击退出:iOS开发交换群以下材料在群文件可自行下载**驻 ,分享BAT,阿里面试题、面试教训,探讨技术, 大家一起交流学习成长!** 作者:泡泡花生链接:[https://juejin.cn/post/684490...]

December 22, 2020 · 1 min · jiezi

关于ios:如何制作Live-Photo并存入照片库

本文次要是讲如何将一张照片和一部视频合并为动静照片,而后存入照片库。 动静照片(Live Photo)的机密动静照片外表上看就是一张图片加一部短视频,它们在手机中的文件名是雷同的,只是扩展名不同,一个是JPG,一个是MOV,都是大写的。 注:iOS是辨别大小写的,而macOS是不辨别大小写的,然而在显示的时候是辨别大小写的。 我已经试图将电脑中的短视频,外加一张截图,把它们名字改成一样的,而后放入我的手机中(/User/Media/DCIM/100APPLE/),接着删除照片库的数据库(/User/Media/PhotoData/Photos.sqlite),重启手机再进入照片库,发现零碎只能认出截图,并没有将它辨认为动静照片。 上StackOverflow搜寻发现,图片和视频中都有额定的元数据用于辨认动静照片。 1、 图片(JPEG) 元数据(Metadata){ "{MakerApple}" : { "17" : "<Identifier>" }}2、 视频(MOV) H.264编码YUV420P色彩编码顶层元数据(Metadata){ "com.apple.quicktime.content.identifier" : "<Identifier>"}元数据轨道(Metadata Track){ "MetadataIdentifier" : "mdta/com.apple.quicktime.still-image-time", "MetadataDataType" : "com.apple.metadata.datatype.int8"}元数据轨道中的元数据{ "com.apple.quicktime.still-image-time" : 0}其中,图片和视频的<Identifier>必须统一。 应用代码增加元数据晓得了动静照片的机密,那么事件就好办了,咱们只须要增加相应的元数据到图片和视频中就能够了。 尽管不须要对视频从新编码,然而也没法简略地应用一两行代码就能够实现元数据的插入。只能应用AVAssetReader和AVAssetWriter边读边写。 前提1、iOS版本须要9.1以上,否则不反对将动静照片存入照片库。 2、导入以下头文件。 #import <Photos/Photos.h>#import <CoreMedia/CMMetadata.h>#import <MobileCoreServices/MobileCoreServices.h>图片增加元数据给图片增加元数据非常简单,代码如下。 - (void)addMetadataToPhoto:(NSURL *)photoURL outputPhotoFile:(NSString *)outputFile identifier:(NSString *)identifier { NSMutableData *data = [NSData dataWithContentsOfURL:photoURL].mutableCopy; UIImage *image = [UIImage imageWithData:data]; CGImageRef imageRef = image.CGImage; NSDictionary *imageMetadata = @{(NSString *)kCGImagePropertyMakerAppleDictionary : @{@"17" : identifier}}; CGImageDestinationRef dest = CGImageDestinationCreateWithData((CFMutableDataRef)data, kUTTypeJPEG, 1, nil); CGImageDestinationAddImage(dest, imageRef, (CFDictionaryRef)imageMetadata); CGImageDestinationFinalize(dest); [data writeToFile:outputFile atomically:YES];}其中,kCGImagePropertyMakerAppleDictionary的值是{MakerApple},identifier的值由[NSUUID UUID].UUIDString生成。 ...

December 21, 2020 · 6 min · jiezi

关于ios:iOS逆向-HOOK原理之fishhook

一、HOOK概述1.HOOK定义HOOK翻译成中文为“挂钩”、“钩子”,在iOS逆向畛域中指的是扭转程序运行流程的一种技术,通过HOOK能够让他人的程序执行本人所写的代码 下列示意图就是对HOOK性能的形象诠释: 注入恶意代码让用户误以为打卡胜利,理论并没有实现打卡(只批改两头流程)注入恶意代码让用户误以为网络出问题(开拓新的流程分支) 2.HOOK形式在iOS中HOOK技术有以下几种: Method Swizzling:利用OC的Runtime个性,动静扭转SEL(办法编号)和IMP(办法实现)的对应关系,达到OC办法调用流程扭转的目标fishhook:这是FaceBook提供的一个动静批改链接machO文件的工具,利用machO文件加载原理,通过批改懒加载和非懒加载两个表的指针达到C函数HOOK的目标Cydia Substrate:原名为Mobile Substrate,它的次要作用是针对OC办法、C函数以及函数地址进行HOOK操作,且安卓也能应用之前曾经介绍过Method Swizzling了,OC的Runtime个性让它有了“黑魔法”之称,同时也是局限性所在三者的区别如下: Method Swizzling只实用于动静的OC办法(运行时确定函数实现地址)fishhook实用于动态的C办法(编译时确定函数实现地址)Cydia Substrate是一种弱小的框架,只须要通过Logos语言(相似于正向开发)就能够进行Hook,实用于OC办法、C函数以及函数地址二、fishhook1.fishhook的应用整个fishhook就凋谢了一个构造体rebinding和两个函数 rebind_symbolshook我的项目中的所有函数名称rebind_symbols_image只hook某一个资源库的函数名称 应用fishhook的步骤: 导入头文件#import "fishhook.h" 指定替换函数——rebinding构造体对象struct rebinding nslog;nslog.name = "NSLog";nslog.replacement = fxNSlog;nslog.replaced = (void *)&sys_nslog; 调用rebind_symbols从新绑定符号struct rebinding rebs[] = {nslog};rebind_symbols(rebs, 1); 残缺代码如下: #import "fishhook.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; struct rebinding nslog; nslog.name = "NSLog"; nslog.replacement = fxNSlog; nslog.replaced = (void *)&sys_nslog; struct rebinding rebs[] = {nslog}; rebind_symbols(rebs, 1);}static void(*sys_nslog)(NSString *format, ...);void fxNSlog(NSString *format, ...) { format = [format stringByAppendingFormat:@"已hook"]; sys_nslog(format);}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSLog(@"点击屏幕");}@end 定义rebinding来指定替换的函数 ...

December 19, 2020 · 1 min · jiezi

关于ios:ios原生键盘兼容问题

呈现的兼容问题是:我写的是H5,当我在input标签的oninput事件里写入了正则表达式replace(/\s+/g, '')限度输入框不能输出空格,android手机中英文一切正常输出,然而到了ios手机上,用ios原生键盘输入中文时,明明习惯性的一次输出多个中文,然而点击对应的文字到输入框后却变成了英文,还总是失去焦点。没找到问题的起因时长期的解决办法就是一个字一个字的输出或者是切换成百度、搜狗等第三方输入法。最初比照了之前写过的在android和ios都能失常输出中英文的input框,才定位的到这个限度空格输出的oninput事件,几乎要无奈了 解决办法:去掉了写在input标签上的oninpout事件,用户提交时才应用正则表达式将空格一次性去掉。找到问题的起因后解决就不难了,只是须要留神ios的各种兼容

December 18, 2020 · 1 min · jiezi

关于ios:Audio-Kit-播放的相关源代码看看

Audio Kit 真正厉害的是,MIDI 电子乐相干, 本文简略看看 Audio Kit 播放相干的源代码 调用局部 let engine = AudioEngine() let player = AudioPlayer() override func viewDidLoad() { super.viewDidLoad() player.isLooping = true engine.output = player do { try engine.start() } catch { print("AudioKit did not start! \(error)") } } // 进行播放 func toStop(){ player.stop() } // 播放 func toPlay(){ player.stop() let url = Bundle.main.url(forResource: "x", withExtension: "mp3") var file: AVAudioFile? do { file = try AVAudioFile(forReading: url!) } catch { print(error) } guard let f = file else { return } let buffer = try! AVAudioPCMBuffer(file: f)! player.buffer = buffer player.schedule(at: nil) player.play() }播放应用 3 步:创立 engine 和 player, 指定输入 engine.output = player再开启 engine ...

December 15, 2020 · 3 min · jiezi

关于ios:iOS开发这些面试题搞懂了相信offer已到你的邮箱了

心愿真心可能帮忙到大家晋升技术!你要先自思考,看集体那些方面还有余! 具体整顿在腾讯文档能够见;答案点这里腾讯文档!1、自我介绍2、如何实现一个倒计时性能,相似于蘑菇街中的秒杀。3、怎么了解es6箭头函数中的this,它和个别函数的this指向有什么区别呢?4、一个矩形,外面一个樱桃,过樱桃做一条直线, 并且没有数据和测量工具,如果做到评分矩形呢?5、说一下同源策略6、vue中的路由时如何治理的? 你晓得他的实现形式吗?7、提到了我的博客,问我的博客相干问题。8、retina屏幕的理解9、说一说挪动端的布局。 flexible。10、晓得原理吗,怎么本人去实现一个flexible。 rem布局的实现原理。挪动端的点透是什么,有没有理解11、说一说异步编程的形式有哪些。12、我的项目中的设计是怎么回事,说说设计方面。13、你博客里的轮播图,如果还要优化,你会怎么去优化。14、你最喜爱的es6中的个性是什么,为什么。15、为什么抉择前端(不是科班,这个问题常常被问。。。)16、css布局的属性有哪些。17、有没有遇到过这样的问题: 一个有border的div,外面有一个图片,发现图片和上面的border有肯定的空隙(baseline)。18、函数调用的形式有哪些。他们的区别是什么。19、说一说原型链(这个要十分分明)。20、用过什么框架。jquery用过吗?21、你实习公司的前端leader是谁。22、给你一个我的项目,你应用jquery还是vue、react。为什么。(这个问题也是会被常常问到的)23、说一说异步编程。24、说一说回调天堂是什么,有什么问题。异样捕捉怎么做。25、说一说promise。 一个promise有多个then,如果第一个then出错,前面的还会执行吗,如何捕捉异样。 如果第一个then出错了,我还想要前面的继续执行,应该怎么做。26、你在学习js的时候,遇到过哪些js方面的坑、 你感觉js哪些常识会难一些。27、 MVC 具备什么样的劣势,各个模块之间怎么通信,比方点击 Button 后 怎么告诉 Model?28、两个有限长度链表(也就是可能有环) 判断有没有交点29、UITableView 的相干优化30、 KVO、Notification、delegate 各自的优缺点,效率还有应用场景31、如何手动告诉 KVO32、Objective-C 中的 copy 办法33、 runtime 中,SEL 和 IMP 的区别34、autoreleasepool 的应用场景和原理35、RunLoop 的实现原理和数据结构,什么时候会用到36、block 为什么会有循环援用37、应用 GCD 如何实现这个需要:A、B、C 三个工作并发,实现后执行工作 D。38、NSOperation 和 GCD 的区别39、CoreData 的应用,如何解决多线程问题40、如何设计图片缓存?41、有没有本人设计过网络控件?42、怎么判断某个 cell 是否显示在屏幕上43、过程和线程的区别44、TCP 与 UDP 区别45、TCP 流量管制46、数组和链表的区别47、UIView 生命周期48、如果页面 A 跳转到 页面 B,A 的 viewDidDisappear 办法和 B 的 viewDidAppear 办法哪个先调用?49、block 循环援用问题50、ARC 的实质51、RunLoop 的基本概念,它是怎么休眠的?52、Autoreleasepool 什么时候开释,在什么场景下应用?53、如何找到字符串中第一个不反复的字符54、哈希表如何解决抵触55、你的问题怎么样? 为什么不学习原业余?56、登录状态怎么放弃?57、为什么用本地存储,而不必session,session更加简略啊!58、http和https的区别是什么? (http、https、http2这些都是常常被问到的)59、post和get的区别是什么?60、你会的技术有哪些?61、你在学校社团是做什么的,你是做什么的?62、为什么不违心留在暑期实习的公司?63、为什么要用Alamofire而不必原生的NSURLSession,Alamofire的劣势是什么?64、如果让你来封装一个网络库,相似于Alamofire或者SDWebImage,你会如何实现?65、在网络库中,如何针对TableView疾速滚动过程中的图片额定渲染进行优化(网络库不能持有TableView)?66、iOS的零碎架构是怎么样的?罕用SDK有哪些?67、理解HTTP协定吗?GET和POST的区别是什么?68、对平安方面有何理解?如何应答web页面被劫持?理解HTTPS加密解密的过程吗69、vue和react有什么区别?70、angular用过吗?71、说一下同源策略? 说一个JSONP? (同源策略和跨域的多种形式还是要很纯熟的)72、304和200的区别是什么。 (状态码也是必须要把握的,包含各种区别)73、你所晓得的前端优化有哪些内容? (常考的问题,多多总结就好了)74、linux晓得吗? 你所晓得的linux命令有哪些?75、vue中v-if和v-show的区别是什么? (这个切实是记不住了,然而阐明了vue不好就是因为api太多)76、你看过哪些书? (比方计算机的几门专业课、JavaScript高级程序设计、css揭秘、你不晓得的JavaScript、深刻react技术栈、图解http等等)77、你会的技术包含哪些78、为什么不学习原业余,而是要转行。79、为什么抉择了北京而不是西安。80、我的项目问题。81、一个DOM树,其中有两个节点,找出这两个节点公共的父节点? (视频面试)82、说一下二叉树?83、如果反转二叉树?84、简洁、对于不同的类型,如何做出比照?85、说一下vue和react中的路由实现形式?86、说一下强缓存和协商缓存? (浏览器的缓存机制也须要很分明)87、跨域?88、说一下设计模式?89、其中的一个我的项目,你到底做了哪些优化?90、websocket聊天室如果发送失败了,你怎么解决这个问题?如何做到发送图片? 有了文字、图片等不同的数据类型之后,你如何实现数据的存储,如何设计,前端如何获取?91、websocket聊天室有输入框,那么怎么获取的,对于应用div来模拟textarea,我说应用正则去掉div,那么用户输出的也是div呢? 如果发送失败了呢? 到底应该是先发送,还是应该先存储到redux中,思考用户体验(仿照微信)。92、为什么数据库应用的是mongodb而不是mysql。93、什么是xss,如何避免xss?94、边边购我的项目说一下?登录的整个过程是什么? 购物车是怎么存储设计的? 如果LocalStorage中数据的值超过了范畴,你该如何去解决这个问题? 如果商品下架了,那么你如何显示这个商品? 登录的过程中,一个用户退出登录,另一个用户登录,那么这个购物车是否还是存在的。 说一下边边购我的项目的多个不同的模块。95、说一下你说的我的项目中遇到的问题,而后你是如何解决这个问题的? (这个能够好好筹备一下~)96、websocket的应用,底层是如何解决的。(相似于xhr的。)、97、websocket在连贯的过程中, 会有新包。。balabala 一堆听不懂的词,十分难堪,,, 我就间接说的不会。98、手写代码 判断是否是浏览器环境。99、http和https https的整个过程画一下100、httPS须要多少工夫 比http慢多少 怎么优化101、https有什么毛病102、手写疾速排序 复杂度 最慢是多少 为什么取第一个值作为两头值 如果这个值是最大的或者最小的怎么办103、http2有哪些个性 头部压缩怎么回事104、100层 1个花瓶仍 找到n层不碎 n + 1层碎了的状况 2个花瓶呢105、node理解多少 全局对象是什么106、事件机制说一下 事件绑定说一下 手写如何把div中的a放在平级其中的事件会怎么样 冒泡会到document还是window107、举荐一下身边厉害的人,你感觉你比他厉害吗。为什么108、xss怎么防备 尖括号应该怎么过滤,始终问确定吗,最初也没说分明109、用过哪些框架110、挪动端如何真机调试111、tap是怎么回事、和click的区别。。。112、cookie和session有什么区别113、说一下浏览器缓存问题114、动静布局是怎么回事115、过程和线程的区别是什么116、说一下restful api吧,117、说一说post和get的区别,118、说一下状态码吧119、你感觉什么样的代码是好的代码 (这个其实还挺考验实力的)120、说一下position的几个属性吧。121、typescript你用过吗?122、最初又聊了一下部门的状况。121、说一下你做过的几个我的项目吧。123、框架比照一下124、cookie和session有什么区别,cookie的大小是多少。125、css3理解多少,说到了渐进加强和优雅降级126、vue接触过多长时间、react接触过多长时间、127、你对互联网公司怎么看,你想要什么样的公司、将来是怎么样的。128、乐信你理解多少,你对来深圳工作怎么看。129、你还转载过美团的文章?嗯 (很多面试官还是会看博客的,谢谢博客总是好的)130、cookie和localStorage区别,如何把cookie写在一个对象中,其属性就是键值对131、实现程度竖直居中的几中办法(高度和宽度不确定)132、flex是什么133、深拷贝和浅拷贝的区别,手写深拷贝 (博客里总结过,遂让手撕)134、Oject的几中形式,如何辨别 (这个也是常考的)135、兼容性说一说,你做的PC端兼容性是到哪的136、如何对待最近react事件 (百度、wordpress弃用事件。能够多关注前端的一些动静)137、JQuery和三大框架的区别,react和vue的区别138、说一说CSS3中的动画,animation中能够取哪些值 (css3动画也很重要)139、flex布局是什么,默认的方向是什么,如何改变方向140、你的博客都是本人写的吗? 你所有所学都会写成博客吗?141、说一说原型和原型链,object是最下面的吗?142、vue中的数据双向绑定是如何实现的、143、display有哪些,答复了7 8个,还是不称心144、你的node我的项目中有几个线程,有几个过程,如果node过程解体了,如何晓得145、node中的process是什么146、node中如何创立子过程/19讲一讲你遇到的比拟艰难的事件,问了两个,最初是怎么解决的147、CSS中的单位有哪些别离说一说 (提到了ex)148、你将来的倒退布局是怎么样的149、跨域,举一个例子,安全性问题到底在哪里150、100万个数据中,找出前10大数据,最快的办法是什么,堆排序怎么写151、登录状态怎么应用cookie放弃,最好的办法是什么152、页面中一个video,可能格局不反对,那么前端如何判断并给出提醒?153、通过比拟img的onerror是一种办法, 通过服务器端也能够保留一些属性来标识哪些浏览器反对,哪些不反对154、为什么要用vue和react,而不必JQuery,给你一个我的项目,什么状况下应用单页面利用,什么状况下应用多页面利用。155、你所晓得的前端大会有哪些,比方腾讯web前端大会,CSS conf大会,js conf大会。156、你学习的前端号有哪些,比方前端早读课,那么维护者是谁。157、前端的表单中如何设置表单的形式,如multipart, www等,对于multipart具体是如何辨别其中的不同的格局的158、http2的所有个性。159、http2中的头部压缩和多路复用。160、迅雷一面比拟根底,二面会依据我的项目扩大,体验还是不错的,和面试官聊得很开心。161、post、put和get的区别什么162、localStorage和sessionstorage的区别是什么163、页面加载速度很慢,如何减速页面的渲染164、输出了一个URL之后产生了什么165、图片很大,如何进行优化166、手写二分查找167、画出TCP三次握手的过程168、websocket是如何实现服务器端推送的169、你对迅雷理解多少?170、websocket和http的区别是什么?websocket的长处是什么?171、为什么应用websocket? websocket是怎么连贯的,肯定须要通过http协定吗? 短轮询、commet、长轮训都介绍一下。各有什么优缺点。172、聊天室如何兼容IE8173、http1.1中的keep-alive是怎么了解的?174、setTimeout和setInterval175、原型、原型链、继承等。176、http1.0、http1.1、http2 (这三者还是要会辨别的,也会常常被问到)177、css3动画相干178、html、css、js别离实现一个动画成果。179、说一下你做过的几个我的项目吧。180、框架比照一下181、你在我的项目中用过 runtime 吗?举个例子。182、runtime 中,SEL 和 IMP 的区别183、 MVC 具备什么样的劣势,各个模块之间怎么通信,比方点击 Button 后 怎么告诉 Model?184、你在我的项目中用过 GCD 吗?举个例子。185、Category 的实现原理,以及 Category 为什么只能加办法不能加属性。186、有没有本人设计过网络控件187、block 的原理,block 的属性修饰词为什么用 copy,应用 block 时有哪些要留神的?188、iOS 的热更新计划有哪些?介绍一下实现原理。189、KVO、Notification、delegate 各自的优缺点,效率还有应用场景190、cookie和session有什么区别,cookie的大小是多少。191、css3理解多少,说到了渐进加强和优雅降级192、vue接触过多长时间、react接触过多长时间、193、你对互联网公司怎么看,你想要什么样的公司、将来是怎么样的。194、乐信你理解多少,你对来深圳工作怎么看。195、class A 继承 class B,class B 继承 NSObject。画出残缺的类图。196、粗疏地讲一下事件传递流程197、main()之前的过程有哪些?198、Category 中有 load 办法吗?load 办法是什么时候调用的?load 办法能继承吗?199、讲一下你对 iOS 内存治理的了解200、应用 GCD 如何实现这个需要:A、B、C 三个工作并发,实现后执行工作 D。201、你在我的项目中是怎么优化内存的?202、讲讲 RunLoop,我的项目中有用到吗?203、列表卡顿的起因可能有哪些?你平时是怎么优化的?204、我的项目有没有做过组件化?或者你是否调研过?205、讲一下 OC 的音讯机制206、ARC 都帮咱们做了什么?207、如何手动告诉 KVO208、c++ new 和 malloc 有什么区别?209、c++ 可不可以多继承?210、c++ 援用和指针的区别?211、如何判断两个链表是否有交点?212、堆区和栈区有什么区别?为什么要这么设计?213、给栈减少一个Max函数接口,返回以后栈的最大值,应该如何设计?214、给定排好序的整数数组array[]以及整数n,如何找出和为n的两个数?215、如果没排好序呢?216、一个字符串,如何找出只呈现一次并且最先呈现的字符?217、反转字符串218、判断整数是否为219、一个m*n的棋盘,有些格子不能走,如何找到左上角到右下角的最短门路?220、iOS 按下 Home 键之后会产生什么?221、c++中内存调配是怎么的?222、c++中罕用的容器有哪些?223、queue和vector有什么区别?224、vector底层是怎么实现的?225、TCP三次握手?为什么两次不行?226、我的项目中有没有服务器push机制?227、两个有限长度链表(也就是可能有环) 判断有没有交点228、实现 isEqual 和 hash 办法时要留神什么?229、block 为什么会有循环援用230、如何设计图片缓存?231、CoreData 的应用,如何解决多线程问题232、property 的罕用修饰词有哪些?weak 和 assign 的区别?weak 的实现原理是什么?233、线程平安的解决伎俩有哪些?把你想到的都说一下。234、说一下 OperationQueue 和 GCD 的区别,以及各自的劣势235、Swift 中 struct 和 class 的区别236、Swift 是如何实现多态的?237、Swift 和 OC,各自的优缺点有哪些?238、如果让你实现 NSNotificationCenter,讲一下思路240、如果让你实现 GCD 的线程池,讲一下思路241、为什么是三次握手?为什么是四次挥手?三次挥手不行吗?242、讲一下 HTTPS 密钥传输流程243、UITableView 的相干优化244、讲讲 MVC、MVVM、MVP,以及你在我的项目里具体是怎么写的?245、iOS 零碎框架里应用了哪些设计模式?至多说6个。246、你本人用过哪些设计模式?247、NSOperation 和 GCD 的区别248、Objective-C 中的 copy 办法249、 autoreleasepool 的应用场景和原理250、哪一个我的项目技术点最能体现本人的技术实力?具体讲一下。266、你在我的项目中遇到的最大的问题是什么?你是怎么解决的?267、用 Alamofire 比间接应用 URLSession,劣势是什么?268、你是如何学习 iOS 的?269、和产品经理、测试产生抵触时,你是怎么解决的?270、手写一下快排271、遍历一个树,要求不能用递归272、RunLoop 的实现原理和数据结构,什么时候会用到273、找出两个字符串的最大公共子字符串274、假如ViewController中须要用一个Blcok来扭转ViewController中的一个属性,须要怎么实现?275、这样实现之后,这个Block在内存中被存在何处?援用关系又是怎么样的?276、函数中的闭包,如果要求闭包执行完后立即扭转函数中某个变量的值,应该如何实现?277、如何实现一个相似于微信聊天界面的布局?278、如何用Auto Layout实现一个如下要求的布局: %&@$@(#!...... (说了一大堆 =。= 反正就是应用优先级就解决了)279、说一说 MVC 和 MVVM 的区别,以及各自的优缺点。280、如何将 MVC 革新成 MVVM ?在MVVM中,网络申请、缓存解决的局部应该放在哪个模块?281、为什么说Swift是面向协定的语言?应用 Protocol 有什么益处282、比拟一下 Swift 和 Objective-C 在语言层面上的安全性?283、如果ViewController中应用闭包时,用weak防止循环援用,会有什么问题?284、当点击一个View时,产生了什么?如何扩充点击区域?285、如何对TableView进行优化?286、能讲一讲你对光栅化的了解吗?287、对Swift和OC有什么认识?288、能对Swif中的可选类型谈下你的了解吗?289、说一下快排的伪代码和工夫复杂度?290、怎么判断两个链表是否相交?291、怎么反转二叉树?292、理解元组吗?293、理解多线程吗?294、什么是并行?295、当初有ABC三个工作,如何实现AB实现后再执行C?296、对 Runtime 有什么理解?297、HTTP 和 HTTPS 有什么区别?298、晓得 HTTPS 通信过程吗?299、Struct 和 Class 有什么区别?300、为什么要设计Cache?Cache分级有什么益处?301、如何保障多核数据的一致性? ...

December 15, 2020 · 2 min · jiezi

关于ios:iOS-动画全面总结

动画 - UIKit动画原理视觉残留效应静止含糊做动画的时候要达到 60FPS 时候,画面能力晦涩,不然用户会感觉界面卡顿。 UIView 提供的动画反对UIView 动画实质上对 Core Animation 的封装,提供一个简洁好用的动画接口,在要求不简单的状况下,齐全能够实现很多动画。UIView 动画能够设置的动画属性有: frame / bounds 大小变动center 核心地位transform 旋转平移等alpha 透明度backgroundColor 背景色彩contentStretch 拉伸内容Autolayout环境下的动画要间接批改constraint,留神 setNeedsUpdateConstraints,layoutIfNeeded的用法UIView 类办法动画动画的开始和完结办法UIView Block动画Spring 动画Keyframes 动画转场动画 单个视图的过渡从旧视图到新视图的过渡1. 动画的开始和完结办法根本语句: 动画开始完结标记UIView.beginAnimations(String?, context: UnsafeMutablePointer<Void>)第一个参数是动画标识,第二个参数是附加参数,在设置了代理的状况下,此参数将发送setAnimationWillStartSelector 和 setAnimationDidStopSelector 所指定的办法,个别设为 nil。 UIView.commitAnimations() 动画完结 动画参数设置办法 UIView.setAnimationDelay(NSTimeInterval) 设置动画的延时UIView.setAnimationDuration(NSTimeInterval) 设置动画持续时间UIView.setAnimationDelegate(AnyObject?) 设置动画代理UIView.setAnimationWillStartSelector(Selector) 设置动画行将开始时代理执行的SELUIView.setAnimationDidStopSelector(Selector) 设置动画完结时代理对象执行的SELUIView.setAnimationRepeatCount(Float) 设置动画的反复次数UIView.setAnimationCurve(UIViewAnimationCurve) 设置动画的曲线UIView.setAnimationRepeatAutoreverses(Bool) 设置动画是否继续执行相同的动画UIView.setAnimationsEnabled(Bool) 是否禁用动画成果(对象属性仍然会被扭转,只是没有动画成果)UIView.setAnimationBeginsFromCurrentState(Bool) 设置是否从以后状态开始播放动画 假如上一个动画正在播放,且尚未播放结束,咱们将要进行一个新的动画:当为true时:动画将从上一个动画所在的状态开始播放当为false时:动画将从上一个动画所指定的最终状态开始播放(此时上一个动画马上完结)以下是简略的例子: 2. UIView Block 动画1)最简略的 Block 动画 蕴含工夫和动画 UIView.animateWithDuration(NSTimeInterval) { // 动画持续时间 <#code#>//执行动画 }2)带有动画实现回调的 Block 动画 ...

December 12, 2020 · 4 min · jiezi

关于ios:iOS链式语法数据绑定轻量级框架实践

一、需要背景1、现状以后组件化开发中,常常会用到MVVM设计模式,它促成了UI代码与业务逻辑的拆散,肯定水平解决viewController臃肿问题,但也使得数据绑定变得复杂,很多状况下须要咱们手动绑定数据和刷新界面,常常要写一堆零散的数据绑定业务代码。 对于数据绑定的复杂度问题,咱们齐全能够应用ReactiveCocoa框架(一个典型的函数响应式编程框架)解决,这里不做深刻理解,它尽管很好很弱小,但对于组件化开发来说还是供过于求,目前咱们仅仅须要一个轻量级的数据绑定框架。 2、指标本人保护一个轻量级的数据绑定开源框架,例如CRDataBind(Chain Response Data Bind),它的接口调用反对链式语法,并通过响应式编程疾速实现数据绑定更新。 (本计划次要以老虎机抽奖demo对其进行实际和剖析,所用数据绑定框架原出自:github.com/shidavid/DV…,非常感谢作者的奉献!) 二、解决方案及亮点1、计划概述应用链式编程,反对多项绑定,反对单向/双向数据流;反对过滤,某些条件下不更新绑定的数据;反对数值与字符串主动转换,以及自定义数据接管格局;只有反对KVC的对象都能实现数据绑定,不限定只能View和ViewModel;无需依赖第三方,无需手动解绑,当指标对象内存开释时,CRDataBind主动解绑和开释。2、问题难点1)、如何通过链式语法一次绑定多个对象? 2)、如何通过响应式编程实现数据绑定? 3)、如何实现主动解绑? 3、剖析过程1)、链式语法在Objective-C中,咱们调用办法个别应用“[]”,简略的调用看起来过得去。但如果叠加很多层调用后,便不易浏览,常有漏掉某个“]”或“[”报错状况。 链式语法的外围是点语法。为了让OC在进行多层办法调用时,可能优雅和清晰的展现代码,咱们能够借鉴Swift、Masonary等的点语法模式。 示例: // Swift:获取文件门路 let path: String = Bundle.main.path(forResource: "image", ofType: "jpg")! // Objective-C:Masonary布局更新 [self.growingButton mas_updateConstraints:^(MASConstraintMaker *make) { make.center.equalTo(self); make.width.equalTo(@(self.buttonSize.width)).priorityLow(); make.height.equalTo(@(self.buttonSize.height)).priorityLow(); make.width.lessThanOrEqualTo(self); make.height.lessThanOrEqualTo(self); }]; 点语法的要害是block,可借鉴Swift闭包的应用。它的非凡在于其自身能够帮忙办法进行参数传递,并返回数据,这样咱们便能够让办法一直返回实例自身,持续调用实例办法。 示例: /**绑定3 model.winCode <---> winCodeLb.text <---> winCodeTF.text 减少fiter过滤中奖号大于3位数的响应 */ CRDataBind ._inout(self.lotteryVM.currentLottery, @"winCode") ._out(self.winCodeLb, @"text") ._inout_ui(self.winCodeTF, @"text", UIControlEventEditingChanged) ._filter(^BOOL(NSString *text) { // 减少过滤:中奖号码不超过3位数,界面上无奈配置大于3位数 return text.length <= 3; }); 2)、响应式编程实现数据绑定响应式编程是一种面向数据流和变动流传的编程范式,数据的输入输出(in&out)是要害,绑定-响应-刷新。数据inout的模式有:一般对象如target.property = value;UI对象如textField.text响应EditingChanged等等。 ...

December 8, 2020 · 2 min · jiezi

关于ios:Swift基础语法简化版

举荐一个学习网站:https://www.cnswift.org 该网站是对Swift官网文档的翻译,但不是无脑翻译,而是联合作者的开发教训,在翻译的根底上,给出一些实用的倡议。常量与变量 在Swift中规定,定义一个标识符的时候必须明确阐明该标识符是常量还是变量: 应用let来定义常量,定义之后不可批改; 应用var来定义变量,定义之后能够批改。 let a: Int = 2a = 3//会报错,因为a是常量,不能够批改var b: Int = 6b = 8//失常运行,b是变量,能够批改 根本数据类型 Swift中的根本数据类型包含:整型、浮点型、Bool型 整型 有符号整型 Int8:有符号8位整型 Int16:有符号16位整型 Int32:有符号32位整型 Int64:有符号64位整型 Int:默认,和平台相干,相当于OC中的NSInteger 无符号整型 UInt8:无符号8位整型 UInt16:无符号16位整型 UInt32:无符号32位整型 UInt64:无符号64位整型 UInt:默认,和平台相干,相当于OC中的NSUInteger 浮点型 Float:32位浮点型 Double:64位浮点型(默认) Bool型 true:真 false:假 根本数据类型的运算与OC是一样的: a+b//加a-b//减a*b//乘a/b//除a%b//取余 a+b//加a-b//减a*b//乘a/b//除a%b//取余然而须要留神的是,在Swift中,不同类型的数据是不能够运算的,比方整型和浮点型就不能够一块进行运算: 如果想要运算,那么就要将其中一种类型转为另一种类型: var c = 1var d = 1.1Double(c)+d Swift中的类型推导 Swift是一种强类型语言,也就是说,在Swift中,任何一个变量或者常量都必须有明确的类型。 var d: Int = 8 如果在定义一个标识符的时候有间接进行赋值,那么标识符前面 的类型能够省略: var d = 8 因为Swift有类型推导,会主动依据前面的赋值来决定后面的标识符的数据类型。 咱们能够通过option+鼠标左键来查看变量的数据类型: ...

December 8, 2020 · 6 min · jiezi

关于ios:iOS底层技术面试题分享不定期更新

大厂面试题视频详解iOS面试题大全(上)iOS面试题大全(下)SwiftSwift性能优化剖析Swift 中类型别名的用处Swift开发之泛型实例Swift实现代码 iOS架构模式之MVPSwift WKWebView与JS的交互应用Swift进阶之路——单例模式、属性传值、代理传值、闭包传值Swift、OC别离实现用" | "隔开数组且只显示一行的小性能iOS逆向iOS逆向学习(arm64汇编入门)iOS逆向 dyld流程利用防护代码注入视频详解iOS逆向防护解体原理探索与拦挡继续更新,请多多关注整顿不易,如果您感觉还不错,麻烦在文末 “点个赞” 或者 评论 “Mark”,谢谢您的反对查看原文

December 7, 2020 · 1 min · jiezi

关于ios:转Swift-中的指针使用

原文作者:王巍 (onevcat)原文链接: https://onevcat.com/2015/01/s...Apple 冀望在 Swift 中指针可能尽量减少退场几率,因而在 Swift 中指针被映射为了一个泛型类型,并且还比拟形象。这在肯定水平上造成了在 Swift 中指针应用的艰难,特地是对那些并不相熟指针,也没有多少指针操作教训的开发者 (包含我本人也是) 来说,在 Swift 中应用指针的确是一个挑战。在这篇文章里,我心愿能从最根本的应用开始,总结一下在 Swift 中应用指针的一些常见形式和场景。这篇文章假设你至多晓得指针是什么,如果对指针自身的概念不太分明的话,能够先看看这篇五分钟 C 指针教程 (或者它的中文版本),应该会很有帮忙。初步在 Swift 中,指针都应用一个非凡的类型来示意,那就是 UnsafePointer<T>。遵循了 Cocoa 的一贯不可变准则,UnsafePointer<T> 也是不可变的。当然对应地,它还有一个可变变体,UnsafeMutablePointer<T>。绝大部分工夫里,C 中的指针都会被以这两种类型引入到 Swift 中:C 中 const 润饰的指针对应 UnsafePointer (最常见的应该就是 C 字符串的 const char * 了),而其余可变的指针则对应 UnsafeMutablePointer。除此之外,Swift 中存在示意一组间断数据指针的 UnsafeBufferPointer<T>,示意非残缺构造的不通明指针 COpaquePointer 等等。另外你可能曾经留神到了,可能确定指向内容的指针类型都是泛型的 struct,咱们能够通过这个泛型来对指针指向的类型进行束缚以提供肯定安全性。 对于一个 UnsafePointer<T> 类型,咱们能够通过 pointee 属性对其进行取值,如果这个指针是可变的 UnsafeMutablePointer<T> 类型,咱们还能够通过 pointee 对它进行赋值。比方咱们想要写一个利用指针间接操作内存的计数器的话,能够这么做: func incrementor(ptr: UnsafeMutablePointer<Int>) { ptr.pointee += 1}var a = 10incrementor(&a)a // 11这里和 C 的指针应用相似,咱们通过在变量名后面加上 & 符号就能够将指向这个变量的指针传递到承受指针作为参数的办法中去。在下面的 incrementor 中咱们通过间接操作 pointee 属性扭转了指针指向的内容。 与这种做法相似的是应用 Swift 的 inout 关键字。咱们在将变量传入 inout 参数的函数时,同样也应用 & 符号示意地址。不过区别是在函数体外部咱们不须要解决指针类型,而是能够对参数间接进行操作。 func incrementor1(inout num: Int) { num += 1}var b = 10incrementor1(&b)b // 11尽管 & 在参数传递时示意的意义和 C 中一样,是某个“变量的地址”,然而在 Swift 中咱们没有方法间接通过这个符号获取一个 UnsafePointer 的实例。须要留神这一点和 C 有所不同: ...

December 7, 2020 · 2 min · jiezi

关于ios:2020腾讯iOS-面试题与流程整理含答案

作为开发者,有一个学习的气氛跟一个交换圈子特地重要,这是一个 我的iOS交换群:761407670,不论你是小白还是大牛欢送入驻 ,分享BAT,阿里面试题、面试教训,探讨技术, 大家一起交流学习成长!第一面,视频面试两个人别离面试,问的根底的比拟多,因为还波及到音视频的开发,所以音视频方面的知识点也问了一些常见的属性修饰符有哪些,应用copy应该留神些什么深拷贝和浅拷贝区别atomic 真的平安么,加的锁是哪种锁iOS中内存治理是怎么样的主动开释池原理,实质常见的内存透露有哪些block 呈现循环援用的起因线程和runloop之间的关系是怎么样的GCD 中串行并行队列,同步异步的区别有遇到过死锁么,怎么产生的runtime查找办法的过程runtime 是怎么实现weak置nil的关联对象是线程平安的么isKindOf 和 isMemberOf 区别ios Class构造load 和 initialize 区别说一下kvo实现的原理,应用kvo须要留神什么,手动触发应该怎么做有多个分类实现同一个办法,最初会执行哪个iOS 产生卡顿的起因,什么是离屏渲染沙盒文件目录说一下从点击屏幕开始到某个按钮触发中响应链传递机制,如果要更改响应范畴怎么做罕用的锁有哪些,性能怎么样xcode从开始编译到app呈现第一个界面中之间进行了哪些工作(分成xcode编译胜利和app启动讲的)音视频开发的简略流程PCM 数据格式是怎么样形成的常见的音频压缩形式,优缺点算法题:链表的反转有什么要问的么 第二面,视频面试我的项目中哪个性能最能体现本人的技术实力?具体讲一下对mvvm,mvc的了解,我的项目中怎么体现的有用过多线程技术么,在我的项目中怎么做的iOS 单元测试简略流程查找算法的实现对hash算法理解么,iOS中哪些地方用到了hash算法,hash抵触怎么解决有什么要问的么 第三面,电话面试我的项目中哪个性能最能体现本人的技术实力?具体讲一下常见的解体有哪些,遇到解体问题怎么查找解决,遇到无符号化的解体怎么解决数据库读写平安,表构造发生变化,怎么正当更新数据库缓存设计模式有哪些,在我的项目中怎么体现的app性能优化(别离从cpu和gpu优化去讲的)除了oc,有学习别的语言么,个别是怎么学习的为什么到职,到职起因说一下 第四面,视频面试,是穿插面试,别的部门的面试官来面的为什么到职,为什么不思考转岗我的项目中哪个性能最能体现本人的技术实力?具体讲一下选一个性能实现,讲一下实现思路和计划,遇到问题是怎么解决的为什么做iOS, 有看过iOS相干的书籍么讲一下https 数据发送过程看过iOS相干的源码实现么,realizeClass做了哪些, class_rw_t和class_ro_t 区别手画一下mvvm结构图,讲一下你的了解不必长期变量替换两个int类型数(加减法,但要留神边界值溢出问题,有符号 -231~231-1,无符号 0~2^32-1)设计一个缓存机制须要留神哪些点(lru算法,线程读写平安)写一下lru算法(双向链表+hash)有什么要问的么 第五面,电话面试,面试委员会面波及的知识点是更为宽泛我的项目中哪个性能最能体现本人的技术实力?具体讲一下http1.1和2.0有什么区别,Keep-Alive模式tcp长连贯和短连贯的区别mvvm,mvp,mvc的区别面向对象设计的六大设计准则是什么红黑树有理解么如何用两个栈实现队列性能常见的锁有哪些,实现奇偶数穿插打印 第六面,hr面试未完,待续。。。 针对以上面试技术点,我在这里也做一些材料,心愿能更好的帮忙到大家。须要的小伙伴,点这里能够看到全部内容。

December 4, 2020 · 1 min · jiezi

关于ios:本博客精品文章汇总持续更新

@[toc] 前言“订阅”一次 ,享受一生服务的高兴 订阅任意专栏,享有全副专栏 I、 iOS进阶iOS进阶:【封装富文本API,采纳block实现链式编程】(block 的妙用:联合block和办法的长处实现iOS的链式编程)iOS进阶【 只旋转本人想要旋转的屏幕(内含demo源码),利用场景:电子签名】 关键步骤:1、viewWillAppear设置横屏2、viewWillDisappear 进行设置竖屏iOS NotificationServiceExtension实现VoiceBroadcast【app处于后盾/被杀死的状态仍可进行语言播报】iOS12.1以上在后盾或者被杀死无奈语音播报的解决方案iOS计算器: 表达式的精准计算(计算字符串数学表达式)MathStringExpression【iOS APP 内的国际化切换】1、字符串的本地化、2、自定义解析本地化字符串的工具类LanguageManager、3、例子:登录界面切换中英文。过程间的实时通信计划: local socket(解决扩大和容器利用的实时通信问题iOS本地化字符串指定参数程序(利用场景:app内的多语言切换)iOS app侧对申请参数进行签名:【申请参数依照ASCII码从小到大排序、拼接、加密】(递归的形式进行实现)iOS图片压缩compress【解决压缩之后图片含糊的问题】iOS14适配【 读取用户剪切板数据会弹出提醒】1、 查找哪些SDK应用了剪切板,及时降级SDK2、先判断剪切板内容的各式,如果合乎规定才读取剪切板II、iOS平安与逆向2.1 iOS逆向iOS利用逆向工程指南:【1、概念2、工具3、逆向实践】 iOS逆向工程,指通过剖析零碎的性能、构造、行为,将软件的技术实现或者设计细节推导进去的过程。iOS逆向:【ASO我的项目应用的技术】(例如:1、hook CFUserNotificationCreat 截取Header 局部信息、Message内容 进行工作解决2、设施信息的批改、清理数据)iOS逆向 :【Cycript Useful Command & Powerful private methods】_ivarDescription_shortMethodDescriptionnextResponder_autolayoutTracerecursiveDescription_methodDescriptioniOS 逆向【how_to_host_cydia_repo】 批量部署Tweak插件到iOS设施的计划[iOS应用代码触发button的点击事件:【 [btn sendActionsForControlEvents:UIControlEventTouchUpInside];】及教你找到按钮action](https://kunnan.blog.csdn.net/...2.2 iOS平安1、iOS网络申请平安优化:SSL证书验证, 让Charles再也无奈抓你的申请数据;对申请参数进行签名;2、不走全局proxy的计划;3、容许不验证SSL证书;4、拦挡申请;5、DoH &DoTiOS逆向:【代码混同】1、基于编译器混同动态库(StaticLib)2、字符串加密:应用clang-c接口将源代码转换成形象语法树,并对形象语法树进行遍历和剖析,剖析代码中的字符串,并进行加密解决。III、 java基于JSP的学术交流论坛零碎的设计与实现IV 、iOS根底Basic debugging using logging for iOS appsiOS14适配汇总:【1、隐衷权限相干:定位、相册、IDFA 2、KVC相干:不容许拜访 UIPageControl的pageImage3、UIView相干适配:UITableViewCell兼容4、网络相干】iOS14 开启 encrypted DNS 进步安全性,避免DNS 劫持V、浏览与写作技术博客写作心得see also

December 2, 2020 · 1 min · jiezi

关于ios:新浪微博剖析-iOS-高级面试笔记一UI视图相关面试问题

作为开发者,有一个学习的气氛跟一个交换圈子特地重要,这是一个 我的iOS交换群:761407670,不论你是小白还是大牛欢送入驻 ,分享BAT,阿里面试题、面试教训,探讨技术, 大家一起交流学习成长!UITableView相干一、重用机制1、iOS如何实现cell的重用机制? A1-A7应用雷同的identifer,当tableView向上滑动,A1划出页面后,就被放入了重用池。当A7行将展现时,首先会在重用池中查看时候有雷同identifer的cell能够被重用,如果有则间接取出应用,若无则创立一个新的cell。面试笔记小编这里有筹备一些面试进阶材料,最新面试大厂常问面试答案一份。心愿真心可能帮忙到大家晋升技术!2、如何手动实现重用机制?ViewReusePool类的申明 ViewReusePool类的实现 dequeueReusableView函数实现 addUsingView:函数实现 reset函数实现 ViewReusePool类的应用 二、数据源同步问题当数据源在主线程中有删除操作,同时在子线程上又有加载更多数据的操作时,就会呈现数据源同步问题。 1、数据源同步解决方案a、并发拜访、数据拷贝子线程返回主线程的数据中,依然蕴含删除的这一条数据。 在主线程进行删除操作时,将操作记录下来。之后在子线程同步数据时,同步删除操作。 b、串行拜访将子线程的数据同步和主线程的删除操作全副放入一个串行队列中执行。删除动作可能会有延时。 事件传递&视图相应一、UIView和CALayer1、UIView和CALayer的关系和区别?a、关系 UIView对象中的layer指向一个CALayer变量UIView对象中的backgroundColor属性,是对CALayer同名属性的封装。UIView展现局部是由CALayer中的contents来决定。contents对应的backing store其实是一个bitmap的位图。b、区别UIView为其提供内容,以及负责解决触摸等事件,参加响应链。CALayer负责显示内容contents。2、为什么UIView负责触摸事件,CALayer负责显示?设计模式,繁多职责准则。二、事件传递与视图响应链1、当点击View C2区域,零碎是如何找到响应视图的呢? a、事件传递的流程 image 当用户点击屏幕,事件会被UIApplication承受,并传递给UIWindow。UIWindow调用hitTest函数,在hitTest内调用pointInside判断事件是否在该视图内。若为false,则返回该视图,事件传递流程完结。若为true,则可顺叙遍历该视图的子视图,并调用子视图的hitTest函数。找到最终hitTest为true的子视图,并顺次返回,事件传递流程完结。b、hitTest零碎外部实现 在以后视图子视图调用hitTest函数前,须要将以后坐标转换为子视图中的坐标。 2、如何只让方形图片的圆形区域承受事件响应? 重写视图的pointInside函数,使得点击区域在圆形范畴内返回true,否则返回false。 感激各位观看!文章系列继续更新 点赞再看,感激观看,更多请关注!

November 30, 2020 · 1 min · jiezi

关于ios:低版本-Xcode不支持高版本系统-iOS真机调试持续更新中-支持iOS-140

遇到的问题一不小心手机主动降级到到零碎iOS14.0 作为一名iOS 开发者就有点喜剧了 因为目前 Xcode 14.0 正式版还没出 / 即便Xcode12.0曾经更新因为要和团队成员放弃Xcode 版本统一 所以总会有一段时间不能用本人的手机真机调试 报错如图 解决方案下载Xcode最新零碎反对真机调试包 【Xcode 最新DeviceSupport下载链接 】点击下载最新的DeviceSupport 而后下载后点击解压调试包 把解压后的镇及调试包放在 一下目录/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 贴个图 关上任意一个文件目录 而后 command + shift + g 粘贴/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 4 挪动 真机包到DeviceSupport 下 注意事项1 改完后必须重启Xcode,就能够开始真机调试。2 如果重启Xcode仍然无奈运行则重启手机就能够了

November 29, 2020 · 1 min · jiezi

关于ios:iOS-NSDictionary-write-to-path-什么时候失效

let src = json as NSDictionarylet documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]let path = documentsURL.appendingPathComponent("one.plist")let result = src.write(to: path, atomically: false)print(result, path)生效了, 写入失败, 为什么? 当然不是代码的问题,是数据的问题数据长这样 json:{ "message" : "", "code" : 200, "state" : null, "data" : { "author" : "", "next_id" : 409, "title" : "2 金木水火土", "prev_id" : 405, "list" : [ { "string" : "识字", "type" : 0 }, { "string" : "一: 一个 一群", "type" : 1, "pronounce" : "yī" } ], "nodes" : { "wav_lengths" : [ 0, 4.0049999999999999, 8.2509999999999994 ], "node" : [ { "index" : 0, "title" : "识字" } ] }, "audio" : "http://ss-cn.aliyuncs.com/chinese_audio%2F%E9%83%A8%E7%BC%96%E7%89%88%E8%AF%AD%E6%96%87%E5%85%AD%E4%B8%89%E5%88%B6%2F%E4%B8%80%E5%B9%B4%E7%BA%A7%E4%B8%8A%E5%86%8C%2Faudio%2F%E8%AF%86%E5%AD%972.wav?OSSAccessKeyId=LTAIQ8Lif1HHVkXd&Expires=1606364958&Signature=XC%2Fm%2BLKZ30b%2FVYCsXrwCaNj6nZI%3D" }}数据是字典,但不合乎 plist 的标准 ...

November 25, 2020 · 2 min · jiezi

关于ios:Swift-AudioToolbox-开发-C-程序本地播放器

iOS 的本地播放器,应用 AVAudioPlayer 很简略, 拿音频资源文件门路,创立 AVAudioPlayer, 而后 prepareToPlay, 就能够 play 了 应用 AudioToolbox, 开发 C 程序本地播放器,套路也很简略 播放分 3 步:1, 拿到音频文件, 新建音频输入队列给定一个本地资源门路 url, 应用 AudioFileOpenURL, 获取音频文件 AudioFileID 应用 AudioQueueNewOutput, 创立音频输入队列 AudioQueueRef AudioToolbox 中, 输入就是播放, AudioQueueNewOutput 输出就是录音, AudioQueueNewInput 2,想要播放,个别调配 3 个缓冲 AudioQueueBufferRef,就能够开始了应用 AudioQueueAllocateBuffer,调配 3 个音频数据缓冲 AudioQueueBufferRef 一个缓冲用于播放,一个缓冲用于注入音频数据, 还有一个缓冲,用于筹备,避免滞后 应用 AudioQueueStart,音频队列输入, 输入就是播放 3, 输入队列回调解决中,给输入队列,注入音频文件的数据次要通过上面两个办法: 取出数据 AudioFileReadPacketData 将数据,注入给输入队列 AudioQueueEnqueueBuffer 进行播放,一步就好AudioQueueStop 重点:1, AudioToolbox 开发的 C 程序播放器,就是一个简略的构造体struct Player { // 对应音频文件 var playbackFile: AudioFileID? // 这一轮,应用音频包的起始地位, start position var packetPosition: Int64 = 0 // 这一轮应用几个音频包, length var numPacketsToRead: UInt32 = 0 // 可能用到 ASPD var packetDescs: UnsafeMutablePointer<AudioStreamPacketDescription>? // 播放完结了,没有 var isDone = false }第一个属性,很好了解,代表音频资源文件音频文件开启后,就用 AudioFileID 代表 ...

November 23, 2020 · 2 min · jiezi

关于ios:iOS-AOP-方案的对比与思考

AOP 思维AOP:Aspect Oriented Programming,译为面向切面编程,是能够通过预编译的形式和运行期动静实现,在不批改源代码的状况下,给程序动静对立增加性能的技术。 面向对象编程(OOP)适宜定义从上到下的关系,但不适用于从左到右,计算机中任何一门新技术或者新概念的呈现都是为了解决一个特定的问题的,咱们看下AOP解决了什么样的问题。 例如一个电商零碎,有很多业务模块的性能,应用OOP来实现外围业务是正当的,咱们须要实现一个日志零碎,和模块性能不同,日志零碎不属于业务代码。如果新建一个工具类,封装日志打印办法,再在原有类中进行调用,就减少了耦合性,咱们须要从业务代码中抽离日志零碎,而后独立到非业务的性能代码中,这样咱们扭转这些行为时,就不会影响现有业务代码。 当咱们应用各种技术来拦挡办法,在办法执行前后做你想做的事,例如日志打印,就是所谓的AOP。 支流的AOP 计划Method Swizzle说到iOS中AOP的计划第一个想到的应该就是 Method Swizzle 得益于Objective-C这门语言的动态性,咱们能够让程序在运行时做出一些扭转,进而调用咱们本人定义的办法。应用Runtime 替换办法的外围就是:method_exchangeImplementations, 它实际上将两个办法的实现进行替换: + (void)load{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class aClass = [self class]; SEL originalSelector = @selector(method_original:); SEL swizzledSelector = @selector(method_swizzle:); Method originalMethod = class_getInstanceMethod(aClass, originalSelector); Method swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector); BOOL didAddMethod = class_addMethod(aClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(aClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } });}作为咱们常说的黑魔法 Method Swizzle 到底危险不危险,有没有最佳实际。 ...

November 23, 2020 · 7 min · jiezi

关于ios:iOS-监听横屏竖屏-隐藏状态栏

BOOL _isFullScreen;[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotated:) name:UIDeviceOrientationDidChangeNotification object:nil];- (void)rotated:(NSNotification *)notification{ UIDevice *dv = notification.object; /* UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight */ if (dv.orientation == UIDeviceOrientationLandscapeLeft || dv.orientation == UIDeviceOrientationLandscapeRight) { NSLog(@"横屏"); _isFullScreen = true; }else if (dv.orientation == UIDeviceOrientationFaceUp || dv.orientation == UIDeviceOrientationFaceDown) { NSLog(@"face"); }else{ NSLog(@"竖屏"); _isFullScreen = NO; } [self reloadStatuestBar];}- (BOOL)prefersStatusBarHidden{ return _isFullScreen;}- (void)reloadStatuestBar { if ( [self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)] ) { // go prefersStatusBarHidden [self setNeedsStatusBarAppearanceUpdate]; } else { [[UIApplication sharedApplication] setStatusBarHidden:_isFullScreen]; }}

November 21, 2020 · 1 min · jiezi

关于ios:iOS-动态热修补-JSPatch

简介: 所谓动静热修补就是把可能导致app 解体的重大bug,提交新版本到appstore 审核速度太慢影响用户应用,这时候就能够利用 JSPatch 能够让你用 JavaScript 书写原生 iOS APP。所谓动静热修补就是把可能导致app 解体的重大bug,提交新版本到appstore 审核速度太慢影响用户应用,这时候就能够利用 JSPatch 能够让你用 JavaScript 书写原生 iOS APP。只需在我的项目引入极小的引擎,就能够应用 JavaScript 调用任何 Objective-C 的原生接口,取得脚本语言的劣势:为我的项目动静增加模块,或替换我的项目原生代码动静修复 bug。 这里就不在赘述优缺点重点看实现! (一)首先在终端 pod search JSPatch 接下来就能够本人pod进你须要引入的工程中,或者download到本地本人加到工程中搜寻后果如下 -> JSPatch (0.1.4) JSPatch bridge Objective-C and JavaScript. You can call any Objective-C class and method in JavaScript by just including a small engine. pod 'JSPatch', '~> 0.1.4' - Homepage: https://github.com/bang590/JSPatch - Source: https://github.com/bang590/JSPatch.git - Versions: 0.1.4, 0.1.3, 0.1.2, 0.1.1, 0.1, 0.0.3, 0.0.2, 0.0.1 [master repo] - 0.1.4, 0.1.3, 0.1.2, 0.1.1, 0.1, 0.0.3, 0.0.2, 0.0.1 [master-1 repo] - Subspecs: - JSPatch/Core (0.1.4) - JSPatch/Extensions (0.1.4)macxy:~ xy$ ...

November 20, 2020 · 7 min · jiezi

关于ios:自定义KVO自动释放监听多个属性

自定义的 KVO,反对多属性监听,反对主动开释。 应用零碎 KVO 监听属性@property (nonatomic, copy) NSString *msg;@property (nonatomic, strong) Person *person;1、增加观察者 [self addObserver:self forKeyPath:@"msg" options:NSKeyValueObservingOptionNew context:nil];[self addObserver:self forKeyPath:@"person.name" options:NSKeyValueObservingOptionNew context:nil];2、解决回调 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { if ([keyPath isEqualToString:@"msg"]) { NSLog(@"msg 新值 : %@", self.msg); } if ([keyPath isEqualToString:@"person.name"]) { NSLog(@"person.name 新值 : %@", self.person.name); }}3、手动移除观察者 [self removeObserver:self forKeyPath:@"msg"];[self removeObserver:self forKeyPath:@"person.name"];零碎 KVO 须要写一大堆代码,须要手动开释,须要咱们本人判断监听是哪个属性,咱们通过自定义 KVO 主动解决这些流程。 应用自定义 EasyKVO 监听属性监听 msg 属性 [self observeProperty:@"msg" changedBlock:^(id newValue, id oldValue) { NSLog(@" > msg : 旧值 %@, 新值 %@", oldValue, newValue);}];监听 person.name 属性 ...

November 19, 2020 · 2 min · jiezi

关于ios:打造一个通用可配置多句柄的数据上报-SDK

一个 App 个别会存在很多场景去上传 App 中产生的数据,比方 APM、埋点统计、开发者自定义的数据等等。所以本篇文章就讲讲如何设计一个通用的、可配置的、多句柄的数据上报 SDK。前置阐明因为这篇文章和 APM 是属于姊妹篇,所以看这篇文章的时候有些货色不晓得活着好奇的时候能够看带你打造一套 APM 监控零碎。 另外看到我在上面的代码段,有些命名格调、简写、分类、办法的命名等,我简略做个阐明。 数据上报 SDK 叫 HermesClient,咱们规定类的命名个别用 SDK 的名字缩写,当前情况下缩写为 HCT给 Category 命名,规定为 类名 + SDK 前缀缩写的小写格局 + 下划线 + 驼峰命名格局的性能形容。比方给 NSDate 减少一个获取毫秒工夫戳的分类,那么类名为 NSDate+HCT_TimeStamp给 Category 的办法命名,规定为 SDK 前缀缩写的小写格局 + 下划线 + 驼峰命名格局的性能形容。比方给 NSDate 减少一个依据以后工夫获取毫秒工夫戳的办法,那么办法名为 + (long long)HCT_currentTimestamp;一、 首先定义须要做什么咱们要做的是「一个通用可配置、多句柄的数据上报 SDK」,也就是说这个 SDK 具备这么几个性能: 具备从服务端拉取配置信息的能力,这些配置用来管制 SDK 的上报行为(需不需要默认行为?)SDK 具备多句柄个性,也就是领有多个对象,每个对象具备本人的管制行为,彼此之间的运行、操作相互隔离APM 监控作为十分非凡的能力存在,它也应用数据上报 SDK。它的能力是 App 品质监控的保障,所以针对 APM 的数据上报通道是须要非凡解决的。数据先依据配置决定要不要存,存下来之后再依据配置决定如何上报明确咱们须要做什么,接下来的步骤就是剖析设计怎么做。 二、 拉取配置信息1. 须要哪些配置信息首先明确几个准则: 因为监控数据上报作为数据上报的一个非凡 case,那么监控的配置信息也应该非凡解决。监控能力蕴含很多,比方卡顿、网络、奔溃、内存、电量、启动工夫、CPU 使用率。每个监控能力都须要一份配置信息,比方监控类型、是否仅 WI-FI 环境下上报、是否实时上报、是否须要携带 Payload 数据。(注:Payload 其实就是通过 gZip 压缩、AES-CBC 加密后的数据)多句柄,所以须要一个字段标识每份配置信息,也就是一个 namespace 的概念每个 namespace 下都有本人的配置,比方数据上传后的服务器地址、上报开关、App 降级后是否须要革除掉之前版本保留的数据、单次上传数据包的最大体积限度、数据记录的最大条数、在非 WI-FI 环境下每天上报的最大流量、数据过期天数、上报开关等针对 APM 的数据配置,还须要一个是否须要采集的开关。所以数据字段根本如下 ...

November 19, 2020 · 33 min · jiezi

关于ios:写好测试提升应用质量

置信在国内一些中小型公司,开发者很少会去写软件测试相干的代码。当然这背地有一些起因在。本文就讲讲 iOS 开发中的软件测试相干的内容。一、 测试的重要性测试很重要!测试很重要!测试很重要!重要的事件说三遍。 场景1:每次咱们写完代码后都须要编译运行,以查看应用程序的体现是否合乎预期。如果改变点、代码量小,那验证成本低一些,如果不合乎预期,则阐明咱们的代码有问,人工去排查问题破费的工夫也少一些。如果改变点很多、受影响的中央较多,咱们首先要大略猜想受影响的性能,而后去定位问题、排查问题的老本就很高。 场景2:你新接手的 SDK 某个子性能须要做一次技术重构。然而你只有在公司外部的代码托管平台上能够看到一些 Readme、接入文档、零碎设计文档、技术计划评估文档等一堆文档。可能你会看完再去入手重构。当你重构完了,找了公司某条业务线的 App 接入测试,点了几下发现产生了奔溃。???? 心想,本地测试、debug 都失常可是为什么接入后就 Crash 了。其实想想也好了解,你本地重构只是确保了你开发的那个性能运行失常,你很难确保你写的代码没有影响其余类、其余性能。如果之前的 SDK 针对每个类都有单元测试代码,那你在新性能开发结束后残缺跑一次单元测试代码就好了,保障每个 Unit Test 都通过、分支覆盖率达到约定的线,那么基本上是没问题的。 场景3:在版本迭代的时候,打算性能 A,从开发、联调、测试、上线共2周工夫。老司机做事很自信,这么简略的 UI、动画、交互,代码风骚,参考服务端的「畛域驱动」在该 feature 开发阶段落地试验了下。联调、本地测试都通过了,还剩3天工夫,本认为测试1天,bug fix 一天,最初一天提交审核。代码跟你开了个玩笑,测试完 n 个 bug(大大超出预期)。为了不影响 App 的公布上架,不得不熬夜修 bug。将所有的测试都通过测试工程师去解决,这个阶段实践上品质应该很稳固,不然该阶段发现代码异样、技术设计有破绽就来不及了,你须要协调各个团队的资源(可能接口要改变、产品侧要改变),这个阶段造成改变的老本十分大。 置信大多数开发者都遇到过上述场景的问题。其实上述这几个问题都有解,那就是“软件测试”。 二、软件测试1. 分类软件测试就是在规定的条件下对应用程序进行操作,以发现程序谬误,掂量软件品质,并对其是否能满足设计要求进行评估的过程。 正当应用软件测试技术,就能够躲避掉第一局部的3个场景下的问题。 软件测试强调开发、测试同步进行,甚至是测试后行,从需要评审阶段就先思考好软件测试计划,随后才进行技术计划评审、开发编码、单元测试、集成测试、零碎测试、回归测试、验收测试等。 软件测试从测试范畴分为:单元测试、集成测试、零碎测试、回归测试、验收测试(有些公司谈判到“冒烟测试“,这个词的准确定义不晓得,然而学软件测试课的时候依照范畴就只有上述几个分类)。工程师本人负责的是单元测试。测试工程师、QA 负责的是集成测试、零碎测试。 单元测试(Unit Testing):又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性测验的测试工作。「单元」的概念会比拟形象,它不仅仅是咱们所编写的某个办法、函数,也可能是某个类、对象等。 软件测试从开发模式分为:面向测试驱动开发 TDD (Test-driven development)、面向行为驱动开发 BDD (Behavior-driven development)。 2. TDDTDD 的思维是:先编写测试用例,再疾速开发代码,而后在测试用例的保障下,能够不便平安地进行代码重构,晋升应用程序的品质。一言以蔽之就是通过测试来推动开发的进行。正是因为这个特点,TDD 被宽泛应用于麻利开发。 也就是说 TDD 模式下,首先思考如何针对性能进行测试,而后去编写代码实现,再一直迭代,在测试用例的保障下,一直进行代码优化。 长处:指标明确、架构分层清晰。可保障开发代码不会偏离需要。每个阶段继续测试 毛病:技术计划须要先评审完结、架构须要提前搭建好。如果需要变动,则后面步骤须要从新执行,灵活性较差。 3. BDDBDD 即行为驱动开发,是麻利开发技术之一,通过自然语言定义零碎行为,以性能使用者的角度,编写需要场景,且这些行为形容能够间接造成需要文档,同时也是测试规范。 BDD 的思维是跳出繁多的函数,针对的是行为而开展的测试。BDD 关怀的是业务畛域、行为形式,而不是具体的函数、办法,通过对行为的形容来验证性能的可用性。BDD 应用 DSL (Domin Specific Language)畛域特定语言来形容测试用例,这样编写的测试用例十分易读,看起来跟文档一样易读,BDD 的代码构造是 Given->When->Then。 ...

November 19, 2020 · 15 min · jiezi

关于ios:iOS面试字节跳动最新iOS开发面试题

序言以下iOS面试题仅供参考,毕竟面试是不可控的,但懂得越多,天然机会越大! 字节一面内容:1、 自我介绍 2、 介绍一下简历中的一个我的项目 3、 面向对象的三个因素 4、 多态? 5、 Java,python,OC运行效率孰高? 6、 Property,其中copy如何? 7、 Property(nonatomatic, copy) NSMutableArray有什么问题 8、 Copy和MutableCopy的区别 9、 解释下类别,原理 10、解释下封装,重载; 11、 OC存在多重继承吗? 12、理解表视图吗,解释一下复用原理 13、阐明一下表视图的滑动卡顿的优化办法 14、viewDidLoad和viewDidAppear的调用机会(一次和屡次的区别); 15、页面间的传值形式有哪些(私有属性,私有办法和协定,block传值,告诉,extern全局变量传值,NSUserDefault简略数据存储传值); 16、告诉和delegate的区别? 17、 告诉的发送和接管是否在同一线程? 18、HTTP和HTTPS区别? 19、OC中多线程个别有几个计划? 20、理解NSURLConnection和Session吗? 21、说一下NSURLSession具体的实现原理 22、http的头部的几个码。; 23、编程题:实现一个二叉树的倒置。 字节二面内容:1、老虎吃羊问题。(博弈论,老虎要吃羊,假如所有老虎是理智的,即首先为了生存,其次为了饱腹,老虎吃了羊后会变成羊,同样会被其余老虎吃掉。当初,N只老虎和1只羊,请问N为多少时,老虎们会吃羊。动静布局问题,奇数吃,偶数不吃。) 2、青蛙跳格子,斐波拉契数列;青蛙跳格子,斐波拉契数列; 3、相熟应用什么框架? 4、如果让你本人实现SDWebImage的二级存储机制,你如果实现? 5、@autorelease{ NSString s;}和NSString s;有什么区别? 6、说一下你对autorelease的了解。 7、说一下对于http的了解? 8、http的返回状态码有理解吗? 9、为什么说http是无状态的? 10、为什么不必原生的APNS技术实现呢? 11、理解GCD吗? 12、说一下dispatch_group_t和dispatch_barrier_sync的区别吗? 13、理解NSOperation吗? 14、理解NSOperationQueue吗? 字节三面内容:1、 算法题:求只有三项元素的数组中的顺序排列,工夫复杂度要求O(n); 2、 说一下你对OC程序编译和连贯方面的了解? 3、 说一下内存治理相干的操作? 4、 说一下响应链的原理? 5、 诘问:hitTest有尝试过重写吗? 6、 http, session和cookie有理解过吗; ...

November 19, 2020 · 1 min · jiezi

关于ios:iOS-Transform坐标变化

在应用CGContext时,因为Quartz 2D与UIKit坐标不统一,所以须要对context进行再一次的变动,达到预期的成果。 1. 不同坐标原点介绍在Quartz 2D中,坐标原点在画布的左下角,而UIKit中,与屏幕坐标统一,以左上角为坐标原点。 如果以(0,0)点为原点绘制F,那么在不同的坐标系就会取得如下的后果。 2. Quartz 2D与UIKit坐标系转化2.1 UIImage绘制在iOS的UI开发中,以UIImage为例,绘制一张图片,设置image的frame为(0, 0, 320, 320),会失去上图右的画面。 如果应用如下代码读取Context的transform,能够看到这个transform并不是单位矩阵。 *CGRect frame = CGRectMake(0.0, 0.0, 720, 1280); UIGraphicsBeginImageContext(frame.size);CGContextRef context = UIGraphicsGetCurrentContext();CGAffineTransform contextTransform = CGContextGetCTM(context);;*这里的transform设置会使Quartz 2D与UIKit的坐标原点重合,也是不便了UIKit中控件的绘制,坐标系变动能够参考下图。 这也是为什么如果间接在获取到的context上调用CGContextDrawImage时会失去一个反转的图像的起因。 但如果应用UIImage的drawInRect办法,文档是这么写的:*Instance Methoddraw(in:)Draws the entire image in the specified rectangle, scaling it as necessary to fit.Declarationfunc draw(in rect: CGRect)ParametersrectThe rectangle (in the coordinate system of the graphics context) in which to draw the image.DiscussionThis method draws the entire image in the current graphics context, respecting the image’s orientation setting. In the default coordinate system, images are situated down and to the right of the origin of the specified rectangle. This method respects any transforms applied to the current graphics context, however.This method draws the image at full opacity using the CGBlendMode.normal blend mode.* ...

November 16, 2020 · 2 min · jiezi

关于ios:Core-Audio-中-Audio-File-Service-这样使用

Core Audio 中 , Audio File Service 三步走, 本地文件,转音频解决 ID通过 AudioFileOpenURL 拿音频解决 ID , 获取信息的内存大小AudioFileGetPropertyInfo 那后面两个,获取信息拿后面的音频解决 ID 和信息的内存大小 , 获取信息 AudioFileGetProperty int main (int argc, const char * argv[]) { // 先看参数的个数 if (argc < 2) { printf ("Usage: CAMetadata /full/path/to/audiofile SSn"); return -1; } // 1 // 再去取参数 NSString *audioFilePath = [[NSString stringWithUTF8String:argv[1]] stringByExpandingTildeInPath]; // 2 NSURL *audioURL = [NSURL fileURLWithPath:audioFilePath]; // 3 NSLog (@"audioURL: %@", audioURL); AudioFileID audioFile; // 4 OSStatus theErr = noErr; // 5 theErr = AudioFileOpenURL((__bridge CFURLRef)audioURL, kAudioFileReadPermission, 0, &audioFile); // 6 assert (theErr == noErr); // 7 UInt32 dictionarySize = 0; // 8 theErr = AudioFileGetPropertyInfo (audioFile, kAudioFilePropertyInfoDictionary, &dictionarySize, 0); // 9 assert (theErr == noErr); // 10 CFDictionaryRef dictionary; // 11 theErr = AudioFileGetProperty (audioFile, kAudioFilePropertyInfoDictionary, &dictionarySize, &dictionary); // 12 assert (theErr == noErr); // 13 NSLog (@"nndictionary: %@", dictionary); // 14 CFRelease (dictionary); // 15 theErr = AudioFileClose (audioFile); // 16 assert (theErr == noErr); // 17 return 0;} argv 是一个字符串的数组 ...

November 16, 2020 · 1 min · jiezi

关于ios:想学-iOS-开发高阶一点的东西从何开始

前言如果你正在学习 iOS, 或者正在从事IOS开发?<br/>还是一个一个迷茫的待待业大学生,或是公司的到一个半老员工?<br/>当初到了开发的一个阶段了,根本的货色很熟了,想着进步技术?<br/>学习难一点的货色,不知该遵循什么思路?从何开始?<br/>当初是看到哪里感兴趣就学学,感觉很乱?官网文档第一点要求,能比拟顺畅的浏览官网的文档如果你连官网的文档读起来都十分艰难,那你还谈什么进步和进阶,咱们学习 iOS 的所有权威的材料都来自 apple 开发者网站,靠逛论坛看看帖子不是前途。 如果这点没达到,那就从浏览官网文档开始吧,找一篇你比拟相熟的技术的官网文档,比方:View Programming Guide for iOS 本人浏览,翻译,外面不懂的单词,记下来,多学几遍,这些你不懂的单词,在当前你看其余时文档里还会呈现无数次的。保持几个月后,你会发现,英文的文档,看起来比中文的悦目了。为什么要找本人相熟的技术看,因为那样的话,你更容易了解和减少信念。 英语学习是个长期的过程,举荐一篇好文,具体教你如何学习和进步英语:老码农教你学英语技术指南学习官网的一些技术指南Apple dev里有各种文档 倡议从一些指南开始, 这样能比拟零碎的学习某个模块的常识。比方你要零碎的学习下AutoLayout ,那你就看看Auto Layout Guide 。 这里各种技术模块指南首页WWDC视频材料文本文档的技术文档看腻了?别怕,Apple 是 个人性化的公司,他们每年举办的 WWDC, Apple 的技术专家会针对新技术和局部技术主题进行课堂解说。 可供学习视频这里 能够找到。视频的主题太多,你只需挑你想理解的主题学习即可。官网提供的视频都是没有字幕的,那怎么办?给大家一个十分好的网站 ,它把最近几年WWDC的各个课堂演讲都整顿成文字版了:http://asciiwwdc.com/ 释怀,文字版必定也是英文的。写博客关注和珍藏一些适宜你胃口的iOS开发集体博客,并且开始写本人技术博客为什么说是适合本人胃口啊?事实中毕竟学霸还是多数,学渣是少数。 你关注的博客太高层建瓴,超出了本人的了解和能力范畴,只会让本人感觉自大。总感觉本人写的货色拿不出手。上学的时候学霸的学习办法你学不来,到了工作了,学霸的博客,你只能俯视。适合本人胃口就是,文章看起来能了解,并能转化成本人的货色。临渊羡鱼,不如退而织网。当初就开始写博客吧。 这里举荐两篇文章,和大家共勉 作为技术人员为什么要写博客:http://blog.jobbole.com/48962/ 即使没有读者,你也要写博客:http://blog.jobbole.com/38258/ 浏览源码浏览优良的iOS开源我的项目源码有时候是不是感觉本人写的代码很烂,然而又不晓得怎么改良。我感觉浏览优良的开源我的项目是个不错的抉择。iOS优良的开源我的项目不可胜数。找一个本人比拟相熟罕用的开源我的项目,本人剖析,写写博客分享。思考下开源我的项目里用到了哪些设计模式,用到了哪些API技术,如何使用到本人的理论我的项目中去。 开源我的项目编写提交本人的开源我的项目当初技术招聘开始关注你在Github上有几个开源我的项目,有多少star和Fork。这些比简历含金量高。Github上的我的项目比简历实在。你在Github上的我的项目提交代码的记录、品质,都能看失去。那么本人写开源我的项目的益处就显而易见了。技能进步本人,有能给本人未来跳槽减少砝码。 小结perl的发明人Larry Wall在其著述《Perl编程》第二版增加具备风趣象征的名言:程序员有三种美德:懈怠,浮躁和高傲...LazinessThe quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful, and document what you wrote so you don't have to answer so many questions about it. Hence, the first great virtue of a programmer, Also hence, this book.懈怠:是这样一种品质,它使得你花大力量去防止耗费过多的精力。它催促你写出节俭膂力的程序,同时他人也能利用它们。为此你会写出欠缺的文档,免得他人问你太多问题。ImpatienceThe anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to. Hence, the second great virtue of a programmer.浮躁:是这样一种愤恨——当你发现计算机懒洋洋地不给出后果。于是你写出更优良的代码,能尽快真正的解决问题。至多看上去是这样。HubrisExcessive pride, the sort of thing Zeus zaps you for. Also the quality that makes you write (and maintain) programs that other people won't want to say bad things about. Hence, the third great virtue of a programmer.高傲:极度的自信,使你有信念写出(或保护)他人挑不出故障的程序。如果你还是不晓得从何做起?看这篇文章《千万不要做一个思维上“懈怠”的“怠惰”人!》 ...

November 11, 2020 · 1 min · jiezi

关于ios:KakaJSON源码浅析一

目前github上比拟常见的Swift版本JSON解析库有: ObjectMapper 底层实现次要是通过运算符重载机制,须要手动对每一个属性写映射关系,比拟繁琐。 struct Temperature: Mappable { var celsius: Double? var fahrenheit: Double? init?(map: Map) { } mutating func mapping(map: Map) { celsius <- map["celsius"] fahrenheit <- map["fahrenheit"] }}SwiftyJSON 每次取值都须要通过下标,也比拟繁琐并且容易出错,底层实现次要是通过JSONSerialization相干api转成字典。 // Getting a string from a JSON Dictionarylet name = json["name"].stringValueHandyJSON(举荐应用) 阿里推出的库,刚开始的版本应用了反射机制Mirror类,苹果并不激励应用,有性能方面的问题,前面也弃用了,引入了reflection这个库的源码并做了改变,用来实现类属性解析的性能。 struct BasicTypes: HandyJSON { var int: Int = 2 var doubleOptional: Double? var stringImplicitlyUnwrapped: String!}let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}"if let object = BasicTypes.deserialize(from: jsonString) { // …}KakaJSON(举荐应用)前面进去的MJ开源的一个库,充分运用了Swift协定、运算符重载、指针、metadata等技术,反对多种数据格式,比较完善;倡议有工夫能够认真看看底层源码的实现,源码到处都是协定。 ...

November 11, 2020 · 2 min · jiezi

关于ios:融云的聊天页面在-iOS14-出现崩溃的解决办法

降级 Xcode12 后,模拟器都是 iOS14 了,运行本人的我的项目,到了聊天页面就解体,具体解体信息为Thread 1: "-[_UIPageControlIndicatorContentView setImage:]: unrecognized selector sent to instance。 从解体看,猜想是因为短少了某个办法导致了解体,提了个工单给融云,他们的技术支持服务还是挺到位的,很快给了回答,他们对这个问题曾经做了及时处理(其实他们曾经发了站内信和邮件,本人没留神????),更新了官网下载和 pod 上的 SDK,卸载现有 SDK,从新下载 2.10.4 以上版本 SDK 就能够了。 并且这个解体只针对应用 imkit的,应用 imlib 的用户没事儿,上面是他们在工单外面回复的具体内容: 通过 Xcode 12 打包 App,在 iOS 14 版本中我司发现 2.x 、4.0.0 、4.0.0.1 版本的 IMKit SDK 与 iOS 14 呈现了兼容问题,该问题会引起 App 解体,针对该问题进行了紧急的修复您能够在如下版本取得批改后的 SDK 版本:1、iOS IMKit SDK 版本为 4.0.0 和 4.0.0.1 的客户务必降级至 4.0.1+ 版本。2、iOS IMKit SDK 版本为 2.x 客户务必降级至 2.10.6-DEV 或者 2.10.4-Stable( 9 月 18 日公布的版本),这两个版本已针对该问题进行了修复(1)请务必于 2020 年 9 月 18 日当前从新下载获取 SDK,更新您的 App,下载地址:https://www.rongcloud.cn/down...(2)应用 Pod 集成的客户,请参考文档先清理 Pod 缓存,文档地址:https://docs.rongcloud.cn/v4/...3、基于 iOS IMLib SDK 集成的客户不受影响。 ...

November 6, 2020 · 1 min · jiezi

关于ios:uniapp-上架-AppStore

目前正在开发 须要上架AppStore 先做好记录 上架办法 指南 1、筹备开发者账号,证书,文件 手把手教你搞定ios的证书申请 iOS证书\(.p12\)和形容文件\(.mobileprovision\)申请 2、应用hbuildx发行打包ipa包,并应用transporter交付ipa包 UniApp打包ipa文件,上架iOS App Store 流程指南 3、 交付结束后进入下方网站配置app的构建版本信息并提交审核 apple

November 4, 2020 · 1 min · jiezi

关于ios:IOS下拉标签选择器

下拉标签选择器DropDownMenuView简略的下拉标签选择器,提供选中和勾销选中,单链表和双链表组合,反对代理配置图片,能够自定义配置 仓库地址:https://github.com/gu0315/Dro... 先看下成果: 效果图实现思路通过代理设置每列款式,数据原,代理数据传递给tableView,collectionView刷新数据,通过每列款式更改款式 可反对的配置项 final class DMConfiguration { `///Cell的高度,默认44varcellHeight:CGFloat=44;///内容的高度var contentViewHeight:CGFloat = 300;///是否自适应高度,默认为Falsevar isAdaptiveHeight:Bool = false///题目色彩var textColor:UIColor = UIColor.darkGray// 当有二级列表时,点击row 是否调用点击代理办法var isRefreshWhenHaveRightItem:Bool = false///题目选中色彩var highlightedTextColor:UIColor = UIColor.orange///有多少分区varnumOfMenu:Int=0;///字体大小varfontSize:CGFloat=15///题目的色彩vartitleColor:UIColor= .darkGray///是否显示分割线色彩.默认显示var isShowSeparator:Bool = true///分割线占比高度var separatorHeighPercent:CGFloat = 0.5;///分割线色彩var separatorColor:UIColor = .lightGray///指示器图标地位,默认文字右侧var indicatorAlignType:IndicatorAlignType = .IndicatorAlignCloseToTitle///背景色彩varmaskColor:UIColor=UIColor.init(white:0.4, alpha:0.2)///切换条件时是否更改menu titlevar isRemainMenuTitle:Bool = true///cell文字大小varcellTitleFont=UIFont.systemFont(ofSize:14)init() { self.defaultValue()}func defaultValue() {}` * 1* 2* 3* 4* 5* 6* 7* 8* 9* 10* 11* 12* 13* 14* 15* 16* 17* 18* 19* 20* 21* 22* 23* 24* 25* 26* 27* 28* 29* 30* 31* 32* 33* 34* 35* 36* 37* 38* 39* 40* 41* 42* 43* 44* 45* 46* 47* 48* 49* 50* 51* 52* 53* 54* 55* 56* 57* 58* 59* 60* 61* 62* 63* 64* 65* 66* 67* 68* 69* 70* 71* 72* 73} ...

October 30, 2020 · 1 min · jiezi

关于ios:如何进行-iOS-Widget-开发

简介: iOS 14 重磅推出了新性能 Widget,能够在主屏上展现一些要害信息,如日程、待办事项、设施电量等。Widget 的设计定位是什么?有哪些限度?如何进行 Widget 开发?本文基于一个小游戏——盒马小镇的 Widget 开发,分享在登录受权、数据更新、界面渲染以及审核上的实践经验。 Widget 简介Widget 是 iOS 14 重磅推出的新性能,使得用户能够在主屏幕增加小组件,疾速浏览 app 提供的重要信息。它的设计与旧版本 macOS 的 Widget 一脉相承,甚至连增加的动画也是去掉了拟物化的水波纹成果。 设计定位 用户能够通过 Widget 对主屏幕进行个性化定制,然而 iOS 14 的 Widget 跟其余零碎上的小组件有很大的区别。在 Widget 的设计上苹果也放弃了一贯的克服,定位于轻量化、仅用作要害信息的展现。比方零碎自带 Widget 中的股票、天气、电量、静止信息,他们的独特特色是更新频率高、提供的信息重要,让用户不必关上 app 就能够浏览关怀的内容。苹果也不心愿开发者将 Widget 仅仅当作 app 的一个快捷入口,这样的需要更适宜用 contextual menu 来实现。 限度 苹果基于下面的设计定位,同时也为了节俭系统资源保障续航,对 Widget 的做了一些限度: 不反对动画,仅反对动态页面展现。更新频率由零碎通过机器学习来动态分配。不反对拖拽、滚动等简单的交互,不反对 Switch 等控件。用户点击 Widget 肯定会跳转到 app。Widget 开发实际盒马小镇 Widget 设计 盒马小镇是盒马 app 内的一个小游戏,用户能够通过签到、购物、内容互动来获取盒花,用户最关怀的就是有没有盒花能够收取,或者是否有盒花能够帮摘等信息。这正好能够符合 Widget 的设计初衷,咱们冀望能借此晋升用户粘性。 要实现一个 Widget 首先要降级到 Xcode 12,而后在工程中减少一个新的 Widget Extension,Xcode 会主动生成须要的模板文件。 ...

October 30, 2020 · 2 min · jiezi

关于ios:网易云音乐-iOS-14-小组件实战手册

图片起源: https://unsplash.com/photos/a... 本文作者:闫冰前言苹果在往年的 WWDC20 上公布了小组件(WidgetKit),反对在 iOS、iPadOS 主屏幕展现动静信息和个性化内容。加上 iOS 零碎利用抽屉的退出,苹果对一贯激进主屏幕大动干戈,导致用户也对小组件十分期待。但小组件的运行限度很多,如何在无限的机制上怎么做好用户体验就成为须要实现的挑战。 小组件简述小组件能够在主屏幕上实现内容展现和性能跳转。零碎会向小组件获取工夫线,依据以后工夫对工夫线上的数据进行展现。点击正在展现的视觉元素能够跳转到APP内,实现对应的性能。云音乐的小组件成果如下: 开发思路浅谈首先须要明确的是小组件是一个独立于 App 环境(即 App Extension),小组件的生命周期/存储空间/运行过程都和 App 不同。所以咱们须要引入这个环境下的一些基础设施,比方网络通信框架,图片缓存框架,数据长久化框架等。小组件自身的生命周期是一个很有意思的点。直白的来讲小组件的生命周期是和桌面过程统一的,但这不意味着小组件能随时的执行代码实现业务。小组件应用 Timeline 定义好的数据来渲染视图,咱们的代码只能在刷新 Timeline (getTimeline)和创立快照(getSnapshot)时执行。一般而言,在刷新 Timeline 时获取网络数据,在创立快照时渲染适合的视图。大多数状况下都须要应用数据来驱动视图展现。这个数据能够通过网络申请取得,也能够利用 App Groups 的共享机制从 App 中获取。在刷新 Time Line 时获取到数据后,即可依照业务需要合成 Timeline。Timeline 是一个以 TimelineEntry 为元素的数组。 TimelineEntry 蕴含一个 date 的工夫对象,用以告知零碎在何时应用此对象来创立小组件的快照。也能够继承 TimelineEntry ,退出业务所须要的数据模型或其余信息。为了使小组件展现视图,须要用 SwiftUI 来实现对小组件的布局和款式搭建。在上面会介绍如何实现布局和款式。在用户点击小组件后,会关上 App,并调用 AppDelegate 的 openURL: 办法。咱们须要在 openURL: 中解决这个事件,使用户间接跳转至所需的页面或调用某个性能。最初,如果须要凋谢给用户小组件的自定义选项,则应用 Intents 框架,事后定义好数据结构,并在用户编辑小组件提供数据,零碎会依据数据来绘制界面。用户抉择的自定义数据都会在刷新 Time Line (getTimeline)和创立快照(getSnapshot)时以参数的模式提供进去,之后依据不同的自定义数据执行不同的业务逻辑即可。 App Extension如果你曾经有了 App Extension 的开发教训,能够略过这个章节。依照苹果的说法:App Extension 能够将自定义性能和内容扩大到应用程序之外,并在用户与其余应用程序或零碎交互时向用户提供。例如,您的利用能够在主屏幕上显示为小部件。也就是说小组件是一种 App Extension,小组件的开发工作,根本都在 App Extension 的环境中。App 和 App Extension有什么关系?实质上是两个独立的程序,你的主程序既不能够拜访 App Extension 的代码,也不能够拜访其存储空间,这完完全全就是两个过程、两个程序。App Extension 依赖你的 App 本体作为载体,如果将 App 卸载,那么 App Extension 也不会存在于零碎中了。而且 App Extension 的生命周期大多数都作用于特定的畛域,依据用户触发的事件由系统控制来治理。 ...

October 26, 2020 · 7 min · jiezi

关于ios:Swift语法全面解析

Swift介绍Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 利用的新语言。Swift是一种平安,疾速和互动的编程语言。Swift反对代码预览(playgrounds),这个个性能够容许程序员在不编译和运行应用程序的前提下运行 Swift 代码并实时查看后果。Swift 通过采纳古代编程模式来防止大量常见编程谬误: 变量始终在应用前初始化。查看数组索引超出范围的谬误。查看整数是否溢出。可选值确保明确解决 nil 值。内存被主动治理。错误处理容许从意外故障管制复原。根底局部常量和变量申明常量和变量, 常量和变量必须在应用前申明,应用 let 来申明常量,应用 var 来申明变量。示例: let maximumNumberOfLoginAttempts = 10 var currentLoginAttempt = 0 // 类型注解 var welcomeMessage: String正文单行正文双正斜杠(//), 多行正文(/ 多行的 /)。 Swift 的多行正文能够嵌套在其它的多行正文之中。示例: // 这是一个正文 /* 这也是一个正文, 然而是多行的 */ /* 这是第一个多行正文的结尾 /* 这是第二个被嵌套的多行正文 */ 这是第一个多行正文的结尾 */分号Swift 并不强制要求你在每条语句的结尾处应用分号(;)。同一行内写多条独立的语句必须用分号分隔。 let cat = " "; print(cat) // 输入“ ”整数、浮点数对立应用 Int 能够进步代码的可复用性,防止不同类型数字之间的转换, 并且匹配数字的类型推断。示例: let minValue = UInt8.min // minValue 为 0,是 UInt8 类型let maxValue = UInt8.max // maxValue 为 255,是 UInt8 类型类型平安和类型推断Swift 是一门类型平安的语言,这意味着 Swift 能够让你分明地晓得值的类型。如果你没有显式指定类型,Swift 会应用类型推断来抉择适合的类型。(int、double)。示例: ...

October 21, 2020 · 16 min · jiezi

关于ios:面向所有人的-UI-编程-透过点按弹窗初尝-SwiftUI

「试想你是一名美术,齐全不理解程序。而你眼前只有一位盲人程序员,你想让他帮你实现这个程序,你会怎么通知你的程序员你想要的成果?」 本文! 本文是 SwiftUI 开发教程中的一篇,咱们将一起探索上述问题的答案。若你有趣味学习 iOS 利用程序开发,又或者是想理解 iOS 程序是如何运行的,欢送关注这一系列文章。我会频繁更新对于 iOS 程序开发的各种知识点和技巧。 什么是点按弹窗?在更新 iOS 13 或者 iPadOS 13 后,你会发现长按许多软件图标都会呈现如下弹窗,比方设置内的快捷选项容许你疾速更改电池设置等等。点按弹窗的体验并没有止步于此,应用过新零碎一段时间后,你会发现这个点按弹窗渗透到了零碎利用的方方面面。事实上,苹果在往年 WWDC 19 开发者大会中,举荐开发者将利用内弹窗安置在应用程序的方方面面,以保障 iOS 用户体验的一致性。 iOS 13 中的点按弹窗 在开始写点按弹窗之前,咱们须要简略理解什么是 SwiftUI。简略来说,任何你在手机上看到的程序界面都叫 UI,也就是交互界面。在手机利用中,软件开发者会应用不同的技术来实现界面的显示,风行的界面语言比方 Flutter,就是闲鱼利用的交互界面语言。而对于苹果的设施,比方 Apple Watch,Mac,iPhone 或是 iPad,苹果在 2019 年推出的官网 UI 编程语言则是 SwiftUI。SwiftUI 集众家之长,具备诸多优良个性,能够预感它将会呈现在诸多应用程序中。若你有趣味,我会在其它文章中详解 SwiftUI,本文只着重讲其中弹窗的写法与逻辑。 你会怎么形容一个程序?本文我将用如下图中的一个例子来展现如何设置点按弹窗。下图中程序的性能很简略:长按这句名言后,会呈现点按弹窗,你能够点击复制按钮将这句话复制到零碎剪贴板中。 试想你是一名美术,齐全不理解程序。而你眼前只有一位盲人程序员,你想让他帮你实现这个程序,你会怎么通知你的程序员你想要的成果? 兴许你会这样和他说:563513413,不论你是大牛还是小白都欢送入驻 我这个程序上有一段名人名言,中英文版,下面一行是「天助自助者」,上面是「God helps those who help themselves」我心愿它能被点按选中,选中的时候肯定留神中英文两句话要一起被选中,而且上下左右请留出边距;对了,选中后要弹出一个选项,右边是复制,左边是一个复制的图标;啊,对了对了,英语字体最好是圆体字,而且两段文字都要加粗,就是小标题加粗的那种感觉。 那么为什么我要说这些呢?因为 SwiftUI 的设计思路正是描述性编程语言,你将下面这段话略微整顿一下,就是 SiwftUI 的写法。比方上面这段文字就是我整顿好的 SwiftUI 代码: SwiftUI 的实现办法 开个玩笑,咱们还缺一步,把这段文字翻译成 SwiftUI 的写法就行了。 透过 SwiftUI 语法理解如何设置点按弹窗这个性能的全副实现代码如下,我会在下文中逐渐解说每一段代码的用处。 ...

October 21, 2020 · 1 min · jiezi

关于ios:RxSwift-封装-CoreBluetooth二-扫描

首先实现扫描性能,1: 定义扫描接口,定义接口次要是升高耦合(实现该接口能够很轻松的重构扫描模块)1:ScanBuilder 扫描构建器,形容创立扫描类须要的参数,以及返回对应的扫描器实例。2:只有一个函数 scan ,返回值为 Observableprotocol BluetoothScanable { var scanInfo: (scanPrefix: [String], services: [CBUUID]) { get } var centralManager : CBCentralManager { get } typealias Input = ( centralManager: CBCentralManager, scanInfo: (scanPrefix: [String], services: [CBUUID]) ) typealias ScanBuilder = (BluetoothScanable.Input) -> BluetoothScanable func scan(duration: Int) -> Observable<(state: ScanState, response : [ScanResponse]?)>}public class ScanResponse { var peripheral: CBPeripheral var advertisementData: [String : Any]? var rssi: NSNumber init(peripheral: CBPeripheral, advertisementData: [String : Any]? = nil, rssi: NSNumber = NSNumber.init(value: 0)) { self.peripheral = peripheral self.advertisementData = advertisementData self.rssi = rssi }}复制代码复制代码2: 扫描实现类实现 BluetoothScanable 接口, 扫描的后果通过 信号的形式回传。 ...

October 20, 2020 · 3 min · jiezi

关于ios:RxSwift-封装-CoreBluetooth一-配置

对设施的操作不外乎两种状况1: 扫描设施2: 连贯设施(连贯过程须要扫描操作)定义配置类,配置用户要连贯的设施的名称(可选),或者要扫描设施前缀(必然晓得设施的前缀以及服务和特色,这是设施出厂时确定的信息), 以及连贯和扫描时都有必要晓得设施提供的服务。应用层只须要配置这些信息即可。 import Foundationimport CoreBluetoothclass BleDeviceConfig { var connectName: String? var scanPrefix: [String] var services: [CBUUID] var timeout: Int = 8 // 连贯或扫描的超时工夫 init(_ connectName: String?, _ scanPrefix: [String], _ services: [CBUUID], _ timeout: Int = 8) { self.connectName = connectName self.scanPrefix = scanPrefix self.services = services self.timeout = timeout }} 结束语;如对RxSwift感兴趣的能够;563513413,不论你是大牛还是小白都欢送入驻。大家能够相互交流学习,探索各种疑难杂症等.......

October 19, 2020 · 1 min · jiezi

关于ios:厚积薄发Unity-Batches与glDrawElements的关系

1)Unity Batches与glDrawElements的关系2)渲染大面积草地时,如何降低消耗3)HUD随着摄像机偏移4)Unity中如何在竖屏模式的UI之上显示强制横屏的UI5)iOS能耗问题 这是第222篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) RenderingQ:Unity里用FrameDebug显示DrawCall是422个,Batches是435个,在SnapDragonProfiler里抓取进去glDrawElements数目是1449个,怎么了解这种差别? A1:可参考以下几点: 题主的数据有一点问题,DrawCall数目应该大于等于Batches。依据特定的规定,多个DrawCall能够视为一个Batch,一个Batch中蕴含多个DrawCall,节俭了一部分CPU提交数据的操作。调用glDrawElements函数进行绘制就是DrawCall的一种模式。感激Vest@UWA问答社区提供了答复 A2:这部分能够参考UWA Day 2020里张强老师的分享《Unity移动游戏我的项目优化案例剖析(上)》中的第二大节。感激范君UWA问答社区提供了答复 RenderingQ1:渲染大面积草地时,如何降低消耗? A1:有以下几点: 应用DrawMeshInstance。下面这个API是不会进行视距剔除,视锥体剔除和遮挡剔除的。上面有两种计划:a. 将草地按区域分组,用每组的中心点计算视距,根据间隔切换网格LOD或剔除。还能用向量点乘简略剔除在相机前方的草地。(留神临界问题)b. 借助CullingGroup。CullingGroup.onStateChanged事件绑定,通过事件触发调整传入DrawMeshInstanced的Matrix程序和渲染数量。(比拟难的是,DrawMeshInstanced只能指定渲染前几个Matrix) 通过cullingGroup.SetBoundingSpheres实现视锥体剔除和遮挡剔除;通过cullingGroup.SetBoundingDistances实现视距剔除和LOD;这个计划也最好进行区域分组,不然CullingGroup的事件监听占用会比拟高。中端机上4000个监听会占约2ms。 当前如果有比照两种计划的性能,我再进行补充。附:CullingGroup API的应用阐明 Unity 3D研究院之Lightmap反对GPU Instancing 如何高效应用GPU Instancing技术来进行草丛渲染 降级Unity 2018过程中,遇到的DrawMeshInstanced不失效的问题 感激题主李先生@UWA问答社区提供了答复 A2:能够应用Indirect模式的Instancing,配合ComputerShader实现视锥剔除和遮挡剔除。感激邹春毅@UWA问答社区提供了答复 Q2:手机上能用吗? A:举荐一个应用URP制作的草海成果,亲测可在Mobile端应用。Unity URP Mobile Draw Mesh Instanced Indirect Example 性能测试: can handle 10 million instances on Samsung Galaxy A70 (GPU = adreno612, not a strong GPU), 50~60fps, performance mainly affected by visible grass count on screen(draw distance = 125)can handle 10 million instances on Lenovo S5 (GPU = adreno506, a weak GPU), 30fps, performance mainly affected by visible grass count on screen(draw distance = 75)感激Vest@UWA问答社区提供了答复 ...

October 16, 2020 · 1 min · jiezi

关于ios:iOS之摄像头推流

iOS之摄像头推流性能概述摄像头推流,是指采集手机摄像头的画面以及麦克风的声音,进行编码之后再推送到直播云平台上。腾讯云 LiteAVSDK 通过 TXLivePusher 接口提供摄像头推流能力,如下是 LiteAVSDK 的简略版 Demo 中演示摄像头推流的相干操作界面: 特地阐明不绑定腾讯云SDK 不绑定腾讯云,如果要推流到非腾讯云地址,请在推流前设置 TXLivePushConfig 中的enableNearestIP为 false。但当您要推流的地址为腾讯云地址时,请务必在推流前将其设置为 YES,否则 SDK 针对腾讯云的协定优化将不能发挥作用。x86 模拟器调试因为 SDK 大量应用 iOS 零碎的音视频接口,这些接口在 Mac 上自带的 x86 仿真模拟器下往往不能工作。所以,如果条件容许,举荐您尽量应用真机调试。示例代码所属平台 GitHub 地址 要害类 iOS Github CameraPushViewController.m Android Github CameraPushImpl.java 性能对接1. 下载 SDK 开发包下载 SDK 开发包,并依照 SDK 集成指引 将 SDK 嵌入您的 App 工程中。 2. 给 SDK 配置 License 受权单击 License 申请 获取测试用的 License,您会取得两个字符串:一个字符串是 licenseURL,另一个字符串是解密 key。 在您的 App 调用 LiteAVSDK 的相干性能之前(倡议在 - [AppDelegate application:didFinishLaunchingWithOptions:] 中)进行如下设置: ...

October 15, 2020 · 1 min · jiezi

关于ios:开放下载iOS开发者必读资讯

简介: 对于开发者和程序员来说,对 WWDC 20 咱们有哪些新发现和新思考?淘系技术客户端团队将从Swift语言、metal的变动、中间件相干的-网络技术相干、隐衷适配等各个话题,来零碎输入咱们的关注点和认识。 随着iOS14 零碎的更新, iOS 零碎的隐衷爱护上了一个新的台阶,用户的隐衷失去了更加好的爱护;iOS14 零碎呈现了很多新的个性,Widget 能够让用户的桌面更加丰盛,定制型更增强;Clips 能够让用户在无需装置利用的状况下体验利用; Swift 语言进一步倒退,将进一步促成原生技术的倒退——彭玉堂(巴格)点击此处立刻下载>>《iOS开发者必读资讯》 亮点内容领先看 一、详解 WWDC 20 SwiftUI 的重大扭转及外围劣势6月23日凌晨 1 点,苹果 WWDC20 开发者大会在线上以主题演讲的形式,在 Apple Park 进行直播。23-26日,苹果公开了 100 多个面向开发者的视频,内容涵盖Swift / SwiftUI 、App Clips、Widgets、Privacy & Security 等等方面。对于开发者和程序员来说,咱们有哪些新发现和新思考?点击理解>> 详解 WWDC 20 SwiftUI 的重大扭转及外围劣势 二、iOS14 隐衷适配及局部解决方案在刚刚完结的线上 WWDC 2020 发布会上苹果向咱们展现了新的 iOS14 零碎。iOS14 的适配,很重要的一环就集中在用户隐衷和平安方面。 在 iOS13 及以前,当用户首次拜访应用程序时,会被要求凋谢大量权限,比方相册、定位、联系人,实际上该利用可能仅仅须要一个抉择图片性能,却被要求凋谢整个照片库的权限,这的确是不合理的。对于相册,在 iOS14 中引入了 “LimitedPhotos Library” 的概念,用户能够授予利用拜访其一部分的照片,对于利用来说,仅能读取到用户抉择让利用来读取的照片,让咱们看到了 Apple 对于用户隐衷的尊重。这仅仅是一部分,在iOS14 中,能够看到诸多相似的爱护用户隐衷的措施,也须要咱们降级适配。 最近在调研 iOS14的适配计划,本文次要分享一下 iOS14 上对于隐衷受权的变更和局部适配计划,欢送补充斧正。iOS14 隐衷适配及局部解决方案 ...

October 15, 2020 · 1 min · jiezi

关于ios:杂谈iOS马甲包

什么是马甲包马甲包个别是主APP的分身或者克隆,也或者说是衣着马甲的一个APP,脱掉马甲,APP将出现另一种款式,也就是常说的AB面APP。 1、主APP的分身或者克隆类型的马甲包先说第一种就是主APP的分身或者克隆,当初很公司个别有一个本人的主产品,然而也会去做一些和主APP相似的阉割版的APP,我的项目代码也基本上齐全复用,app的利用名称、副标题、icon、利用截图、包名、关键词和开发者账号都与主app不一样,其余基本一致,比方下图:为什么要这样做呢?这样做又有什么益处呢? a、躲避市场或者政策危险用于app刷量、冲榜、刷词、刷热搜、躲避账号限度、防下架应急措施、竞品竞争等,抵制主包危险。 b、抢占利用市场无限地位关键词搜寻后果占位、榜单占位、笼罩更多关键词等。 c、导量马甲包自身是能够获取新增用户的,其能够通过与主App后盾信息共享、弹窗或者推送的模式疏导用户下载主App等形式向主App导量。 d、测试大范畴改版等的成果,升高危险马甲包的益处是大范畴改版之后能够上线验证成果,一旦引发不良影响又不会造成很大的损失。如果测试成果良好,则能够对主App进行相应性能迭代。 2、AB面APP类型的马甲包这种类型的APP个别是在审核的时候,把A面出现给apple的审核人员,审核完结当前再把B面出现给用户;这种个别是为了躲避苹果严格刻薄的审核限度而呈现的一种产业;这种的利用很常见,不论是小作坊APP还是大厂的APP,基本上都会搞;比方为了躲避苹果的30% 的抽成领取,在审核的时候暗藏虚构充值入口,上线胜利当前再开发充值入口,等等; 马甲包的审核危险(Apple审核 4.3)Apple审核大体分为三局部,预审、机审和人工审核。包上传后首先进入的是预审,会被扫描API等,没问题的话才会在iTC里呈现,而后才能够提交至 Waiting。在审核后期,也就是 Waiting For Review(期待审核)阶段个别是机审。机审不通过则间接被拒,通过后会进入人工审核,即In Review(审核)阶段,这个阶段次要看的是App的元数据,例如题目、形容、截图等,以及检测App的性能应用状况,常遇到的ipv6也在此处检测。 4.3是性能或者应用程序反复呈现在App Store,包含雷同类型产品性能较统一,以及上传马甲或者分包导致的被拒回复,以下计划心愿能帮到大家解决此类问题! 发件人 Apple4. 3 Design: SpamGuideline 4.3 - Design - SpamYour app duplicates the content and functionality of apps submitted to the App Store, which is considered a form of spam.Apps that simply duplicate content or functionality create clutter, diminish the overall experience for the end user, and reduce the ability of developers to market their apps.(机器审核)发件人 Apple4. 3 Design: SpamGuideline 4.3 - Design - SpamWe found that your app provides the same feature set as other apps submitted to the App Store, which is not appropriate to theApp Store.(人工审核)解决方案只有做的是对我的项目的差别解决,个别次要是以下几点: ...

October 14, 2020 · 1 min · jiezi