关于ios:启动优化二进制重排操作篇

1. 优化前 缺页中断耗时 (第一次装置)如果有, 请先删除 -fsanitize-coverage=func,trace-pc-guard 配置. 删除app, 革除Xcode缓存 ; Xcode菜单栏 > Product > Profile (快捷键command+I) , 期待 running 实现; 呈现 Instruments 界面, 抉择System Trace ; 启动我的项目, 到第一个界面呈现后进行, 期待剖析, 搜寻Main Thread, 抉择 Virtu Memory, 查看缺页中断File Backed Page in 次数与工夫; 2. 获取启动时加载的所有函数符号删除app, 在 Xcode Build Settings > Apple Clang - Custom Compiler Flags > Other C Flags 中 增加 -fsanitize-coverage=func,trace-pc-guard , 在启动后会呈现的第一个界面中增加如下代码: #import <dlfcn.h>#import <libkern/OSAtomic.h>//原子队列static OSQueueHead symboList = OS_ATOMIC_QUEUE_INIT;//定义符号构造体typedef struct { void * pc; void * next;} SymbolNode;void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop) { static uint64_t N; // Counter for the guards. if (start == stop || *start) return; // Initialize only once. printf("[clang] INIT: %p %p\n", start, stop); for (uint32_t *x = start; x < stop; x++) *x = ++N; // Guards should start from 1.}void __sanitizer_cov_trace_pc_guard(uint32_t *guard) { //if (!*guard) return; // Duplicate the guard check. void *PC = __builtin_return_address(0); SymbolNode * node = malloc(sizeof(SymbolNode)); *node = (SymbolNode){PC,NULL}; //入队 // offsetof 用在这里是为了入队增加下一个节点找到 前一个节点next指针的地位 OSAtomicEnqueue(&symboList, node, offsetof(SymbolNode, next));}void tmpOrderFile() { NSMutableArray<NSString *> * symbolNames = [NSMutableArray array]; while (true) { //offsetof 就是针对某个构造体找到某个属性绝对这个构造体的偏移量 SymbolNode * node = OSAtomicDequeue(&symboList, offsetof(SymbolNode, next)); if (node == NULL) break; Dl_info info; dladdr(node->pc, &info); NSString * name = @(info.dli_sname); // 增加 _ BOOL isObjc = [name hasPrefix:@"+["] || [name hasPrefix:@"-["]; NSString * symbolName = isObjc ? name : [@"_" stringByAppendingString:name]; //去重 if (![symbolNames containsObject:symbolName]) { [symbolNames addObject:symbolName]; } } //干掉本人 NSString * thisFunc = [NSString stringWithFormat:@"_%s",__FUNCTION__]; if ([symbolNames containsObject:thisFunc]) { [symbolNames removeObject:thisFunc]; } //取反 NSMutableArray * symbolAry = [NSMutableArray arrayWithArray:[[symbolNames reverseObjectEnumerator] allObjects]]; NSLog(@"[clang] %@",symbolAry); //将后果写入到文件 NSString * funcString = [symbolAry componentsJoinedByString:@"\n"]; NSString * filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"lb.order"]; NSData * fileContents = [funcString dataUsingEncoding:NSUTF8StringEncoding]; BOOL result = [[NSFileManager defaultManager] createFileAtPath:filePath contents:fileContents attributes:nil]; if (result) { NSLog(@"[clang] %@",filePath); }else{ NSLog(@"[clang] 文件写入出错"); }}而后在viewDidAppear中调用tmpOrderFile(), (或者在其余事件办法里调用也能够). ...

June 23, 2021 · 2 min · jiezi

关于ios:iOS-15问题汇总该不该升级看完就知道了

苹果在WWDC 2021大会上公布了最新的iOS 15零碎,新增并优化了许多服务和性能。置信很多果粉曾经急不可待地想要体验iOS 15测试版了。然而iOS 15目前只公布了第一个开发者测试版,必然会存在一些谬误和问题。 iOS 15测试版在应用过程中都会遇到哪些问题呢?接下来小编就和大家分享一下已降级的果粉反馈的iOS 15测试版问题和BUG,心愿对大家降级iOS 15测试版提供一些参考。 许多新性能界面还没有汉化,只能显示英文局部机型微信朋友圈不能公布视频音乐播放器无奈在控制中心或锁屏界面显示辅助触控性能不灵敏,无奈失常工作唤醒性能不能调高显示屏亮度Emojis在某些状况下不能正确显示无奈连贯到WiFi网络iPhone无奈通过蓝牙连贯汽车或耳机内置的天气地图有Bug,无奈失常显示美团App无奈应用相机扫一扫携程、网易云音乐App无奈关上京东App文字重叠B站视频的音量条不显示局部App更新后闪退,包含招行掌上生存、西方财产等等以上就是苹果iOS 15测试版的常见问题汇总。跟以往相比,这次 iOS 15 第一个测试版相对来说还是比较稳定的。喜爱尝鲜的能够降级试试(降级前倡议备份手机),但谋求稳固的还是应用 iOS 14 正式版零碎。

June 23, 2021 · 1 min · jiezi

关于ios:iOS支付项目实践专栏-总目录持续更新

[toc] 引言欢送大家来到#公众号:iOS逆向的《iOS领取我的项目实际》专栏 本文列出学习纲要,同时这也能够作为大家学习《iOS领取我的项目实际》这个专栏的索引。文中的蓝字都是传送门,点击进入即可本专栏以实战为线索,逐渐深刻iOS开发各个环节,把握领取APP罕用的根底性能(均含demo源码),打造残缺native客户端工作流,晋升工程化编码能力和思维能力。 适宜iOS入门同学,在开发领取类app场景将应用到的根底性能本专栏的整体纲要模块 1、界面搭建(收银台、电子签名、购物车、计算器、商品详情页、《用户协定及隐衷政策》弹框、反馈页面) 2、收付款(语音播报、参数签名) 3、OCR(自定义相机进行银行卡/身份证信息辨认) 4、封装银联接口协议、网络申请平安优化、敏感逻辑的爱护计划 5、解决用户输出内容(金额/手机号码等) 6、【封装富文本API,采纳block实现链式编程】(block 的妙用:联合block和办法的长处实现iOS的链式编程) 7、代码治理: CocoaPods 8、图片压缩:【解决压缩之后图片含糊的问题】 9、iOS测试:通过GPX文件批改经纬度信息(模仿iOS设施的地位) 10、iOS罕用动画 【 定点缩放弹窗】利用锚点anchorPoint进行实现 11、iOS Horizontal Popup View 【 横向(程度方向)弹出菜单视图】例子:商品列表反对弹出菜单进行下/上架商品、打印商品价签、编辑商品信息、同步网店等操作popover 12、Masonry进阶 :【MASConstraint的装置与移除】- 利用场景:灵便管制视图的展现与暗藏 13、iOS上传图片【反对删除和增加】(应用UICollectionViewCell、UITableViewCell 及Masonry。采纳MVVM实现。) 14、蓝牙打印:iOS 【打印价格标签的模板及打印小票的模版、 实现主动连贯最近应用的打印机】 (针对佳博GP-2120TU型号) 蕴含残缺的 demo 源码 15、【iOS APP 内的国际化切换】1、字符串的本地化、2、自定义解析本地化字符串的工具类LanguageManager、3、例子:登录界面切换中英文。 鄙人简介 xxx信息技术服务有限公司,iOS高级工程师,负责xxxnative客户端外围组件开发。善于iOS,有iOS8年开发教训,曾参加中国移动和包我的项目的开发。I 、视图1.1 《用户协定及隐衷政策》弹框iOS 自定义视图:《用户协定及隐衷政策》弹框(蕴含超链接属性)【demo源码反对中英文切换】 1、原理文章:https://blog.csdn.net/z929118967/article/details/103902362 2、性能应用:点击demo的右上架文字进行中英文切换 3、《用户协定及隐衷政策》 弹框的实现步骤: 3.1、自定义TextView,采纳富文本属性进行内容设置attributedText(包含下划线NSUnderlineStyleSingle、超链接NSLinkAttributeName 、色彩NSForegroundColorAttributeName 等信息) 3.2、实现代理办法textView:shouldInteractWithURL:inRange,解决点击超链 1.2 电子签名iOS电子签名上篇【外围原理: 旋转特定的屏幕】利用场景:采集电子签名,反对签名界面为横屏其余页面都是竖屏、革除重写、灵便管制提醒语信息、以及查看商户协定等 1、原理文章:https://kunnan.blog.csdn.net/article/details/104796781 2、性能:采集电子签名,反对签名界面为横屏其余页面都是竖屏、革除重写、灵便管制提醒语信息、以及查看商户协定 3、外围原理: 只旋转特定的屏幕 4、外围步骤:1、viewWillAppear设置横屏2、viewWillDisappear 设置竖屏 5、用法简略:采纳block回调电子签名图片 1.3 商品详情页[UICollectionView的自适应案例详解:【商品详情页】(外围原理:依照图片的原宽高比例进行显示图片全部内容,并主动适应高度)残缺demo源码](https://download.csdn.net/dow... 1、原理文章:https://kunnan.blog.csdn.net/article/details/112976838 2、利用场景:商品详情页以及须要展现大量图片的界面 3、外围原理 3.1)依照图片的原来宽高比进行缩 3.2)UICollectionView的高度自适应 ...

June 22, 2021 · 2 min · jiezi

关于ios:iOS-15-让iPhone-比以往更智能

在 iOS 15 中,新的智能性能将节俭您的工夫并使您的 iPhone 体验更加高效。就是这样。 实时文本 你有没有因为不想打字而把写在纸上的文字图片发给他人?下载 iOS 15 后,Apple 用户将能够应用名为 Live Text 的性能。 应用实时文本,能够将图像中的文字转换为文本。如果须要发送简短的音讯、将函件转换为电子邮件或将待办事项列表从白板传输到手机,所有这些都是可能的。 Live Text 最后将反对七种语言: 英语 法语 简体中文和繁体中文 德语 意大利语 西班牙语 葡萄牙语 “焦点”告诉 Apple 提供更多选项来管制烦人的 iPhone 告诉。然而,当初,通过一项名为 Focus 的性能更进一步。 苹果的焦点( Focus)性能 应用 Focus,将应用人工智能 (AI) 来确定在特定工夫内正在做什么。例如,如果通常在早上开车,Apple 可能会要求您容许在此期间敞开告诉。 应用 Focus,还能够抉择要接管来自某些人的告诉的平台。例如,如果有人在 Instagram 上发送音讯,能够抉择进行接管告诉,但仍会在 WhatsApp 上收到同一个人的音讯。 物体和场景辨认 Apple 通过 iOS 15 的智能性能在改良照片发现方面投入了大量精力。实现这一指标的一个重要形式是通过基于机器学习的图像对象辨认。此性能称为视觉查找。 应用 Visual Look Up,能够找到与之前可能须要询问的图像相干的信息。例如,特定城市的照片将成为在网络上查找相似图片以及无关该地位的相干信息的门户。 iPhone 行将变得更智能的另一种形式是它的步行方向。通过扫描您周边地区的建筑物和街道,您的手机将应用加强事实 (AR) 技术提供更精确的形式达到目的地。 如果不开车,还能够在您的当地固定公共交通站点。当靠近这些时,iPhone 会发送主动告诉让您晓得。 照片回顾 在最新版本的 iOS 中,Apple 做了更多工作,将过来经验中的照片从不同相册和回顾中分离出来。 Apple 的 Memories 更新旨在更多地捕获情绪。能够增加适宜每个回顾的情绪的歌曲。 ...

June 21, 2021 · 1 min · jiezi

关于ios:使用exchange协议和实现苹果安卓和微软的日历备忘待办的多端互通如何同步日历如何同步待办

应用古老的exchange协定和实现苹果安卓微软的数据互通,日历、备忘的多端互通。微软待办(Mircosoft todo)的高阶用法,以及一些常见的问题 目录: 前言,这个软件能做什么背景,多端同步,痛点问题该计划有余的中央劣势特地留神问答1.同步速度如何2.日历iPad下面编辑,手机和电脑能收到嘛?3.我已经应用过todo软件,有本人的微软帐号不想舍弃这些代办怎么办?4.平安吗,可以信赖吗?会不会跑路5.苹果如何设置一个exchange账户呢我找不到6.我想把我的课表捯饬到日历进来行不行?有没有快捷的方法7.我还是喜爱我手机的备忘录怎么办?8.不想用微软的outlook邮箱行不行,我有网易和qq邮箱。---火条写在前面---前言,这个软件能做什么本办法次要目标是给记不准重要事件的人,和做了打算,转手就遗记的人。实现备忘的目标。前一天设置今天打算,当日早上设置每一步步骤。每天依照打算实现,实现高效。 该办法收费的日历、备忘录的多终端协同应用,能够将iOS零碎的“日历”“揭示事项”与安卓零碎和windows零碎协同,同步速度快,稳定性好 微软待办(todo)是很好的一招待办软件,很多人没有发现美他能够和苹果的待办事项数据通用。于是应用该办法也能实现该性能。实现揭示更加无效。 Joplin 是一款开源的笔记本软件,反对markdown和网页剪映(你能够保留动态网页而后查看),反对iPad、iPhone、Windows、Android、Macos、Linux客户端,不限度厂商、品牌都可应用。数据在电脑端能够导出备份。反对第三方网盘同步(如坚果云webdav、微软onedrive)思考到我国实情,我应用的是onedrive同步笔记。实现手机、电脑记事本互通的性能。 背景,多端同步,痛点问题当初鸿蒙和miui的多端协同做的很好,可是不同厂商之间的同步如何解决呢?例如,你有一台华为一台小米,如何解决备忘录、日历等问题呢?假设,你领有多台不同品牌的安卓手机,一个Windows电脑,一台iPad,或者多台不同账号地区的iPhone。你或者苦恼,唉,数据不通啊好不容易弄得备忘录也没有方法用了。要是苹果全家桶该多好。这样就必定多了多少高兴啊!那我的工作效率肯定能晋升啊至多我用起来难受了啊。 我这边手机写上的备忘录,网络畅通的条件下,轻轻松松的能简直几秒钟内同步过来。 那目前有没有这样的软件能够实现呢? 我想能同步能够很快的同步能够少花钱或者不花钱可能有肯定的安全性不用放心服务终止和跑路与原生软件协同、实现少耗电不要下载更多的客户端。有,然而没有能满足所有须要的。 目前的软件存在着转移老本高,例如,须要额定下载客户端,而后软件内传输,软件跑路的话,数据全丢。目前可能是收费的,然而可能被前期割韭菜的问题等等。 该计划有余的中央大家的历史文件,有人说火条呀,我之前的备忘录也想转移行不行。可能须要你挨个复制了。我没有好的方法的。大家在养一个新的操作习惯。就不会有任何问题了。基于微软云盘onedrive进行同步,一般来说网络条件都是通的,即便你登不上登录网页,是不影响这个exchange服务的。然而收费用户只有5GB'的空间如iCloud一样,这就导致你须要节俭应用。不必他来传输大型图像,视频,只传输文字的话入不敷出。 劣势不花钱,一点钱都不要你花,成果不错 能够很快的同步能够少花钱或者不花钱有肯定的安全性不用放心服务终止和跑路与原生软件协同、实现少耗电不要下载更多的客户端。只须要下载Joplin、to do只须要注册或者应用你的微软账号===微软帐号(outlook)微软代办软件(to-do)Joplin 特地留神第一,设置好exchange的outlook邮箱同步后,千万不要随便删除任何文件。因为这个同步,是同步 同步是,任何一个中央有,然而我没有的,我也要有。 我已经有然而删除的货色,他人也要删除。 所以大家伙,多个设施,不要同时编辑同一个文件 会导致同步谬误。而后导致劫难。 第二,千万要留神,截止到21.6.15日。不要给joplin设置太多明码,会导致解密出错,通过测试,两端同步时设置ee2e(段对端加密)没有任何问题。三端同步会呈现很多问题。例如下面呈现小黄条提醒请输出同步明码,然而没有明码输出对话框,很难看而且无奈打消。为了三端的同步、疾速、稳固和高兴,不倡议应用加密传输。 第三,请你在应用的时候,留神你的微软云盘空间,每一个人有5GB的收费空间,如果你用它传输很多的文件满了之后,这个数据很难导出的。只能说是充值(购买office365送一1TB)或者是放弃。因而倡议只用文字局部来表达思想,不倡议应用它来同步相片视频。尽管他不限速,然而空间太小仍旧是一个限度。 第四,windows平台在邮件mail这个软件上,上应用最一般的outlook即可一般登录,就是你简略的登录你的微软outlook邮箱就能够了,不用应用exchange的那个选项,更不必应用高级advanced选项,火条曾因为这个坑了本人很久,差点就购买365了。 问答1.同步速度如何很快,应用微软账号是最快的,手机开同步的状况下,几秒内就能够。 2.日历iPad下面编辑,手机和电脑能收到嘛?当然能够的。简直刷新后就能呈现,用时在10s左右而且能够应用主动同步。 3.我已经应用过todo软件,有本人的微软帐号不想舍弃这些代办怎么办?好办,须要你登录你的微软帐号,增加一个第二登录邮箱outlook结尾的就能够了。这样原数据互通 4.平安吗,可以信赖吗?会不会跑路微软应该不会跑路的吧,谷歌关停了这个服务,我集体感觉哈,目前能和苹果对标的就是微软了,微软还是能信赖的。 5.苹果如何设置一个exchange账户呢我找不到简略,设置找到(邮件) 点进去就能够了。 6.我想把我的课表捯饬到日历进来行不行?有没有快捷的方法能够的,你能够应用现成的软件来制作,苏州大学的开发者,开发了一款叫做wakeup课程表的软件,接入了很多学校的教务零碎,能够实现这个性能。然而请留神,导入容易删除难,到时候很可能批量导入了200个日历,然而到最初可能要挨个删除。所以肯定要看清楚了,务必一次胜利。不要试错。老本太大了。 7.我还是喜爱我手机的备忘录怎么办?容易解决,你齐全能够在手机备忘录打字,而后复制到joplin实现同步性能,就当是多一个备份了。 8.不想用微软的outlook邮箱行不行,我有网易和qq邮箱。能够的,齐全能够,首先在相应的服务商外面开启服务,而后在例如网易,这时候要在微软的邮件利用中抉择advance,而后增加一个exchange,server一栏设置成i.163.com 端口是443,以后,网易163对iOS的“通讯录”同步改用CardDAV通讯录账户。相似在Android上设置Exchange。零碎设置>邮件>其余:CardDAV通讯录账户大略是这样的一个步骤。(qq邮箱的服务也差不多,服务器地址为:ex.qq.com端口443) ---火条写在前面---已经看到过一个故事大略的意思是这样的:``2040年,某年老产品经理说,有没有那么一个货色,不须要下载客户端,不须要限度品牌零碎,无论是鸿蒙、安卓苹果,Linux和Windows等等都能实现,无差别预览信息。用户也能在这里交换,如果咱们开发进去这个,咱们这个产品的前景肯定非常宽广。这时候一位40岁的老同志说,你说的这个是不是叫网页。这是半个世纪前的。``很早就有的exchange协定。大家也可能都遗记了,找办法的时候居然将他疏忽,一个大家伙可能都遗记的办法。至多火条在互联网上搜寻的很辛苦。商业化的计划例如Evernote等等,宣传的都不错。价格也挺好。不过失去了本人折腾的高兴,不行 我不称心。 反观咱们,手机打好了字,走qq或者微信发给本人,再用iPad关上。工夫上就输掉了。有时候还会被QQ限度了字数。遇到了敏感字还心里担心。安不平安啊。行不行啊。会不会封号啊。 应用文章提到的这个方法能实现Pad,安卓和电脑的日历,备忘录,通讯录的互相同步。提早小耗电低。 **如果这篇文章对你有些许帮忙请关注『缤纷火条』(微信公众号、网易云)以反对**

June 17, 2021 · 1 min · jiezi

关于ios:WDA报错

WDA要用作Test老是报错,报错内容为:The test runner encountered an error (Failed to establish communication with the test runner. (Underlying error: Unable to connect to test manager on d4917fbadf4b71db3c9b3a835f100099b0432442. (Underlying error: Could not connect to the device.))) un0Cover越狱的手机,testManager默认会被敞开,要手动启动手机端的testManager过程,每次越狱之后,ssh 登陆手机执行 /bin/launchctl load /Developer/Library/LaunchDaemons/*其实启动的是com.apple.testmanagerd过程,启动之后,执行以下命令看看testManager过程有没有启动: launchctl list |grep test

June 16, 2021 · 1 min · jiezi

关于ios:图片背景色处理技巧

图片背景色解决技巧 把图片的通明背景,批改为红色 convert /Users/jzd/Pictures/20200918--巨匠班第7节课--objc_msgSend音讯发送/20200918-巨匠班第7天-objc_msgSend材料/objc_msgSend流程剖析.png -background white -alpha remove -alpha off white.png

June 12, 2021 · 1 min · jiezi

关于ios:干货一款实用iOS云真机的技术架构是如何搭建的

目前,市场上有很多App反对iOS9、iOS10,一旦在这些低版本的机器呈现兼容性问题时,想找一台手机来debug就是一件十分难的事,而且iOS零碎的分辨率也越来越多,无论是自动化还是日常的兼容性,都须要有更全面的机型去做兼容性测试。 对挪动开发者来说,无论是开发、调试、测试、还是上线前后测验成果,都离不开测试机,甚至是产品、经营和客服,也时不时须要应用真机进行产品体验、产品经营。传统渠道上,开发者只能通过洽购设施满足各部门测试需要。然而随着业务的倒退,这种形式的缺点越来越凸显:稀缺机型热门、设施数量有余、费用高企、资源利用率不低等。 咱们在调研了业界的诸多云真机解决方案后,发现大家尤其是对iOS端反对得不好,并且免费也绝对较高。历经数个版本的迭代后,友盟+推出了搭载在U-APM利用性能监控平台上的云真机服务,为挪动开发者提供了灵便地测试操作界面,反对ADB调试、WEB近程调试、扫码、抓包、虚构定位等测试性能,并提供了测试报告供开发者后续查看。尤其是在iOS反对上做的十分粗疏和用心。 在屏幕画面方面,友盟+云真机高端机能有15帧左右的比拟晦涩的高画质屏幕传输,并且是秒开、超级省流量。 在用户体验方面,一系列快捷设置如装置ipa、键盘输入、从电脑间接粘贴内容到手机、一键web调试等急速应用 在Mac主机方面,一台i5 的mac mini能反对同时接入20台手机 云真机背地的技术架构揭秘 根本和openSTF相似,mini作为provider,provider去治理手机和解决与云端服务器之间的音讯,连贯到云端服务器,云端服务器可能反对N个provider接入,并且本身能很容易地去做扩大,而云端服务器则负责散发音讯,与做一些websocket服务的代理转发,前端则间接对接云端服务器。 云真机外围驱动 这部分基于阿里巴巴弱小的技术能力齐全自研,不基于WDA,也不基于开源产品,当初市面上很多iOS云真机都会基于WDA或者其余的开源自动化测试框架去做的,可是这些框架的设计初衷并不是做云真机,会引入了很多开发不须要的功能模块。咱们心愿云真机外围驱动局部,能尽量轻量,而且稳固。整个外围驱动局部,最次要分为屏幕捕捉、模仿管制、辅助性能接口。 屏幕捕捉 苦于苹果的限度,这一点是最难冲破,咱们也有尝试过很多计划。 例如:idevicescreenshot,帧率太低了,而且通过逆向发现iOS零碎中的ScreenShorter 不承受任何宽高、图片品质、图片格式的参数,这个办法在iPhoneX之类的高分辨率的机器,截图会更慢,只有1-2帧。 而比拟风行的iOS-minicap计划,这个计划尽管能十分十分高效地实时获取到屏幕内容,但这个计划最大的毛病就是1个mac只能提供到1台iPhone的实时屏幕流,老本切实太高,咱们也有尝试过破解Mac中CoreMediaIO。 framework的iOSScreenCapture协定 (iOS-minicap就是调用了零碎提供的iPhone录屏接口,由AVFoundation与CoreMediaIO提供的),咱们还有尝试过把整个Mac虚拟化去做隔离,让同一个物理机应用多个iOS-minicap,但这些种种计划,最终都以失败告终。 最终计划是,在XCUITest中是应用公有API去截图,这个公有API能最高能达到15帧左右,根本能满足咱们的需要了,再把每一帧编码成视频流,从而节俭流量。 能够感受一下jpg截图与视频流的流量大小比照: 以XS Max为例,每一帧都均匀在90K左右,每一帧的数据传输截图: 与图片比照,肉眼可见的等同画质下的,当编码成视频流后,一样的机型,用雷同的操作和雷同的画面去比照,视频流所需的带宽十分小。 最重要的是,视频流能节俭的不仅仅是服务器进口的流量,还能加重usbmuxd的cpu资源占用。usbmuxd 以后是单过程的,只能应用单个cpu的外围,很容易达到瓶颈,对此咱们还有一个革新就是把usbmuxd改成能充沛应用cpu的每一个外围,进步整个mac的硬件使用率,这部分,咱们当前在独自写文章介绍。 模仿管制 绝对于屏幕获取,点击事件倒是简略很多,能够参考WDA,间接应用XCUITest的公有API触发就能够。 而音讯格局则是沿用回openSTF的格局,provider收到之后间接转发给XCUITest。这里的重点是应用长连贯去与provider做数据交互,而不是HTTP,从而进步整个链路的响应速度。 开发者利用场景 谬误排查:复现用户谬误进行排查修复,测试报告涵盖谬误捕捉信息 网络抓包:对手机的网络行为进行监控测试,排查网络、平安相干等问题 页面调试:一键调试,操作体验能够与Chrome Devtools相媲美 虚构定位:反对寰球高精度虚构定位,实时模仿设施地理位置验证问题 ADB近程:连贯ADB,应用IDE或者命令行的形式进行Android近程调试 更多请点击链接,点击收费应用友盟+云真机服务 扫一扫退出友盟+技术社群

June 11, 2021 · 1 min · jiezi

关于ios:解决-CocoaPods-命令-pod-install-安装-githubcom-上的包非常缓慢或者失败

解决 CocoaPods 命令 pod install 装置 github.com 上的包十分迟缓或者失败CocoaPods 执行 pod install 会装置 github.com 上的包,但 github.com 很不稳固。一个解决方案是,应用脚本将 github.com 的资源转换为其余域的资源。 CocoaPods v1.7.2CocoaPods 从 1.7.2 版本开始应用 https://cdn.cocoapods.org/ 代替原有的 https://github.com/CocoaPods/Specs.git,这样能够按需下载须要的包定义,而不必一次性下载整个 Specs 库(整个库是 3GB 左右),参考 CocoaPods 1.7.2 — Master Repo CDN is Finalized!。 source 'https://github.com/artsy/Specs.git'- source 'https://github.com/CocoaPods/Specs.git'+ source 'https://cdn.cocoapods.org/'解决方案脚本是应用 python 写的,很简略,放在 https://github.com/senntyou/CocoaPods-Specs-Modify,如要应用,须要先克隆到本地。 git clone https://github.com/senntyou/CocoaPods-Specs-Modify.gitcd CocoaPods-Specs-Modifypython modify.pymodify.py 脚本中,默认 specsDir 取 ~/.cocoapods/repos/trunk/Specs/,targetSite 取 github.com.cnpmjs.org/,能够依据须要更改,再运行脚本 # Specs目录specsDir = os.path.expanduser('~') + '/.cocoapods/repos/trunk/Specs/'# github 域名githubSite = 'github.com/'# 替换域名targetSite = 'github.com.cnpmjs.org/'示例比方,原来的包定义是 ...

June 8, 2021 · 1 min · jiezi

关于ios:苹果ios15正式版兼容机型汇总

苹果ios15正式版公布,苹果 iOS 15都兼容哪些手机呢?这里小编为大家整顿了苹果ios15正式版兼容机型汇总,一起来看看吧! Apple 的新iOS 15操作系统兼容所有可能运行iOS 14的iPhone,包含最后的iPhone SE、iPhone 6s 和 iPhone 6s Plus。 Apple 的兼容设施列表确认iOS 15 实用于所有这些 iPhone: 所有iPhone 12机型 所有iPhone 11机型 iPhone XS iPhone XS Max iPhone XR iPhone X iPhone 8 iPhone 8 Plus iPhone 7 iPhone 7 Plus iPhone 6s iPhone 6s Plus iPhone SE(第一代) iPhone SE(第二代) iPod touch(第 7 代) 至于 iPadOS 15,它兼容多种旧设施: 所有iPad的长处 iPad(第8代) iPad(第7代) iPad(第6代) iPad(第5代) iPad mini 5 iPad mini 4 iPad Air(第 4 代) iPad Air(第三代) ...

June 8, 2021 · 1 min · jiezi

关于ios:论Apple-Store审核

论Apple Store审核审核流程总结一、预审阶段Info.plist配置文件扫描(即属性列表),iOS的APP都应用info.plist文件来贮存元信息,用来实现决定bundle所显示的ICON,以后APP反对关上的文件类型,服务申明等,就是看plist配置文件字符是否有标准和缺失;次要分类为两步骤:第一步为上传苹果时苹果Application Loador等利用对于适配的图片规格属性和视频规格属性的查看,第二步为上传后苹果的性能查看。公有API扫描,公有API和Non-public API,是苹果明令禁止的条款,会应用反编译工具,对IPA的可执行文件进行反编译解析,获取头文件中库,办法和类的汇合,再逐个比照公有库和non-public库。文件大小扫描,次要饱含ipa包的文件大小(小于2GB),可执行文件得注释段大小(解压ipa包后,要小于80MB)和包中每个文件的大小(查看每个文件得大小小于500MB)二、机器审核阶段代码块扫描:AI编译器会对每个函数生成去辨认函数名,类名,办法名,还有全局字符串援用表的扫描辨认,次要是文本类的查重排重。1)这里须要针对不同的语言,进行不同的批改能力绕过苹果的辨认库,比方函数减少一些默认参数。2)批改类名,办法名,属性名以及文件名这些。资源文件扫描:次要针对各个文件扫描进去的MD5进行比照。1)这里就要人工对各位小文件进行代码混同,对资源文件轻压缩,扭转hash值。2)资源改名,适当增加一些无用的资源。三、人工审核阶段次要APP性能检测和体验检测,例如用测试账号登陆APP体验性能是否有bug。ATT、IPV6、等各种权限相干也在此处检测。名称,副标题,利用截图,视频,ICON,利用形容等利用场景内容和性能的标准。经验教训在苹果人工审核阶段,是属于黑盒审核,除了苹果的审核指南能够有肯定的指导意义,其余的一切都是苹果审核说了算(叫爸爸)。大多数被拒都是在此阶段产生,各种各样的姿态也是层出不穷,当然网络上也有各种针对被拒起因的方法,但也有无奈检索到的参考的状况,所以在此记录一些特地的来自爸爸的教训坑不少,缓缓填一、如果和版本一起提审的有新的商品,被拒后须要去商品页查看商品状态! (上个月刚产生,好像回到了15赛季,苹果的一个审核周期长达两周 背景:该版本有ATT权限相干、有新的商品随之一起提审 提审后第一次被拒:ATT权限相干,咱们只在注册阶段收集,苹果审核人员没有体验到,打回。随后咱们立马回复了苹果,然而等了四五天始终没有再次审核的反馈,以往教训是在苹果审核后盾做了回复后个别第二天就会有论断。 骚操作:经验主义,苹果后盾BUG了!咱们撤回该版本再从新提审,应该很快就失常过审啦。以前的确这样做过,也的确很快就通过了审核 五天后...毫无反馈,经善意经营共事揭示才发现,商品列表详情页外面有个小红点,显示须要开发者解决.........! 整个苹果后盾页面没有任何无关商品出问题的提醒(咱们在期待审核期间还给苹果打了电话发了邮件询问审核迟缓的问题,后果回答都是失常流程,等着就行..),必须点进商品列表详情页,能力看到无关提醒,几乎了.... 商品自身也没有问题,就是版本被拒后,商品给一起打回了,所以我把商品的名字和形容别离叫了个句号再保留,红点报错隐没了,显示为黄色期待审核中....... 第二天,审核通过了。。

June 3, 2021 · 1 min · jiezi

关于ios:IOS-某电商App签名算法解析二-Frida-RPC调用

一、指标Android下用frida来做rpc调用计算签名,咱们曾经玩的很纯熟了。 明天介绍在IOS下的玩法。要点如下: 参数类型确认NSDictionary NSArray等ObjectC对象的结构和复制ObjectC 类办法和对象办法的调用附送福利, ObjectC的nil 参数如何结构二、步骤参考Android下的玩法参照 [某段子App协定剖析(三)] 咱们把frida RPC的框架先搭一下,这块的套路是一样的, Flask启动一个web服务脚本裸露一个接口进去给Python调用app = Flask(__name__)@app.route('/getSignFromJni', methods=['GET'])def getSignFromJni(): global gScript body = "{\"api-version\":\"1.1.0\"}" client = "apple" clientVersion = "10.0.1" functionId = "xview2Config" openudid = "078593ee2fda3d54aae5879cb841b2faa62a4985" res = gScript.exports.callsign(body,client,clientVersion,functionId,openudid) return res处于演示目标,咱们这里创立一个GET接口,参数写死。理论利用的时候能够创立个POST接口,把参数传进来。 rpc.exports = { callsign : callSignFun};脚本外面裸露一个callsign函数供Python调用。 参数类型确认上篇文章中咱们曾经定位到了 +[XXSignService getSignWithDic:keys:], 他有两个参数,只须要在 IDA中 查看下这个函数被谁调用了,就能够看到入参的类型了。 查看穿插援用还是上次教的 X 大法 。 关上 IDA, 一脸懵逼, 昨天忘保留了,昨天忘保留了,忘保留了...... 你知不知道昨天IDA嚼了一上午才搞定。难道还要来嚼一上午??? 换个玩法吧,反正咱们曾经定位了,用Frida打印下参数类型试试。 onEnter: function(args) { var receiver = new ObjC.Object(args[0]); var message1 = ObjC.Object(args[2]); var message2 = ObjC.Object(args[3]); console.log('msg1=' + message1.toString() + ",type: "+ message1.$className); console.log('msg2=' + message2.toString() + ",type: "+ message2.$className);},我就晓得frida不会让咱们悲观 ...

June 3, 2021 · 2 min · jiezi

关于ios:无埋点核心技术iOS-Hook-在字节的实践经验

作者:字节挪动技术——段文斌 前言家喻户晓,字节跳动的举荐在业内处于领先水平,而准确的举荐离不开大量埋点,常见的埋点采集计划是在响应用户行为操作的门路上进行埋点。然而因为App通常会有比拟多界面和操作门路,被动埋点的保护老本就会十分大。所以行业的做法是无埋点,而无埋点实现须要AOP编程。 一个常见的场景,比方想在UIViewController呈现和隐没的时刻别离记录时间戳用于统计页面展示的时长。要达到这个指标有很多种办法,然而AOP无疑是最简略无效的办法。Objective-C的Hook其实也有很多种形式,这里以Method Swizzle给个示例。 @interface UIViewController (MyHook)@end@implementation UIViewController (MyHook)+ (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ /// 惯例的 Method Swizzle封装 swizzleMethods(self, @selector(viewDidAppear:), @selector(my_viewDidAppear:)); /// 更多Hook });}- (void)my_viewDidAppear:(BOOL)animated { /// 一些Hook须要的逻辑 /// 这里调用Hook后的办法,其实现其实曾经是原办法了。 [self my_viewDidAppear: animated];}@end接下来咱们探讨一个具体场景: UICollectionView或者UITableView是iOS中十分罕用的列表UI组件,其中列表元素的点击事件回调是通过delegate实现的。这里以UICollectionView为例,UICollectionView的delegate,有个办法申明,collectionView:didSelectItemAtIndexPath:,实现这个办法咱们就能够给列表元素增加点击事件。 咱们的指标是Hook这个delegate的办法,在点击回调的时候进行额定的埋点操作。 计划迭代计划1 Method Swizzle通常状况下,Method Swizzle能够满足绝大部分的AOP编程需要。因而首次迭代,咱们间接应用Method Swizzle来进行Hook。 @interface UICollectionView (MyHook)@end@implementation UICollectionView (MyHook)// Hook, setMyDelegate:和setDelegate:替换过- (void)setMyDelegate:(id)delegate { if (delegate != nil) { /// 惯例Method Swizzle swizzleMethodsXXX(delegate, @selector(collectionView:didSelectItemAtIndexPath:), self, @selector(my_collectionView:didSelectItemAtIndexPath:)); } [self setMyDelegate:nil];}- (void)my_collectionView:(UICollectionView *)ccollectionView didSelectItemAtIndexPath:(NSIndexPath *)index { /// 一些Hook须要的逻辑 /// 这里调用Hook后的办法,其实现其实曾经是原办法了。 [self my_collectionView:ccollectionView didSelectItemAtIndexPath:index];}@end咱们把这个计划集成到今日头条App外面进行测试验证,发现没法方法验证通过。 ...

May 31, 2021 · 4 min · jiezi

关于ios:AFNetworking请求XML

前言:http协定是服务器与客户端交换数据最常见的形式。一般来说,数据格式是JSON,也有XML的状况。JSON格局都会解析,如何解析XML呢?—— 本文是基于AFNetworking3.2.1版本参考资料:https://stackoverflow.com/que...https://stackoverflow.com/que...划重点一般来说,咱们进行HTTP申请,会实例化一个AFHTTPSessionManager对象,并设置一些属性: manager = [AFHTTPSessionManager manager];manager.requestSerializer = [AFJSONRequestSerializer serializer];manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", @"text/plain",nil];manager.requestSerializer.timeoutInterval = 30.0f;此处咱们没有设置manager的responseSerializer属性,responseSerializer默认类型是AFJSONResponseSerializer,很显著要进行申请XML格局的数据,不能应用AFJSONResponseSerializer。以下是要害代码: AFXMLParserResponseSerializer *response = [AFXMLParserResponseSerializer serializer];manager.responseSerializer = response;网上有些说法是 AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];response.acceptableContentTypes = [NSSet setWithObjects:@"text/xml", nil];manager.responseSerializer = response;这种用法是不对的!这里responseSerializer的类型必须是AFXMLParserResponseSerializer,至于为何会呈现这样的解决方案,可能是因为答者简略的看到谬误返回是“不能接管text/xml类型的数据”而猜想的答案,并没有加以验证;或者说,此办法在低版本的 AFNetworking 中能够应用。 用法如下[manager GET:url parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"LenovoID 登录申请后果:%@",responseObject); NSXMLParser *xmlparser = responseObject; [xmlparser setDelegate:self]; [xmlparser parse];} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"LenovoID 登录申请失败:%@", [error localizedDescription]);}];要实现NSXMLParserDelegate协定 ...

May 31, 2021 · 1 min · jiezi

关于ios:iOS形参传递的是什么

iOS形参传递的是什么?你是否也有这样的困惑?当我将一个对象传给一个函数后,这个函数领有值是原始对象,还是一个克隆体?当原始对象产生扭转后,函数内形参的值是否会随之扭转?先介绍 OC 的状况咱们晓得打印地址的办法如下: NSLog(@"地址:%p",p);那么,让咱们先打印下,传参后的地址变动,此处我对一个Person对象进行了三次援用,别离是:原始值、传参、全局变量,代码如下: -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; NSLog(@"全局变量地址:%p",_zs); Person *p = [[Person alloc] init]; p.name = @"张三"; p.address = @"聚贤路"; _zs = p; NSLog(@"原始地址:%p",p); NSLog(@"全局变量地址:%p",_zs); [self say:p]; self.nameTF.text = p.name; self.addressTF.text = p.address;}-(void)say:(Person *)p{ NSLog(@"形参地址:%p",p); }后果如下: 2021-05-25 17:32:21.733520+0800 PerameterDemo_iOS[18143:349387] 全局变量地址:0x02021-05-25 17:32:21.733673+0800 PerameterDemo_iOS[18143:349387] 原始地址:0x600000e2c1202021-05-25 17:32:21.733798+0800 PerameterDemo_iOS[18143:349387] 全局变量地址:0x600000e2c1202021-05-25 17:32:21.733884+0800 PerameterDemo_iOS[18143:349387] 形参地址:0x600000e2c120很显著:地址雷同 为了保险起见,咱们来看看属性的变动产生的影响,这个可能是咱们真真切切关系的 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; NSLog(@"全局变量地址:%p",_zs); Person *p = [[Person alloc] init]; p.name = @"张三"; p.address = @"聚贤路"; _zs = p; NSLog(@"原始地址:%p",p); NSLog(@"全局变量地址:%p",_zs); [self say:p]; self.nameTF.text = p.name; self.addressTF.text = p.address;}- (IBAction)change:(UIButton *)sender { _zs.name = self.nameTF.text; _zs.address = self.addressTF.text; }-(void)say:(Person *)p{ NSLog(@"形参地址:%p",p); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0)); dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC); dispatch_source_set_event_handler(timer, ^{ NSLog(@"OC---name:%@ addresss:%@\n",p.name,p.address); }); dispatch_resume(timer); _timer = timer; }上述代码咱们次要做了两个事件: ...

May 31, 2021 · 1 min · jiezi

关于ios:IOS-对数组内元素进行排序

1、数组种元素为NSNumber类型,间接对数组种的元素进行排序:#pragma mark -- 数组排序办法(升序)- (void)arraySortASC{ //数组排序 //定义一个数字数组 NSArray *array = @[@(3),@(4),@(2),@(1)]; //对数组进行排序 NSArray *result = [array sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSLog(@"%@~%@",obj1,obj2); //3~4 2~1 3~1 3~2 return [obj1 compare:obj2]; //升序 }]; NSLog(@"result=%@",result);} #pragma mark -- 数组排序办法(降序)- (void)arraySortDESC{ //数组排序 //定义一个数字数组 NSArray *array = @[@(3),@(4),@(2),@(1)]; //对数组进行排序 NSArray *result = [array sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSLog(@"%@~%@",obj1,obj2); //3~4 2~1 3~1 3~2 return [obj2 compare:obj1]; //降序 }]; NSLog(@"result=%@",result);} #pragma mark -- 数组排序办法(乱序)- (void)arraySortBreak{ //数组排序 //定义一个数字数组 NSArray *array = @[@(3),@(4),@(2),@(1),@(5),@(6),@(0)]; //对数组进行排序 NSArray *result = [array sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSLog(@"%@~%@",obj1,obj2); //乱序 if (arc4random_uniform(2) == 0) { return [obj2 compare:obj1]; //降序 } else{ return [obj1 compare:obj2]; //升序 } }]; NSLog(@"result=%@",result);}2、数组内元素为对象,依据对象的某一属性进行排序:#pragma mark -- 数组排序办法(升序)- (void)arraySortASCWithKind:(KindType)kindType{ //数组排序 //定义一个数字数组 NSArray *array = [NSArray arrayWithArray:self.dataMuArr]; //对数组进行排序 NSArray *result = [array sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSLog(@"%@~%@",obj1,obj2); //3~4 2~1 3~1 3~2 if ([obj1 isKindOfClass:[BATicker class]] && [obj2 isKindOfClass:[BATicker class]]) { BATicker * ticker1 = obj1; BATicker * ticker2 = obj2; NSNumber * number1 = @(ticker1.c); NSNumber * number2 = @(ticker2.c); if (kindType == KindTypeTurnover) {//成交额 number1 = @(ticker1.q); number2 = @(ticker2.q); }else if (kindType == KindTypePrice) {//价格 number1 = @(ticker1.c); number2 = @(ticker2.c); }else if (kindType == KindTypePercentageGain) {//涨幅 number1 = @(ticker1.price_P); number2 = @(ticker2.price_P); } return [number1 compare:number2]; //升序 } return [obj1 compare:obj2]; //升序 }]; NSMutableDictionary * keyIndexDic = [NSMutableDictionary dictionary]; for (int i = 0; i < result.count; i++) { BATicker * ticker = result[i]; [keyIndexDic setObject:@(i) forKey:ticker.s]; } self.dataMuArr = [NSMutableArray arrayWithArray:result]; self.keyIndexDic = [NSMutableDictionary dictionaryWithDictionary:keyIndexDic]; [self.tableView reloadData]; NSLog(@"result=%@",result);}#pragma mark -- 数组排序办法(降序)- (void)arraySortDESCKind:(KindType)kindType{ //数组排序 //定义一个数字数组 NSArray *array = [NSArray arrayWithArray:self.dataMuArr]; //对数组进行排序 NSArray *result = [array sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSLog(@"%@~%@",obj1,obj2); //3~4 2~1 3~1 3~2 if ([obj1 isKindOfClass:[BATicker class]] && [obj2 isKindOfClass:[BATicker class]]) { BATicker * ticker1 = obj1; BATicker * ticker2 = obj2; NSNumber * number1 = @(ticker1.c); NSNumber * number2 = @(ticker2.c); if (kindType == KindTypeTurnover) {//成交额 number1 = @(ticker1.q); number2 = @(ticker2.q); }else if (kindType == KindTypePrice) {//价格 number1 = @(ticker1.c); number2 = @(ticker2.c); }else if (kindType == KindTypePercentageGain) {//涨幅 number1 = @(ticker1.price_P); number2 = @(ticker2.price_P); } return [number2 compare:number1]; //降序 } return [obj2 compare:obj1]; //降序 }]; NSMutableDictionary * keyIndexDic = [NSMutableDictionary dictionary]; for (int i = 0; i < result.count; i++) { BATicker * ticker = result[i]; [keyIndexDic setObject:@(i) forKey:ticker.s]; } self.dataMuArr = [NSMutableArray arrayWithArray:result]; self.keyIndexDic = [NSMutableDictionary dictionaryWithDictionary:keyIndexDic]; [self.tableView reloadData]; NSLog(@"result=%@",result);} 参考内容: iOS之数组的排序(升序、降序及乱序)【https://www.cnblogs.com/xiao-... ...

May 26, 2021 · 2 min · jiezi

关于ios:iOS之字符串处理截取字符串匹配字符串分隔字符串大小写转换

1.截取字符串NSString *string =@"123456d890";NSString *str1 = [string substringToIndex:5];//截取掉下标5之前的字符串NSLog(@"截取的值为:%@",str1); NSString *str2 = [string substringFromIndex:3];//截取掉下标3之后的字符串NSLog(@"截取的值为:%@",str2);2.匹配字符串NSString *string =@"sd是sfsfsAdfsdf";NSRange range = [string rangeOfString:@"Ad"];//匹配失去的下标NSLog(@"rang:%@",NSStringFromRange(range));string = [string substringWithRange:range];//截取范畴内的字符串NSLog(@"截取的值为:%@",string);3.分隔字符串NSString *string =@"sdfsfsfsAdfsdf"; NSArray *array = [string componentsSeparatedByString:@"A"]; //从字符A中分隔成2个元素的数组NSLog(@"array:%@",array); //后果是adfsfsfs和dfsdf//用一段字符串 替换一段字符串NSString *strUrl = [urlString stringByReplacingOccurrencesOfString:@“;" withString:@""];//替换某段字符NSString *idCard = [Str stringByReplacingCharactersInRange:NSMakeRange(5, 6) withString:@"*****************"];NSLog(@"idCard:%@",idCard); 4.字母大小写转换NSString *str =@"AAaaBB3bb";// 把字符串全副转化为小写NSString *str1 = [str lowercaseString];NSString * str2 = str.lowercaseString;// 把字符串全副转化为大写(外面蕴含数字没事)str1 = [str uppercaseString];str2 = str.uppercaseString;//结尾大写,其余小写(外面蕴含数字,数字后的字母会大写)str1 =[str capitalizedString];str2 =str.capitalizedString;DLog(@"%@ - %@",str1, str2);

May 26, 2021 · 1 min · jiezi

关于ios:IOS-获取IP地址

获取内网IP地址//获取ip地址+(NSString *)getIPaddress{ //获取内网IP NSString *address = @"error"; struct ifaddrs * ifaddress = NULL; struct ifaddrs * temp_address = NULL; int success = 0; success = getifaddrs(&ifaddress); if(success == 0) { temp_address = ifaddress; while(temp_address != NULL) { if(temp_address->ifa_addr->sa_family == AF_INET) { if([[NSString stringWithUTF8String:temp_address->ifa_name] isEqualToString:@"en0"]) { address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_address->ifa_addr)->sin_addr)]; } } temp_address = temp_address->ifa_next; } } NSLog(@"获取到的IP地址为:%@",ip); return ip;}获取外网IP地址//获取外网 ip地址+(NSString *)getIPaddress{ NSError *error; NSURL *ipURL = [NSURL URLWithString:@"http://pv.sohu.com/cityjson?ie=utf-8"]; NSMutableString *ip = [NSMutableString stringWithContentsOfURL:ipURL encoding:NSUTF8StringEncoding error:&error]; //判断返回字符串是否为所需数据 if ([ip hasPrefix:@"var returnCitySN = "]) { //对字符串进行解决,而后进行json解析 //删除字符串多余字符串 NSRange range = NSMakeRange(0, 19); [ip deleteCharactersInRange:range]; NSString * nowIp =[ip substringToIndex:ip.length-1]; //将字符串转换成二进制进行Json解析 NSData * data = [nowIp dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; DLog(@"%@",dict); return dict[@"cip"] ? dict[@"cip"] : @""; } return @"";}备注:也有网友举荐这两种,亲测不靠谱,有时会特地慢或获取不到IP ...

May 26, 2021 · 1 min · jiezi

关于ios:iOS-面试技巧和注意事项

https://www.sohu.com/a/140249... 1 面试的目标求职者通过体现证实本人对岗位的胜任 公司通过面试找到合乎职位需要的员工面试者面试的体现影响着公司用人抉择,对于软件工程师,技术面试往往是“天王山”之战,过来了BOSS面的时候,刷人机率不高,过不去,就得要找新的工作了。学习入口:优待业 2 面试的筹备当初大多数人对面试都挺器重的,我感觉也不应该简略回绝面试宝典类的货色(这片文章也是这一类的),感觉软件开发过程 波及很多方面,很难在短时间内对一个人实现全面的评估,举个例子,比方高考,原本的目标是通过考试依附分数提拔优秀学生去好大学,能力是根底,但掂量是问题,那学生的最好办法,是依据考试来学习,这是个绝对简略的办法,而后就有了应试教育。工作面试也一样,集体的能力、工作背景、我的项目教训是根本,面试的技巧是应试技巧,面试技巧是表面文章,就像皮之不存,毛将焉附一样?又不得不说的是谁都喜爱毛色靓丽的皮草。 着装:小伙子干净利索 姑娘 随便装扮,别浓妆艳抹就行 知识点:这里我只列一些iOS的知识点: objective -C 局部 cocoaTouch 框架局部 XCODE 应用局部 我的项目教训局部 前三局部的内容,根本是按面试官考查面试者的知识点的掌握情况,唯独我的项目教训,是面试者向面试官展现,能够提前练习下我的项目介绍,做到有档次,有重点(依据不同的职位有不同的重点),例如,作为软件开发人员参加了iPad的点餐零碎开发,实现了图片菜单显示的代码,遇到了scroll view显示大图片效率问题,用懒加载的形式解决了该问题。 3 面试的过程捕风捉影的答题 刚毕业求职时,特胆怯一道题目打不进去就间接被pass掉,这也是老手求职的过程,的确会遇到,如果是特地根底题,倡议回去增强基础知识。但对于个别面试,一两道题答复不进去,是十分失常的,在这样技术信息不断更新的时代,在牛的人技术都不能八面玲珑。以我本人面试他人的教训,senior些的面试官,都会理解面试人员必定有一些问题不理解,所以会从各个方面的问题都会波及到,而后对面试者做一个综合评估。对于面试过程中,遇到本人不相熟的畛域,肯定要捕风捉影,不理解就是不理解,理解一点就说一点,肯定不要晓得一点就装资深,上来就是:这个晓得,简略的很,哪个做过,不简单。而后面试官持续深刻的问些细的技术点,就开始找理由:"这个做太久了,那个模块是他人实现的",这倒不要回升到道德诚信,因为面试过程总会有一些外表上的货色,从面试官的角度来说,首先他能面试你,个别是比你资深,其次面试的问题,面试官肯定筛选过,所以在这下面抱着蒙混过关的心理,是有点天真的。在本人善于的技术点与面试官进行深层次的沟通,能失去加分,技术点的常识都是能够再学的,对于问题的形象深度,往往决定一个程序员解决问题的能力。 说说解决过难的问题?问什么最有成就感的事,说说解决过的难题,这个很重要,十分重要,压轴题,至多20分答题的态度要虚心 有些人不能说技术不强,对于晓得的便唯他独尊,不晓得就觉不重要,视线局限,例如一个iPhone程序员之前我的项目做的都是Native App,碰到面试官问他:HTML Hybrid框架的一些货色? 就显出一副等闲视之的鄙视,说Html 5做进去的界面显示速度慢,都是垃圾,先不说Html 5在跨平台上的劣势和已有网站业务的挪动化降级等,面试官的问题很有可能是他的我的项目波及这方面的技术,他是有主观感触的,主观上会如何评估这位面试者?如俗语所说:“满招损,谦得益”,虚心的人,在我的项目中的团队单干也会遇到较少阻碍。 4 面试的心态说下面试的心态,有些面试者,曾经面试场特缓和,有的甚至声音会发颤,这是很影响施展的。对于有这样的问题的,往往太想要这份工作,造成缓和适度,但生存中不止有一次机会,而即便这次面试很胜利,也有可能最终拿不到offer,一份工作不全由一次面试决定,一个人的人生也不全由一份工作决定。当初社会倒退越来越快,一次失败往往是下一次工作机会的开始,所以去尝试,总会有新的、更好的机会。 5 面试的后续什么样面试是较胜利的?我的了解,首先是面试官对你有趣味,体现就是答复面试官问题时,他听的很认真,听完你的答复后,面试官还会讲一些他对这个问题的认识,这样的互动就很胜利。 面试完结便是学习的一个新开始,不管是否拿到最终的offer,都曾经花了工夫去面试,对于面试中的问题的总结,就十分必要了。一些没有答出来的题目,能够在网上查查材料,把不分明的问题搞清楚,进步集体能力,让本人失去晋升才是最重要的。这里我给大家筹备一些材料整合,须要的能够自行下载。 题库材料已上传到Github:https://github.com/Henry-ley/rest/blob/main/README.md内附整顿的学习思维导图以及一些iOS材料。

May 18, 2021 · 1 min · jiezi

关于ios:Ios-多线程之NSOperation与NSOprationQueue

在说NSOperation之前,先说一下gcd,gcd 技术是一个轻量的,底层实现暗藏的神奇技术,咱们可能通过gcd和block轻松实现多线程编程,有时候,gcd相比其余零碎提供的多线程办法更加无效,当然,有时候gcd不是最佳抉择,另一个多线程编程的技术 NSOprationQueue 让咱们可能将后盾线程以队列形式依序执行,并提供更多操作的入口,这和 gcd 的实现有些相似。 这种相似不是一个偶合,在晚期,MacOX 与 iOS 的程序都广泛采纳Operation Queue来进行编写后盾线程代码,而之后呈现的gcd技术大体是按照前者的准则来实现的,而随着gcd的遍及,在iOS 4 与 MacOS X 10.6当前,Operation Queue的底层实现都是用gcd来实现的。 所以,目前能够利用Operation Queue下层的封装,比拟繁难的实现更简略的多线程操作。 在复用控件,或者多任务执行的状况下,防止不了要开启多个线程和中断线程。 此时,咱们就能够应用NSOperation来异步执行工作和中断工作。包含IOS UITableView和UICollectionView中的cell复用状态下的多线程操作 @property (strong, nonatomic) NSOperationQueue *operationQueue;@property (strong, nonatomic) NSMutableDictionary *operationDict;- (NSMutableDictionary *)operationDict { if (!_operationDict) { _operationDict = [NSMutableDictionary dictionary]; } return _operationDict;}- (NSOperationQueue *)operationQueue { if (!_operationQueue) { _operationQueue = [[NSOperationQueue alloc] init]; _operationQueue.maxConcurrentOperationCount = 6; } return _operationQueue;}//控件显示开启工作- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { if (![self.operationDict objectForKey:@(indexPath.item).stringValue]) { NSBlockOperation *operation = [self operationEvent:indexPath.item]; [self.operationQueue addOperation:operation]; [self.operationDict setObject:operation forKey:@(indexPath.item).stringValue]; }}//控件隐没中断工作- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { if (self.operationDict[@(indexPath.item).stringValue]) { NSBlockOperation *operation = self.operationDict[@(indexPath.item).stringValue]; [operation cancel]; [self.operationDict removeObjectForKey:@(indexPath.item).stringValue]; }}//异步工作- (NSBlockOperation *)operationEvent:(NSInteger)index { WEAKSELF NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ }]; return operation;}- (void)dealloc{ NSLog(@"开释%@",self); [self.operationQueue cancelAllOperations];}在暗藏和显示复用控件中中断和开启工作。能够在以后控件下解决各种简单工作而不会抵触。例如图片加载,图片压缩,下载回调,异步读取资源等多种状况下都十分实用。 ...

May 17, 2021 · 1 min · jiezi

关于ios:uniapp修改richtext富文本内容的样式

https://www.cnblogs.com/xhxdd/p/14420111.html //me.rule = res.data.rule;me.rule = res.data.rule.replace(/\<img/gi, '<img style="max-width:100%"');

April 28, 2021 · 1 min · jiezi

关于ios:IOS-Metal使用METAL自定义CIFilter导致vertex-function找不到的问题

通常应用 CIFilter 能够对图像做一些解决,如果有些成果咱们不称心,咱们须要本人去实现的话,是能够通过写 metal 来自定义 CIFilter,和 fragment shader 相似,解决对象都是一个像素点。 如何应用 metal shader 自定义 CIFilter 网上的教程有很多,我这里还是赘述一下。 第一步:创立一个.metal文件,定义 filter。记住本人的办法名,前面须要用到。第二步:继承 CIFilter 定义出一个子类,通过加载 default.metallib 找到对应的办法即可。第三步:在 Build Settings 外面退出两个flag。 上面是第一步的代码,轻易定义一个文件比方叫 kernel.metal,外面放上这些代码。留神到这里的办法名是 myColor。 myColor 办法就是简略的返回以后点的色彩。 #include <metal_stdlib>#include <CoreImage/CoreImage.h>using namespace metal;extern "C" { namespace coreimage { float4 myColor(sample_t s, float value) { return s.rgba; } }}第二步,建设一个本人的 CIFilter 子类,而后做上面这些事件。 class CustomFilter : CIFilter { var value: Double = 0 private var kernel: CIKernel! override init() { super.init() commonInit() } required init?(coder: NSCoder) { super.init(coder: coder) commonInit() } private func commonInit() { // 找到默认的 default.metallib guard let url = Bundle.main.url(forResource: "default", withExtension: "metallib"), let data = try? Data(contentsOf: url) else { fatalError("Unable to get metallib") } // 从lib中加载到 myColor 办法 guard let myKernel = try? CIKernel.init(functionName: "myColor", fromMetalLibraryData: data) else { fatalError("Unable to create CIKernel from myKernel") } kernel = myKernel } var inputImage:CIImage? override var outputImage: CIImage? { let src = CISampler(image: self.inputImage!) // apply 这个 filter return kernel.apply(extent: inputImage!.extent, roiCallback: { _, rect in return rect}, arguments: [src, value]) }}第三步,在 Build Setting 外面退出 flag ...

April 22, 2021 · 2 min · jiezi

关于移动应用开发:反垄断应用公平联盟再次发声希望苹果建立更开放的-iOS-平台

去年,以《堡垒之夜》开发商 Epic Games、Spotify Technology、Match Group(Tinder 母公司)为首的多家公司结成了新的「利用偏心联盟」(The Coalition for App Fairness) ,目标是联手镇压「Apple 向消费者收税及打击翻新」的行为,独特推动 App 生态系统的抉择自在和公平竞争,改善利用开发和散发的条件。 近日,他们再次向苹果收回申请,心愿其能够建设一个更为凋谢的 iOS 平台,领有更好的审核流程、内部领取以及相似 Windows 的利用散发。 一、致力于突破苹果垄断的「利用偏心联盟」 家喻户晓,App Store 是苹果容许消费者将利用下载到 iPhone 等设施上的惟一形式。此外,苹果对应用其利用内领取零碎的利用(App)收取 15% 至 30% 的佣金,并制订了宽泛的规定,只有恪守这些规定能力呈现在其 App Store 中。苹果的这些做法,始终一直导致利用开发商以及利用开发者的批评和法律投诉。 去年 8 月,一些不满苹果 App Store 经营模式的利用开发商,联结创建了非营利机构“利用偏心联盟”(The Coalition for App Fairness),正式向 App Store 的经营模式发动挑战。 依据该组织的网站,它是一个“由行业当先公司成立的独立非营利组织,旨在提倡在整个应用程序生态系统中的抉择自在和公平竞争。” 它的成员“心愿每个应用程序开发人员都有平等的机会进行翻新和从事商业活动,而不受刻薄的政策,不偏心的税收或垄断管制。” 只管这个形容听起来很抽象,并且能够利用于其余应用程序市场,例如 Google Play,但该组织目前的口头次要还是围绕着 Apple 和 App Store。 利用偏心联盟心愿建设一个更凋谢的 iOS 平台,领有更好的审核流程、内部领取以及相似 Windows 的利用散发。该联盟次要针对的是随便/不合理的利用提交回绝、赚取数百万美元的欺骗利用以及偏差于高收入者的行为。 除了上述提到的 Epic Games、Spotify Technology、Match Group,该组织的其余成员还包含 Basecamp、Blix、Blockchain.com、Deezer 和 Tile 等规模较小的公司,以及来自欧洲的开发商,包含欧洲出版商理事会(European Publisher Council)、新闻媒体欧洲(News Media Europe)和 Protonmail 等。 ...

April 20, 2021 · 1 min · jiezi

关于app:技术干货-应用上线前的体检你知道需要检测哪些指标吗

简介:利用上线前检测哪些项目?如何检测?检测数据指标包含哪些?随着越来越多的企业基于 mPaaS 搭建并上线新的 App,App 的上线品质也成为各个客户关注的重点。上线前检测哪些项目?如何检测?检测数据指标包含哪些? 借着上次去 XX 农信客户去做线上性能检测,加上之前多个 mPaaS 历史我的项目的经验总结,将 App 上线前 mPaaS 相干检测内容整顿积淀如下。一、安全性1.1 RPC 是否开启国密加密 对 App 来说,数据通信平安至关重要,mPaaS 曾经反对 ECC、RSA 和国密(SM2)三种形式。其中,在金融行业 App 内倡议开启加密配置为 SM2 国密加密,满足行业监管要求。配置能够参考产品文档:数据加密1.2 离线包是否开启验签 为了保障下发到本地离线包的安全性,mPaaS 提供了离线包验签机制,保障了离线包的安全性。整体示意图如上所示,用户设置流程如下: 开发者配置好一对公私钥,私钥放在服务端用于对离线包签名,公钥放在客户端,用于对签名对验证。在离线包公布平台,如果配置了签名私钥,平台下发的 amr 文件就会带上签名信息(通过私钥对离线包的 hash 值加密后失去的密文)。客户端在拿到 amr 包并解压后,客户端会应用在我的项目中预置的公钥进行签名的验证(解密上一步的密文失去一个 hash 值,同时本地计算离线包的 hash 值,判断两者是否雷同),如果雷同则通过验证。如果签名校验失败,则删除离线包走 fallback 地址。通过离线包的验签机制,能够达到以下的目标:保障了离线包的内容残缺,解决解压异样,读取异样下的失常显示保障了离线包的起源正确,不被本地歹意篡改1.3 userId 信息是否设置正确因为 userId 会被后续用到很多中央,比方推送,白名单。所以个别倡议抉择服务端的 userId 字段作为存储字段,不便后续和服务端做 userId 字段同步,不倡议存储集体手机号或者身份证等个人信息作为 userId。1.4 埋点信息是否蕴含敏感信息,比方交易单号思考到埋点的量级很大,所以 mPaas 的埋点默认本地是没有做数据加密的,所以埋点信息不倡议蕴含敏感字段,避免因为埋点导致信息透露。敏感字段倡议走 RPC 的数据通道上报,保障数据安全。如果有埋点埋敏感字段的诉求,须要被动开启埋点的本地加密配置。1.5 隐衷权限配置因为当初监管机构对隐衷权限管控比拟严格,mPaas 针对权限管控做了对应的接入计划。须要须要确保上线前隐衷权限相干配置曾经失常接入。二、稳定性2.1 验证在 Android4.X 版本的是否能够失常使用mPaaS 最低反对 Android 4.3 版本以上,所以公布前须要验证下低版本 Android 设施的可用性,遇到比拟多的是在 Android 4.X 设施上因为多 dex 加载导致的类找不到导致的装置闪退问题。2.2 iOS 符号表是否失常上传公布前须要确保 iOS 的符号表曾经上传到 mPaaS 后盾,不便后盾反解闪退信息。2.3 热修复模块是否接入并且验证通过公布前须要确保热修复模块的失常接入以及验证通过,保障上线有针对 Native 模块的热修复能力,保障异样场景下的修复能力。2.4 离线包 Fallback 域名确认确认 Fallback 域名是否是外网可拜访的地址,遇到过公布后下发的还是内网地址的 case。2.5 离线包模块接入 CDN上线前做好容量评估,默认 mPaaS 的离线包是存储在 OSS 内的,然而个别倡议针对离线包模块接入 CDN,通过 CDN 的缓存性能解决因为离线包下载导致带宽打满的危险,同时绝对于 OSS 存储来说,CDN 的费用更低。接入示意图如下:2.6 RPC 外围链路接口压测上线前须要对 App 外围链路的 RPC 接口做性能压测,获取接口性能瓶颈,能够用做后续的限流值的设定参考。同时须要针对 RPC 限流场景做演练,避免上线限流后客户端呈现各种异样。2.7 公布更新性能可用上线前须要验证公布 apk 性能可用,包含公布更新的强制更新性能,保障在极其场景下,须要强制降级应用。三、性能体验3.1 离线包离线性能是否失常失效确保离线包的离线性能失常应用,避免因为离线包各种配置问题导致离线性能不失效。3.2 UC 内核是否失常接入 ...

April 19, 2021 · 1 min · jiezi

关于ios:UICollectionView-横向布局的两种途径

应用 UICollectionView 实现上面的成果 路径 1,简略间接, custom UICollection View Layout , 横着码 路径 2,UICollectionViewFlowLayout + UICollection View 的宽度管制这样 layout 下, func doLayout(){ collect.snp.makeConstraints { (m) in m.top.equalToSuperview().offset(95) m.leading.equalTo(title) m.height.equalTo(40) // item width * 3 + spacing * 2 m.width.equalTo(80 * 3 + 33) } }

April 18, 2021 · 1 min · jiezi

关于ios:iOS-视图布局原则

先做层级,再做地位:另一思路,是指定视图的 zIndex func forUI(){ // 档次关系,很重要。不好改的 view.addSubs([ playingV, tShowD, contentHan, progressV, bottomBoard, panelG ]) if calData.isFromStd{ view.addSubs([editX_bt, progressChoosePop]) } layout_h() h.addSubs([rhsMostMenuBtn, downloadB]) if calData.isFromStd{ tShowD.addSubs([vertBar]) } view.addSubs([darkCurtain, donePop, lhsPopViewSpacing, rhsPopViewTimes, speedSelectIdxV]) v.addSubs([resultPop]) let topRhsWidget: (ConstraintMaker) -> Void = { m in m.size.equalTo(CGSize(width: 32, height: 32)) m.trailing.equalToSuperview().offset(-16) m.centerY.equalTo(self.h.arrow) } if calData.isFromStd{ vertBar.snp.makeConstraints { (m) in m.size.equalTo(CGSize(width: 8, height: 16)) m.leading.equalToSuperview().offset(16) m.top.equalToSuperview().offset(24) } editX_bt.snp.makeConstraints{ (m) in m.leading.equalToSuperview().offset(16) m.trailing.equalToSuperview().offset(-16) m.top.equalTo(h.snp.bottom).offset(16) m.height.equalTo(40) } tShowD.snp.makeConstraints{ (m) in m.leading.trailing.equalToSuperview() m.top.equalTo(editX_bt.snp.bottom) m.bottom.equalTo(bottomBoard.snp.top) } rhsMostMenuBtn.snp.makeConstraints(topRhsWidget) downloadB.snp.makeConstraints { (m) in m.size.equalTo(CGSize(width: 32, height: 32)) m.centerY.equalTo(h.arrow) m.trailing.equalTo(rhsMostMenuBtn.snp.leading).offset(-16) } } else{ tShowD.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() m.top.equalTo(h.snp.bottom) m.bottom.equalTo(bottomBoard.snp.top) } downloadB.snp.makeConstraints(topRhsWidget) } playingV.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() m.top.equalTo(h.snp.bottom) m.bottom.equalTo(progressV.snp.top) } panelG.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() m.height.equalTo(panelG.h) self.constraintA.bottomPanelG = m.bottom.equalTo(progressV.snp.top) } bottomBoard.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() m.height.equalTo(bottomBoard.heightStd) m.bottom.equalToSuperview() } progressV.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() m.height.equalTo(progressV.h) m.bottom.equalTo(bottomBoard.snp.top) } resultPop.snp.makeConstraints { (m) in m.size.equalTo(resultPop.size) m.center.equalToSuperview() } donePop.snp.makeConstraints { (m) in m.size.equalTo(donePop.size) m.center.equalToSuperview() } darkCurtain.snp.makeConstraints { (m) in m.edges.equalToSuperview() } if calData.isFromStd{ progressChoosePop.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() constraintA.bottomChoosePop = m.bottom.equalTo(h) constraintA.heightChangeChoosePop = m.height.equalTo(self.progressChoosePop.popH) } } lhsPopViewSpacing.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() m.height.equalTo(150 + UI.std.bottomOffsetY) m.bottom.equalToSuperview() } rhsPopViewTimes.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() m.height.equalTo(160 + UI.std.bottomOffsetY) m.bottom.equalToSuperview() } speedSelectIdxV.snp.makeConstraints { (m) in m.leading.trailing.equalToSuperview() m.height.equalTo(150 + UI.std.bottomOffsetY) m.bottom.equalToSuperview() } view.layoutIfNeeded() }不会呈现奇怪的动画 ...

April 18, 2021 · 1 min · jiezi

关于ios:swift-双向绑定代码举例

例子一:事件绑定,间接触发 置顶显示,滚动隐没 点击显示,再点隐没 var panelHidden = BehaviorSubject<Bool>(value: false)bottomBoard.rhsMenuB.rx.tap.subscribe { () in self.panelHidden.onNext(self.bottomBoard.rhsMenuB.isSelected) }.disposed(by: rx.disposeBag) panelHidden.asObservable().bind(to: panelG.rx.isHidden).disposed(by: rx.disposeBag) panelHidden.map { (haha) -> Bool in haha == false }.asObservable().bind(to: bottomBoard.rhsMenuB.rx.isSelected).disposed(by: rx.disposeBag)间接触发 extension PlayerController: UIScrollViewDelegate{ func scrollViewDidScroll(_ scrollView: UIScrollView) { if case EnterP_src.custom = p_input{ panelHidden.onNext(tShowD.contentOffset.y > 3) } else{ panelHidden.onNext(contentHan.contentOffset.y > 3) } }}例子2:事件绑定,间接触发 点击呈现,再点收起 var topChoosePopHidden = BehaviorSubject<Bool>(value: true)rhsMostMenuBtn.rx.tap.subscribe { () in self.topChoosePopHidden.onNext(self.rhsMostMenuBtn.isSelected) }.disposed(by: rx.disposeBag) topChoosePopHidden.asObservable().subscribe(onNext: { (toHid) in if toHid == false, self.playingSelected{ self.playingSelected.toggle() self.toPause() } UIView.animate(withDuration: 0.3) { if toHid{ self.constraintA.bottomChoosePop?.constraint.update(offset: 0) } else{ self.constraintA.bottomChoosePop?.constraint.update(offset: self.progressChoosePop.popH) } self.view.layoutIfNeeded() } }).disposed(by: rx.disposeBag) topChoosePopHidden.asObservable().map { (ququ) -> Bool in ququ == false }.asObservable().bind(to: rhsMostMenuBtn.rx.isSelected).disposed(by: rx.disposeBag)间接触发 ...

April 18, 2021 · 1 min · jiezi

关于android:RTE-2021-编程大赛启动用声网-SDK-开发实时互动应用

RTE(Real Time Engagement)2021 翻新编程挑战赛,是由声网Agora 主办,面向寰球开发者、编程爱好者与极客的一场在线黑客马拉松。参赛者能够基于声网Agora SDK实现社交泛娱乐、在线教学、互动游戏、互动直播、IoT 等任何实时互动场景利用,竞争最终大奖。 本届大赛将持续以“线上编程+线上提交+线上决赛的形式进行。不管你是高校学生、创业者、极客企业,还是集体开发者,只有你爱 Coding,都能够在这里挥洒创意,纵情发明。 点击这里报名参赛 大赛日程安排官网报名——4月15日 - 5月28日组队开发——4月15日 - 5月28日作品提交——5月28日 - 6月2日线上决赛——6月12日往年的大赛有两个赛道,「利用翻新挑战赛道」和「技术创新挑战赛道」,都是面向利用编程爱好者及团队的。 赛道一:利用翻新赛道一面向所有的利用开发者。 作为大赛的传统赛道,开发者能够自由发挥设想,开发具备实时互动能力的利用。开发者能够应用包含声网Agora视频/音频 SDK、云信令 SDK、互动白板 SDK、录制 SDK、实时码流减速 SDK、云录制 SDK、环信 IM SDK 等产品,实现创意利用,不限平台及开发语言。 同时,往年咱们还联结相芯科技、360 等合作伙伴,凋谢出他们的 AI 能力,开发者能够依据本人的需要进行联合,在利用中实现美颜、背景抠图等性能,给了赛道一更多的翻新可能性。 赛道一奖项设置一等奖:50000 元 x 1 支队伍二等奖:30000 元 x 1 支队伍三等奖:10000 元 x 1 支队伍环信专项奖:20000元 x 1 支队伍(详见官网阐明)优秀奖 2000 若干所有获奖团队可退出声网Agora 招聘绿色通道所有获奖团队一年内享受声网守业反对打算的福利赛道一评奖规定评委会依据“完成度”、“创意度”、“潜在商业价值”等多个维度进行考量。拜访 RTE 2021 编程大赛官网,具体作品要求和评奖规定。 赛道二:技术创新赛道二仅面向 C++语言开发者。 咱们在声网音视频 SDK 的根底上,封装了两个插件接口。参赛团队能够将本人的产品或开源我的项目封装为插件,通过对接插件接口,让插件性能融入基于 Agora SDK 开发的各种实时互动场景中。同时利用该插件开发可运行演示的 Demo。 目前曾经有多个合作伙伴通过云市场插件接口,胜利将视频美颜、滤镜、变声等音视频扩大能力融入了各类实时互动场景中。咱们心愿通过将该插件接口凋谢给社区,来激发开发者的更多创造力,拓展 RTC 技术能力边界。 赛道二奖项设置技术创新专项奖:20000 元*1 支队伍优秀奖 2000 若干所有获奖团队可退出声网Agora 招聘绿色通道所有获奖团队一年内享受声网守业反对打算的福利赛道二评奖规定本赛题提交的作品插件及性能演示Demo需可能失常运行,方可入围参加后续的评审。评委会依据“代码残缺度”、“文档残缺度”、“稳定性”、“创意度”等多个维度进行考量评分。拜访 RTE 2021 编程大赛官网,具体作品要求和评奖规定。 ...

April 16, 2021 · 1 min · jiezi

关于ios:告别iOS审核被拒提升iOS审核通过率

iOS审核始终是每款挪动产品上架苹果商店时面对的一座大山,每次提审都像是一次漫长而又悲壮的旅行,常常被苹果拒之门外,无比煎熬。那么问题来了,咱们有没有什么方法精确把握苹果审核准则,从而晋升审核的通过率呢?答案是必定的,腾讯预审团队从以下两方面做了摸索,通过近一年的推广和数据监控, iOS审核月通过率从过往的35%晋升到85%+: 1、剖析过往提审被拒的案例,并联合《苹果利用商店审核指南》的条款,整顿成可执行的审查条目; 2、抽离出能够自动化的办法,晋升审核的效率; 接下来咱们将带你一起走进苹果审核,揭秘iOS审核的假相。本篇作为引子,分三个层面给大家简略介绍iOS审核相干内容: 1、iOS审核探秘之审核设施篇 2、iOS审核被拒纬度分析 3、腾讯预审团队的iOS预审验收维度 iOS审核探秘之审核设施篇苹果的产品从07年推出后,逐渐新陈代谢,内部市场上也曾经有比拟多的产品硬件版本和零碎版本。如此多的零碎版本,咱们怎么去保障提审版本的品质,是始终困惑测试和产品团队的点。往往苹果忽然公布了新的零碎,咱们怎么应答这些危险呢? 【经典案例】14年底,因为iOS新版本8.1.1零碎的公布,做了一些零碎底层Bug的修复,导致了游戏产品领取不胜利、webview登录失败。【要害动作】1、与苹果关注同样的验收版本:揣测苹果审核团队设施验收选型也会遵循原则:验收最新公布的两个零碎版本,两个硬件版本。保障游戏能够在市场占有率最高的两个零碎版本及硬件配置上能够晦涩运行。 因而腾讯预审团队会依据以后版本公布的节奏洽购设施,降级零碎,保障能笼罩到以上的零碎版本和硬件版本。目前验收的机器列表及型号: 2、关注beta版本:苹果在新版本上线前会公布beta版本做大量测试,此时须要跟进beta版本,能够提前发现问题,防止忽然版本公布造成措手不及。 iOS审核被拒纬度分析为了探索更深层次的被拒状况,咱们做了细化的剖析,通过2014年的提审数据统计,看看都是因为哪些起因被拒吧!依据2014年的数据统计状况,并联合《苹果利用商店审核指南》,预审组通过细分将预审工作划为3大模块:客户端资源查看、利用内容检查和提审资源查看: 预审业务验收的维度 客户端资源查看 确保客户端内Plist等配置合乎苹果要求,不存在多余的Key值enable; 利用内容查看 对利用的内容进行审查,确认无波及色情、高雅、暴力、枪支等内容;并对布告文字等筛查,无苹果禁止的字眼等;利用内不蕴含cdkey兑换,好友邀请及夸耀等苹果最新禁止的内容; 提审资源查看 确保提交的游戏截图、视频合乎苹果要求,且截图及视频中没有敏感信息;同时视频截图等均合乎苹果的技术要求,帧率分辨率达标.本文先简介下苹果审核的相干内容,后续会根据业务验收的维度,给大家逐个介绍验收的要点、已经遇到的坑和那些让人不淡定的被拒案例。 本文自己首发www.zfjobslib.com。 【iOS代码混同工具】版本:ZFJObsLib 1.7.2

April 16, 2021 · 1 min · jiezi

关于ios:在GitHub-Actions上进行Flutter-的测试和部署

GitHub Actions可轻松实现所有软件工作流程的自动化。间接从GitHub构建,测试和部署代码。使代码审查,分支机构治理和问题分类工作按您想要的形式进行。 记得在19年底的时候,我看到了Run Flutter Driver tests on GitHub Actions这篇文章,随即就开始在flutter_deer中去应用,因为过后我的项目中刚好就有写好的集成测试。 过后在flutter_deer中会有许多issue都是对于我的项目运行的问题,许多同学反映运行不起来,各种报错。说实话无奈确定是环境问题还是自身代码问题。有了GitHub Actions这个工具,就能够在GitHub上构建运行测试,只有测试通过,能够保障在代码在相应的flutter版本上运行没有问题。 GitHub Actions的性能十分弱小,同时提供有actions市场,咱们在下面能够搜寻应用别人写好的各种性能的 action。程度无限,这里我只做简略的应用介绍,具体能够看官网文档。 1.增加GitHub Actions到我的项目中首先在我的项目中增加.github / workflows目录。而后创立.yml格局的工作流文件。比方:flutter-drive.yml。它的根底格局如下: # workflow 的名称name: flutter_deer driver# 触发 workflow 的条件on: [push, pull_request]# workflow执行的一项或多项工作jobs: ...触发workflow 的条件也能够依据状况定制。比方指定推送到某一分支、指定某些文件批改时触发。例如: # push 提交中批改`pubspec.yaml`触发on: push: paths: - 'pubspec.yaml' ...具体见文档[Workflow syntax for GitHub Actions](https://docs.github.com/en/ac... 2.编写工作工作的构造如下: 简略解释就是jobs下是job(工作),job下是step(步骤),step下是action(动作)。 上面举一个执行flutter单元测试的例子: jobs: # 工作id,必须是jobs下惟一的 accessibility_test: # 运行所须要的虚拟机环境。例如 windows-2019, macOS-latest、macOS-10.14 runs-on: macos-latest # job的运行步骤 steps: # 便于获取flutter源码 # https://github.com/actions/checkout - uses: actions/checkout@v2 # 设置flutter环境 # https://github.com/marketplace/actions/flutter-action - uses: subosito/flutter-action@v1 with: flutter-version: '2.0.2' channel: 'stable' # or: 'dev' or 'beta' # 运行的命令 - run: "flutter pub get" # 步骤名称 - name: "Run Flutter Accessibility Tests" run: "flutter test test/accessibility_test.dart"下面的正文解释的很分明了,其中用到了两个action,使得整个脚本的书写简略了很多。上面再贴上几个flutter_deer中用到的job,根本能够无脑应用,只需批改本人的运行命令即可。 ...

April 15, 2021 · 2 min · jiezi

关于ios:iOS-App送审审核43被拒问题怎样处理我来告诉你

写这篇文章的理由很简略,我遇到iOS审核4.3问题了,老板须要我解释和怎么防止。为了答复这个问题,我整顿所理解的信息,历时4个多小时。可能会呈现偏差或者不实用,该因是我能力无限,不保障肯定能通过过iOS审核4.3人审核问题。 先回顾下,4.3问题被拒邮件是怎么的 3 Design: SpamGuideline 4.3 - Design This app duplicates the content and functionality of other apps submitted by you or another developer 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. The next submission of this app may require a longer review time, and this app will not be eligible for an expedited review until this issue is resolved. ...

April 15, 2021 · 2 min · jiezi

关于ios:苹果App-Store审核条例更新关于iOS审核你知道多少

近日,苹果给全世界的开发者推送了一则告诉,大抵内容是:从2020年4月30日起开始,所有提交给App Store商店内所有的利用都必须应用iOS 13 SDK或更高版本构建。意思是在5月之前,旧App要更新、新App要上架,都必须应用iOS 13的SDK开发,以齐全适应iOS 13零碎,包含反对深色模式、Sign in with Apple等个性。微信在下一个版本中也可能上线iOS版暗黑模式。 那么,对于iOS审核你晓得多少呢? iOS App是应用在苹果手机上或者是iOS零碎的第三方应用程序。目前比拟驰名的iOS App商店是苹果公司的iTunes上传的App Store,它的作用是容许用户能够从iTunes Store和mac app store上浏览和下载一些应用iPhone SDK或mac开发软件APP。 iOS App开发是指开发者通过iOS开发平台,应用苹果公司开发的iOS SDK搭建开发环境,开发可能利用在IPad、iPhone、iPod Touch、Mac等设施上的iOS App应用软件。用于开发应用的外围编程语言是Object-C,用到的工具是苹果公司开发的一款编程软件--Xcode 对于iOS SDK :iOS SDK是开发iOS 软件App过程中必不可少的App开发包,外面有从开发程序到编译再到调试最初运行和测试等等一系列开发APP流程里所须要的工具。 对于Object-C :Objective-C语言是裁减C的面向对象编程语言,它的用处是专门用来编写iOS操作系统应用程序和Mac OS X操作系统应用程序的利器。 对于Xcode:Xcode是苹果公司开发的一款编程软件,向开发人员提供关闭集成的开发环境。有对立的用户界面,设计、编码、调试、测试等工作都能够在一个简略的窗口内实现。 iOS零碎曾经成为一款非常优良并且成熟的操作系统,领有宏大的用户群体,在一众App开发洪流中,很多公司都会抉择开发iOS App,起因有以下几个点: 对立公布 任何应用iOS零碎的用户想要下载软件都能在App Store利用商店中下载,iOS零碎机型少、适配性最优,开发者产品开发可能缩小适配问题的妨碍,专一于某一机型,打造最优适配性产品。无效缩小在多方平台上的维护费用,节俭资金。 安全性高 iOS App开发基于Unix闭源的操作系统,对iOS生态采取了封闭性的措施,并建设了欠缺的开发者认证和利用审核机制,防止恶意软件入侵。 盈利容易 iOS是实用于各类苹果产品的零碎,在挪动终端用户泛滥,用户粘性较大,App Store外面的应用软件的数量、活跃度和下载次数在应用软件市场处于领先地位,另外,iTunes与信用卡之间的整合,付费形式很简便。 稳定性强 iOS零碎的硬件和软件具备一致性和超强的稳定性,在iOS零碎上经营的App不会呈现卡顿影响用户应用的问题,能让用户产生良好的体验感。 iOS零碎将用户体验放在首位,深受好评。正因为如此,进入苹果的iOS利用程序开发市场的人员要紧紧盯住苹果的新进展,以取得对于iOS App软件开发的最新信息,这样能力以最快的速度给客户欠缺的iOS App利用开发,倒退公司专一于iOS零碎的新动力。 本文自己首发www.zfjobslib.com。 【iOS代码混同工具】版本:ZFJObsLib 1.7.2

April 15, 2021 · 1 min · jiezi

关于ios:Wakeup-in-XNU

本文作者:段家顺苹果在iOS13的时候,在内核中退出了一个新的性能掂量指标wakeup,同时因为这个指标而被零碎杀死的利用不可胜数,其中也包含咱们罕用的微信淘宝等。而这个指标齐全是由 XNU 内核统计的,所以咱们很难通过日志等一般伎俩去精确的定位问题,所以这里通过另一种思路去解决这个问题。 为什么要统计 wakeup要定位这个问题,首先咱们须要晓得这个指标的目标是什么。 XNU 中,对性能的指标有CPU、内存、IO,而wakeup属于 CPU 的性能指标,同时属于 CPU 指标的还有 CPU 使用率,上面是XNU中对其限度的定义。 /* * Default parameters for CPU usage monitor. * * Default setting is 50% over 3 minutes. */#define DEFAULT_CPUMON_PERCENTAGE 50#define DEFAULT_CPUMON_INTERVAL (3 * 60)#define TASK_WAKEUPS_MONITOR_DEFAULT_LIMIT 150 /* wakeups per second */#define TASK_WAKEUPS_MONITOR_DEFAULT_INTERVAL 300 /* in seconds. *//* * Level (in terms of percentage of the limit) at which the wakeups monitor triggers telemetry. * * (ie when the task's wakeups rate exceeds 70% of the limit, start taking user * stacktraces, aka micro-stackshots) */#define TASK_WAKEUPS_MONITOR_DEFAULT_USTACKSHOTS_TRIGGER 70总结来说,当 CPU 使用率在3分钟内均值超过50%,就认为适度应用CPU,当wakeup在300秒内均值超过150次,则认为唤起次数过多,同时在阈值的70%水位内核会开启监控。 ...

April 14, 2021 · 4 min · jiezi

关于ios:自如大前端团队招聘iOS架构师

职位形容: 负责自若网挪动研发部,IOS APP整体的架构设计推动挪动团队组件化施行对组内研发工程师进行领导对新技术有谋求,可能通过一直的学习晋升本人 职位要求: 熟练掌握OC/C/C++,理解Swift,了解OC的runtime机制,具备底层和开源代码浏览能力扎实的计算机专业基本功,对数据结构、算法、操作系统、网络协议、多线程、数据库、异步IO等有深刻的理解高度的进取心和专一力,长于攻克技术难题,思维麻利对常见的三方库如AFNetworking等有过深刻理解,对它们的底层原理及架构设计有过剖析和实际对组件化治理有深刻理解,有Shell/Ruby等脚本语言实现工具化自动化流程教训(此项为必选项)可能和业务团队,PM等团队成员良好沟通,并推动我的项目落地对iOS性能调优,跨平台解决方案如React-Native或Flutter有肯定理解和实践经验理解前端和后端技术,如Vue\React.js以及Node.js等参加过至多百万级日活利用开发最低学历必须为本科 欢送发简历至邮箱 zhangxl122@ziroom.com或扫码加微信详聊

April 13, 2021 · 1 min · jiezi

关于flutter:Flutter-35Flutter进阶教程在Flutter中使用Lottie动画

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) Lottie动画在挪动开发中总是须要展现一些动画特效,作为程序员的咱们并不是很善于用代码做动画,即使是有些动画能够实现,在跨平台的过程中也会因为API的差异性导致动画在各个平台中展现的有差别。所以为了开释程序员的双手,不再陷入写动画调参数的苦恼,Airbnb开源了一款专门用于跨平台的动画解决方案:Lottie。 Lottie能够解析应用Bodymovin导出为json的Adobe After Effects动画,并在挪动端和Web端展现。这样咱们就能够把做动画的工作交给业余做动画的共事来实现,咱们只须要应用导入json文件即可,这样是不是大大减少了程序员的工作量,并且可能:实现业余的人做业余的事。 导入Lottie框架在Flutter中曾经存在开源的Lottie库,所以咱们只须要在pubspec.yaml中的dependencies导入相干的依赖即可 dependencies: lottie: ^0.7.0 应用Lottie库在须要展现Lottie动画Widget导入头文件 import 'package:lottie/lottie.dart';默认读取本地json文件 Lottie.asset("json/fun_do_like.json"),只须要一句话即可展现Lottie动画,是不是很简略。咱们来看其余的属性 repeat 是否反复执行。默认是true,如果是false,动画执行一遍就会进行reverse 是否倒序播放。默认是false,如果设置为true,动画会先正序播放一遍,而后再倒序播放一遍animate 是否容许播放动画。默认是true,如果设置为false,则不会播放动画从网络读取json文件Lottie.network("https://cdn.jsdelivr.net/gh/johnson8888/blog_pages/images/lottie_test.json",),同样咱们能够设置获取到网络资源后的回调 Lottie.network("https://cdn.jsdelivr.net/gh/johnson8888/blog_pages/images/lottie_test.json", onLoaded: (LottieComposition composition) { print("onLoaded"); },),好了,对于Lottie的应用就总结这些了。 想体验以上的示例的运行成果,能够到我的Github仓库我的项目flutter_app->lib->routes->lottie_demo_page.dart查看,并且能够下载下来运行并体验。

April 13, 2021 · 1 min · jiezi

关于ios:UILabel-的行数控制技巧

UILabel 的行数管制,例如显示 2 行 第一种,大家都会:label.numberOfLines = 2第 2 种, 能够通过字体大小 和 label 的 size ,来管制label.font = UIFont.semibold(ofSize: 16)label.frame.size = // ...配合 label.numberOfLines = 0 依照第二种办法设计后, 后面两种成果,很天然, 为什么, 第三个 Label 的成果,是垂直居中?不是靠上去一些。 这样设置: label 的 centerY 束缚 = view 的 top + 常量 ( 30 的 offset 左右 ) 而后能够,一行居中 两行出现 多于两行,出省略号 github repo

April 13, 2021 · 1 min · jiezi

关于ios:iOS-的-paged-controller-的一种思路

实现下图的成果 档次关系为:Collection View 有一个 header,header 下面有一个 scroll view Collection View 还有很多 cell图中可视区域内,有 6 个 成果是,点击 scroll view 下面的 item,能够更新上面 cell 的内容 第一局部,自定义布局 Collection View layout布局精髓 class HanGridLayout: UICollectionViewLayout { override public func prepare() { guard let collectionView = collectionView else { return } prepareCache() contentHeight = 0 // 配置 header 的地位, let headerH = layout.headSize.height let headerIP = IndexPath(item: 0, section: 0) let headerAttributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: CommonComponent.header.kind, with: headerIP) headerAttributes.frame = CGRect(x: 0, y: contentHeight, width: UI.std.width, height: headerH) var cellX: CGFloat = layout.contentEdge.left cache[.header]?[headerIP] = headerAttributes contentHeight += (headerH + layout.contentEdge.top) let count = collectionView.numberOfItems(inSection: 0) // 配置 cell 的地位 for item in 0 ..< count { let cellIndexPath = IndexPath(item: item, section: 0) let attributes = UICollectionViewLayoutAttributes(forCellWith: cellIndexPath) attributes.frame = CGRect( x: cellX, y: contentHeight, width: layout.itemSize.width, height: layout.itemSize.height ) // 次要是,这里有一个换行 contentHeight += layout.exceed(origin: &cellX, limit: collectionViewWidth) cache[.cell]?[cellIndexPath] = attributes } // 这里有一个兼顾显示 // 对于最初一行的格子,内容的出现 if count % 2 == 1{ contentHeight += layout.itemSize.height } contentHeight += layout.contentEdge.bottom }}第 2 局部,header 下面的滚动条次要是状态的治理, ...

April 12, 2021 · 2 min · jiezi

关于ios:模拟器网络-json-转-plist-文件便捷代码

模拟器,网络 json 转 plist 文件, Net.request(.get(key)) { (result) in do{ let data = try result.get().data do{ let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) if let dict = json as? [String: Any], let src = dict["data"] as? NSDictionary{ // 写入数据 src.write(toFile: "/Users/Pictures/one.plist", atomically: true) } } catch let error{ print(error) } } catch{ print(error) } }便捷的写法,当然是 NSDictionary 写入门路字符串 配套的解析代码:if let src = Bundle.main.url(forResource: "one", withExtension: "plist"){ do { let data = try Data(contentsOf: src) let decoder = PropertyListDecoder() let resp = try decoder.decode(HanCatalog.self, from: data) // ... } catch { print(error) } }

April 12, 2021 · 1 min · jiezi

关于ios:加深对-module-的理解swift-repo-命名空间-local

为了便于批改调试他人公布的 repo把他人的代码,拉到本地, 为了保持一致,不扭转其命名空间 本文例子是,把一个 github framework 的代码,内置 project 中这里用的是 rechsteiner/Parchment拷贝网上下载的源代码 放到应用的 project 中并删掉我的项目配置 选中我的项目 project,新建 target 创立动静库 库名,与 git repo 统一 升高 lib 的版本个别会有这个操作 增加网上下载的 github repo 代码留神上面的,代码 target 归属 实现了 能够这样 import Parchmentgithub repo

April 12, 2021 · 1 min · jiezi

关于ios:记录一次iOS-App-Store审核被拒绝的原因

最近提交 iOS 版本到 App Store 审核,发现审核被拒了,未通过起因如下:Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage We noticed that after users authenticate their account with Sign in with Apple, they are required to take additional steps before they can access content and features in your app. Specifically: Your app requires two-factor authentication after users use Sign in with Apple.Sign in with Apple is designed to be a self-contained, all-in-one login system. With security features like built-in two-factor authentication, you can remove additional sign-up steps so users can focus on your app's content and features. ...

April 8, 2021 · 1 min · jiezi

关于ios:iOS-环境环境变量

1.通过过程api获取,返回的是字典. id env = [[NSProcessInfo processInfo] environment];打印如下:2.通过xcode设置环境变量打印环境变量会打印在日志里 思考:通过环境变量去查找是否在调试状态

April 7, 2021 · 1 min · jiezi

关于逆向工程:iOS-逆向之patch

这里介绍的是ida的patch.1.搜寻svc #0x80,回到IDA View-A界面,能力正确搜寻点击图中T字按钮,弹出搜寻框点击列表中进入2.批改svc #0x80,在IDA View-A界面中选中svc那一行,点击工具栏Edit-->Patch program-->Change Bytes弹出批改框将01 10 00 D4批改为nop 的byte码 1F 20 03 D5(如何晓得nop的byte码,寻找一个nop,change bytes就能够了),点击ok如上图就是批改nop胜利了,下一步要保留到程序里去3.将patch批改保留到程序里去,点击工具栏Edit-->Patch program-->Apply patches to input file 到此,残缺的patch就实现了ps:能够尝试下KeyPatch

April 7, 2021 · 1 min · jiezi

关于RTC:拍乐云-x-扬帆出海-x-LiveCloud音视频出海专家干货分享

拍乐云携手扬帆出海和 LiveCloud 于 3月30日晚 举办了“音视频出海新风口02期”线上公开课流动,聚焦目前十分炽热的音视频社交App出海赛道。 本次扬帆出海线上公开课,Live Fun Group COO Sandy和拍乐云Pano首席音频专家Ark两位社交出海专家,围绕“精准把握海内用户需要,打造产品的沉迷式体验感”等产品话题,为大家提供包含出海音视频赛道抉择和市场定位、出海音视频技术的难点和解决思路等相干内容分享。 上面是扬帆出海依据本次流动两位嘉宾的分享整顿的干货内容: Live Fun Group COO Sandy:出海社交产品 赛道抉择及定位策略Live Fun Group 从2019年4月成立至今,曾经开发近10款产品,包含短视频App、1对1生疏交友直播、秀场直播等,用户遍布东南亚及欧美。 团队成员来自于美国硅谷、中国香港及国内大厂,相熟海内市场用户增长,已经一个月在菲律宾零老本获取一百万用户。Live Fun Group COO Sandy从“海内社交市场有多大? 当初进场,还有机会吗? 须要筹备什么?”这三个问题动手,分享了海内社交产品,如何抉择赛道和进行产品定位。 01海内社交市场有多大? 大家抉择出海社交这个赛道,首先会思考第一个问题,海内社交市场到底多大?据网上统计来说有10亿的用户量,5亿的美金月流水。然而在很多社交产品外面其实有三方领取未被统计。据我理解有一些产品三方领取支出都达到50%以上。这样算下来5亿美金月流水相对是低估了这个市场。 02当初进场,还有机会吗? 第二个问题,当初进场还有机会吗?我能够十分必定动摇的通知你,十分有机会,社交风口是始终存在。海内最早做欧美社交产品的是Match Group,他们从1993年开始做网上的网页端交友平台,过渡到当初他们曾经领有20多款社交APP,不同垂直畛域,不同的玩法都会有。Match Group次要的浸透区域是欧美,而印度、中东,甚至非洲这些国家其实还有待开发。 03须要筹备什么? 第三个问题,如果说你当初真的筹备做社交出海,具体筹备什么? 次要是这三个点: 1、产品技术。做一个社交产品进去,前提是产品的技术架构,像明天拍乐云这套PaaS零碎,接入了间接就能够疾速打造出一款社交产品。 2、内容经营。比方主播,须要搞定内容产出。 3、投放。投放到市场,让用户触达到你这款产品。出海社交赛道粗略来说有4种产品状态:秀场直播、语音房、1对1视频、1对1语音。 上面将聊到区域市场定位及不同市场用户特色。篇幅所限,举两个区域欧美和中东。 欧美四个关键词,第一个凋谢,欧美互联网文化崇尚自在。第二点就是用户更习惯含糊其辞,理解本人的需要是什么?所以最好在做这种产品的时候,让他尽快找到他想要的货色,那就对了。第三点,重视隐衷。他们更偏好抉择匿名登录。第四点,付费志愿十分强。基本上咱们投放下来,我做过欧美、中东、印度,算下来他的付费转化,均匀付费值都是偏高,均匀付费额能够高达15美金。 再一个中东,中东人无疑十分激进,阿拉伯区域,因为他们是穆斯林国家。女性上街都是佩戴头纱,你们能够搜一下宗教警察这四个字,微信上搜就能够,有一些产品因而被下架一些新闻。 再来就是十分付费慷慨,慷慨体验在数值下面,中东这个地区他们厉害在十分多的土豪爸爸,几千个土豪爸爸养好了就能够了。他们做语音房,一万下载可能做到月50万美金的支出。慷慨这个不必再证实了。 第三点,社交需要十分强。能够看到Yalla他们下一步有更多的社交产品会在中东落地,例如下图中右下角倒数第二款的一款1对1语音产品。还有很多入场中东的厂商都是做语聊房,其余产品方面还是能够去设想。 所以,我倡议你们在抉择产品或者国家去做的时候,如果你是小白,无妨抉择一些便宜或者容易做的产品先去试验,产品存活下来再进一步进行产品的迭代。 抉择好区域之后,就是如何做产品的本地化,那么本地化次要波及哪些方面呢? 第一个是登录,登录国内产品都是用微信或者手机号登录,做海内的时候,须要思考当地登录习惯,他们会用苹果、脸书、谷歌登录等等。如果说你做熟人关系链,秀场直播心愿引入更多熟人关系链进去,你能够思考利用自身熟人关系链引进。如果说你做1对1产品,用户不太心愿让他人晓得,你务必思考匿名登录设置。 第二个是语言,进入一个市场,如果他在国内自身做一款产品,去到海内可不可以间接翻译成英文进去,我感觉能够。然而问题是你如果进入的是一些小的国家,如果像是越南,或者西班牙语区这些中央,倡议你要先考量本人做哪个市场?而后判断本人间接做英文,或者本地化语言更加好。 再一个是内容,这五点外面最重要的。当用户进到你的产品,他其实偏好性还是心愿看到本人外国,如果你是秀场,或者语聊房,用户沟通媒介看不到脸,必须是语言的话,那么语言必须互通。当地主播提供这些内容,用户和主播之间能力良好沟通,你才能够促使用户违心付费,反对这个主播。如果你做到前期绝对成熟的话,能够思考退出不同版,而后设置一个VIP。做社交产品,或者1对1产品来说,男生还是花心,他们还是心愿有多个国家的女性抉择能够聊天,能够做成VIP设置,而后抉择跟其余国家聊天。 下一个是领取,领取方面首先你其实无论做苹果或者安卓,他们自身有本人官网领取,基本上解决80%-90%的问题,因为很多用户有付费能力,他肯定会绑定商店信用卡进行领取。为什么退出三方领取,就是考量到局部地区,用户信用卡遍及度不高,他们更习惯本人电子钱包。三方领取是被平台排挤的,所以大家退出三方领取的时候,须要考量下架危险。 最初一个是流动,流动方面其实1对1产品需要不是很高,然而如果是秀场或者语音房,就能够削减用户互动性。你能够看到这个秀场在情人节、圣诞节、复活节等节日做一些流动,联动和组织主播做一些主题性流动,让用户上来跟主播交换。中东地区一些流动,就像对战,他们甚至会联动他们十几个国家主播而后做对战,吸引不同国家的粉丝去做打赏,刺激用户反对本人主播,最初还是平台自身本人获利。说完以上几点,其实大家根本应该想好本人要做什么产品,进去做的时候,应该怎么防备,或者怎么筹备。然而如果你们有一些局部解决不了的话,大家能够找咱们交换。这也是最近咱们公司除了做产品以外,最新提供一些服务反对。 拍乐云Pano首席音频专家 Ark:泛娱乐出海潮流背地的音视频技术撑持拍乐云首席专家 Ark次要是围绕底层技术聊聊泛娱乐产品背地音视频的要点和难点,以及拍乐云如何给做音视频社交产品的创业者赋能,帮忙大家疾速打造一个低时延、高晦涩、高品质的用户体验。 我在介绍明天的话题之前,先介绍一下咱们公司和团队,拍乐云是一家做音视频云服务的PaaS平台公司,咱们提供端到端的音视频云服务。大家可能对Zoom这个软件比拟理解,在疫情期间它在寰球资本市场十分火。咱们的外围团队次要来自视频会议市占率No.1的Cisco WebEx,与Zoom团队基因雷同,团队汇聚了视频、音频、网络等畛域顶级专家。我明天次要给大家讲一讲泛娱乐出海潮流背地的音视频技术撑持。讲技术比拟艰涩,咱们先从耳熟能详的产品切进来,聊聊音视频社交产品的共性以及技术挑战。 Clubhouse背地出海机会的思考 首先给大家介绍一下Clubhouse,这一款软件无论资本市场还是用户流传度都是十分火爆的。是什么让一款纯音频社交如此火爆?我对此做了一些整顿和思考,跟大家做个分享。 总结海内线上泛娱乐产品的两个特点,第一个性能简略,第二个多人交互,方才Sandy说的海内1对1,能够搜出几千款,而将来多人社交的后劲更大。 音视频产品翻新及技术攻克 拍乐云如何赋能创业者出海 接下来,聊一下音视频技术,这是咱们本人的架构图,性能比拟全面,具备肯定的代表性和典型性。首先咱们有多端的SDK和咱们的媒体服务器,两者构建在一起,实现实时交互。另外,咱们有全网的智能调度体系等等,这也是咱们做好音视频底层服务须要具备的模块。 ...

April 7, 2021 · 1 min · jiezi

关于ios:武汉最最最牛逼的-IT-公司全在这了

最近大学里的一个同学忽然辞职回武汉了。 我忍不住问他『大家都往深圳跑,你怎么回来了呢?』 他说:『感觉在深圳永远也买不起房子,再说了武汉当初互联网公司也蛮多的,不愁找工作。』 他持续补充『最重要的是,还能随时回家』。 听到这里我没往下问了。 其实当初武汉曾经不光是年轻人逃离北上广的着海洋,更成为了很多毕业生扎根的首选城市。 很多敌人都在思考回二线城市倒退,然而又放心二线城市公司坑多,最近我花了一些工夫,梳理了武汉简直所有的IT互联网公司,心愿能帮忙大家排坑。 一线机会多,二线也难受,大家谨慎抉择 大厂字节跳动武汉研发核心 1、简介字节跳动推出了多款有影响力的产品,包含今日头条、抖音、西瓜视频等。 据理解,字节跳动武汉分公司目前在职员工约3000人+(研发和非研发)。武汉研发核心是字节跳动中国继北京、深圳、上海后第4个研发核心,成立于2018年4月。除研发核心外,字节跳动在武汉还领有教育、汽车、销售、客服等多个团队。 字节跳动在武汉次要的团队是『效率工程团队(Efficiency Engineering)』,对于效率工程团队介绍,能够看 B站的视频: https://www.bilibili.com/vide... 2、工作工夫上下班无需打卡大小周3、薪资福利公积金全额12%,餐补、就近住房补贴下午茶,零食饮料水果有限供给4、工作地点武汉洪山区关山小道保利广场保利国内核心6楼(租赁) 5、一句话点评赶上市前的末班车,能面上就去。 华为武汉研所 1、简介华为武汉研究所2006年成立,业务范围笼罩:终端手机软件、平板、PC、IOT,波分光传送业务,海思芯片等。 2、薪资福利/工作工夫公积金按基本工资5%缴纳员工股权激励,业界 TOP 薪资收费加班班车、收费夜宵3、工作工夫每月最初一个周六全员固定加班工作日早晨和周末是否加班依据部门而定,周末加班双倍工资4、工作地点武汉将来科技城,目前已自建办公园区基地,办公环境十分好。 5、岗位投递/招聘要求应届生学校要求:大量211+985及以上社招:次要以外企德科 OD 招聘为主, 高级别的岗位能够签华为合同从2019年开始,华为试水新型招聘形式,大量低级别社招岗位都与第三方公司『外企德科』签约,也称 OD 招聘。 OD人员与传统外包有区别,OD 是与华为正式员工一起办公(地位坐一起),薪资构造也是基本工资+绩效工资,即同工同酬。级别职称形式与华为正式员工不同,OD 是 D1、D2、D3……,华为是13、14、15……,另外 OD 人员无股票激励。 6、一句话点评华为武汉研究所在武汉属于体量十分大的公司,薪资待遇也处于 TOP 程度,但武汉的业务整体偏硬比方嵌入式,纯软件的个别是设施的配套软件。如果有互联网情结的同学倡议三思。 斗鱼 1、简介武汉斗鱼网络科技有限公司是中国直播行业龙头企业、中国互联网百强企业、中国十大软件著作权人、武汉市第一家“独角兽”级互联网公司。2019年7月17日,斗鱼直播在美国纳斯达克交易所挂牌上市,股票代码为“DOYU”,成为湖北首家海内上市的外乡互联网公司。 2020年10月12日,虎牙直播与斗鱼发表合并,虎牙直播将收买斗鱼市场上所有流通股份,斗鱼将成为虎牙直播公有全资子公司,并将从纳斯达克退市。 请原谅我将斗鱼放到『大厂』的类别,因为武汉大厂太少了,斗鱼是土生土长的武汉公司,这个殊荣就给它啦~ 2、薪资福利公积金全额缴纳餐补、交通贴补、带薪年休假3、工作工夫弹性大多数部门都是双休4、工作地点洪山区光谷软件园(租赁楼) 5、一句话点评与虎牙合并了,变动大 腾讯云武汉研发核心 1、简介腾讯云武汉业务范围笼罩云计算、平安、人工智能等根底产品及能力,延长到批发、医疗、政务、教育、交通等多个产业的数字化解决方案。从IaaS、PaaS到SaaS等多种类型,其中包含泛滥市场一流产品,如腾讯会议、数据库、衰弱码、乘车码、数字政府、智慧校园、一机游云南等一系列产品。 强调一下,腾讯云武汉是腾讯团体CSIG旗下的全资子公司。全资子公司与团体还是有区别的,大家要学会辨别。 放在『大厂』是因为腾讯云武汉有腾讯的光环,但要正视全资子公司这个事实。 2、薪资福利全额工资缴纳公积金5%带薪年假早晚班车、夜宵贴补3、工作工夫弹性工作制,个别双休 4、工作地点武汉市江夏区腾讯小道1号 5、一句话点评全资子公司,慎重考虑 科大讯飞武汉全资子公司 1、简介作为中国最大的智能语音技术提供商,在中文语音合成、语音辨认、书面语评测等多项技术上领有国内当先的成绩。 2015年8月10日,科大讯飞武汉研发核心成立,目前已成立全资子公司,但成立前后对员工而言没什么变动。 2、薪资福利最低基数缴纳五险一金 3、工作工夫不同岗位不同我的项目差距大,10%的是996,30%的是995,剩下50%每月加班工时30h左右 4、工作地点关山小道355号新世界T1写字楼 5、一句话点评入职即巅峰 雷军系小米武汉研发核心 1、简介小米武汉研发核心成立于2017年,在汉次要业务有信息技术部、云平台部(小爱)、IOT 平台等。 2、薪资福利公积金12%,失常五险一金。 3、工作工夫不打卡,弹性,个别9:00到20:30,双休 4、工作地点武汉东湖高新九峰一路小米武汉研发核心(自建) 5、一句话点评涨薪慢,有点抠 金山办公武汉研发核心 1、简介金山2017年与小米一起落户武汉,次要产品是 WPS 办公套件。 ...

April 6, 2021 · 1 min · jiezi

关于ida-pro:20210402学习笔记

1.NSUserDefault寄存的值会依照key和value寄存在app沙盒文件下/Library里的包名.plist里. 2.un0cover越狱的时候须要关上Export TFP0设置我的项目,才有权限应用substrate的hook办法(MSHookFunction). 3.MSHookFunction hook带回调函数的办法会失败.

April 2, 2021 · 1 min · jiezi

关于android:Flutter-Boost-混合开发框架初探

一、Flutter Boost简介家喻户晓,Flutter是一个由C++实现的Flutter Engine和由Dart实现的Framework组成的跨平台技术框架。其中,Flutter Engine负责线程治理、Dart VM状态治理以及Dart代码加载等工作,而Dart代码所实现的Framework则负责下层业务开发,如Flutter提供的组件等概念就是Framework的领域。 随着Flutter的倒退,国内越来越多的App开始接入Flutter。为了升高危险,大部分App采纳渐进式形式引入Flutter,在App里选几个页面用Flutter来编写,但都碰到了雷同的问题,在原生页面和Flutter页面共存的状况下,如何治理路由,以及原生页面与Flutter页面之间的切换和通信都是混合开发中须要解决的问题。然而,官网没有提供明确的解决方案,只是在混合开发时,官网倡议开发者,应该应用同一个引擎反对多窗口绘制的能力,至多在逻辑上做到FlutterViewController是共享同一个引擎外面的资源。换句话说,官网心愿所有的绘制窗口共享同一个主Isolate,而不是呈现多个主Isolate的状况。不过,对于当初曾经呈现的多引擎模式问题,Flutter官网也没有提供好的解决方案。除了内存耗费重大外,多引擎模式还会带来如下一些问题。 冗余资源问题。多引擎模式下每个引擎的Isolate是互相独立的,尽管在逻辑上这并没有什么害处,然而每个引擎底层都保护了一套图片缓存等比拟耗费内存的对象,因而设施的内存耗费是十分重大的。插件注册问题。在Flutter插件中,消息传递须要依赖Messenger,而Messenger是由FlutterViewController去实现的。如果一个利用中同时存在多个FlutterViewController,那么插件的注册和通信将会变得凌乱且难以保护。Flutter组件和原生页面的差异化问题。通常,Flutter页面是由组件形成的,原生页面则是由ViewController或者Activity形成的。逻辑上来说,咱们心愿打消Flutter页面与原生页面的差别,否则在进行页面埋点和其它一些操作时减少一些额定的工作量。减少页面通信的复杂度。如果所有的Dart代码都运行在同一个引擎实例中,那么它们会共享同一个Isolate,能够用对立的框架实现组件之间的通信,然而如果存在多个引擎实例会让Isolate的治理变得更加简单。如果不解决多引擎问题,那么混合我的项目的导航栈如下图所示。目前,对于原生工程混编Flutter工程呈现的多引擎模式问题,国内次要有两种解决方案,一种是字节跳动的批改Flutter Engine源码计划,另一种是闲鱼开源的FlutterBoost。因为字节跳动的混合开发的计划没有开源,所以当初能应用的就剩下FlutterBoost计划。 FlutterBoost是闲鱼技术团队开发的一个可复用页面的插件,旨在把Flutter容器做成相似于浏览器的加载计划。为此,闲鱼技术团队为心愿FlutterBoost能实现如下的基本功能: 可复用的通用型混合开发计划。反对更加简单的混合模式,比方反对Tab切换的场景。无侵入性计划,应用时不再依赖批改Flutter的计划。反对对页面生命周期进行对立的治理。具备对立明确的设计概念。并且,最近Flutter Boost降级了3.0版本,并带来了如下的一些更新: 不侵入引擎,兼容Flutter的各种版本,Flutter sdk的降级不须要再降级FlutterBoost,极大升高降级老本。不辨别Androidx和Support分支。简化架构和接口,和FlutterBoost2.0比,代码缩小了一半。双端对立,包含接口和设计上的对立。反对关上Flutter页面,不再关上容器场景。页面生命周期变动告诉更不便业务应用。解决了2.0中的遗留问题,例如,Fragment接入艰难、页面敞开后不能传递数据、dispose不执行,内存占用过低等。二、Flutter Boost集成在原生我的项目中集成Flutter Boost只须要将Flutter Boost看成是一个插件工程即可。和其余Flutter插件的集成形式一样,应用FlutterBoost之前须要先增加依赖。应用Android Studio关上混合工程的Flutter工程,在pubspec.yaml中增加FlutterBoost依赖插件,如下所示。 flutter_boost: git: url: 'https://github.com/alibaba/flutter_boost.git' ref: 'v3.0-hotfixes'须要阐明的是,此处的所依赖的FlutterBoost的版本与Flutter的版本是对应的,如果不对应应用过程中会呈现版本不匹配的谬误。而后,应用flutter packages get命令将FlutterBoost插件拉取到本地。 2.1 Android集成应用Android Studio关上新建的原生Android工程,在原生Android工程的settings.gradle文件中增加如下代码。 setBinding(new Binding([gradle: this]))evaluate(new File( settingsDir.parentFile, 'flutter_library/.android/include_flutter.groovy'))而后,关上原生Android工程app目录下的build.gradle文件,持续增加如下依赖脚本。 dependencies { implementation project(':flutter_boost') implementation project(':flutter')}从新编译构建原生Android工程,如果没有任何谬误则阐明Android胜利了集成FlutterBoost。应用Flutter Boost 之前,须要先执行初始化。关上原生Android工程,新建一个继承FlutterApplication的Application,而后在onCreate()办法中初始化FlutterBoost,代码如下。 public class MyApplication extends FlutterApplication { @Override public void onCreate() { super.onCreate(); FlutterBoost.instance().setup(this, new FlutterBoostDelegate() { @Override public void pushNativeRoute(String pageName, HashMap<String, String> arguments) { Intent intent = new Intent(FlutterBoost.instance().currentActivity(), NativePageActivity.class); FlutterBoost.instance().currentActivity().startActivity(intent); } @Override public void pushFlutterRoute(String pageName, HashMap<String, String> arguments) { Intent intent = new FlutterBoostActivity.CachedEngineIntentBuilder(FlutterBoostActivity.class, FlutterBoost.ENGINE_ID) .backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.opaque) .destroyEngineWithActivity(false) .url(pageName) .urlParams(arguments) .build(FlutterBoost.instance().currentActivity()); FlutterBoost.instance().currentActivity().startActivity(intent); } },engine->{ engine.getPlugins(); } ); }}而后,关上原生Android工程下的AndroidManifest.xml文件,将Application替换成自定义的MyApplication,如下所示。 ...

April 1, 2021 · 4 min · jiezi

关于RTC:一文带你系统了解音频质量评价体系那些事

前言 近年来,线上音视频的产品状态和利用场景越来越丰盛,疫情更减速了许多行业线下转线上的布局,音视频技术也越来越受到各大厂的器重,Zoom 的股价飞升,腾讯、字节、阿里等等巨头的鼎力投入,令这个赛道的竞争越发强烈。在这个强烈的竞争环境下,所有的赛道玩家都很分明,好的音视频体验,将是决定产品胜利与否的最重要因素之一。在本篇内容中咱们将次要围绕音频品质评估的一些重要规范,来讲讲不同评估体系里的规范、内容、互相关联和一些个人见解。 在介绍各种评估规范和算法之前,有一个组织必须要重点介绍,ITU (International TelecommunicationUnion) 国际电信联盟简称国际电联,ITU 是主管信息通信技术事务的联合国机构,旗下有一个专门制订电信规范的分支机构 ITU-T(ITU Telecommunication Standardization Sector of ITU)。 01 主观音频品质评估规范:MOS in ITU-T P.800说起音频品质的评估,它并不是当初才呈现的。早在电话创造之后,如何系统地评估语音品质就成了一个难题。ITU-T 作为通信畛域制订规范的权威机构,当然不会坐视不管,于是在 1996 年 8 月 30 日,正式推出了 P.800: Methods for subjective determination of transmission quality 规范。在这个规范外面有一个重要的指标被提出来,那就是明天被沿用最为宽泛的主观评估规范 MOS(Mean Opinion Score)。 有些人可能感觉这个规范好简略,不就是 1-5 分的打分么?可是事实上并不是,主观的品质评估要想成为可重复使用的评估规范是很难的。不同环境、情绪、常识储备、职业、听力范畴及灵敏度等等背景的人都可能会对同一个声音给予不同的评分,甚至一个人在不同工夫和背景下对于同一段语音品质,也会给予不同的主观评分。所以光有一个 MOS 评分是远远不够的,在规范外面还举荐了多种可行的测试计划,比方在 Listening-opinion tests 测试计划中给出了"Absolute Category Rating" (ACR) 。外面规定用短分组的不相干的句子测试,并且这些句子是通过一系列规范测试验证过的,而后在雷同的测试计划下,雷同的物理条件和传输零碎下,来比照测试的后果。这样测试计划就具备较高水平的后果一致性。而这里说的物理条件蕴含十分的粗疏,例如测试线材、噪声(底噪;环境噪声)、噪声测量的地位。其中环境噪声还分为(房间噪声、车内噪声等)。除此以外对噪声测量的地位、创立连贯、监听、仪器设备设计、对话工作等等都有一些倡议。 说白了,这个规范事无巨细地列举了所有可能对主观评分一致性产生影响的因素,用很多不相干意义的短句组,在实验室能够管制的物理条件下,让很多被测试人员在雷同环境下做比照测试,再做均匀。这样的测试能力达到一致性规范,同时也具备了可行性。 但同时咱们也发现,组织这样的一场测试耗时耗力,切实是不适宜疾速的品质验证。尽管如此,它对于明天仍然十分有意义,比方当初很多产品在通话完结后给用户的品质反馈打分,1 星到 5 星,尽管不能管制在雷同的物理条件下,然而大量的用户主观评分概率分布仍然能够绝对主观地评估产品的主观品质。 最初,主观音频品质评估规范除了给出 MOS 这个有意义的评分标准,还给出了两个规范 MOSle 和 MOSlp,也十分有参考意义。 -MOSle- -MOSlp- 02 主观有参考音频品质评估规范:PESQ in P.862 & POLQA in P.863主观评估体系建设后,因为其实现起来的高老本和低效率,并不适宜企业疾速验证零碎的音频品质,所以主观规范的需要日益扩充。这个时候须要一个能够近似人类听觉体验的主观评估体系,并且能做到尽量稳固。 ...

April 1, 2021 · 2 min · jiezi

关于android:多出-20-倍Android-收集的用户数据量远超-iPhone谷歌官方对测试结果提出质疑

手机会收集用户数据这件事件,大家或多或少都有所理解,无论 iOS 还是 Android 都会继续传送数据至后端服务器。 随着用户隐衷安全意识的沉睡,近年来,谷歌、苹果在手机操作系统方面都在鼎力推广隐衷政策,大谈爱护用户隐私权。但操作系统厂商们也只是不同水平的,管制了对于数据的收集范畴。 近日,爱尔兰都柏林圣三一大学(Trinity College Dublin)的计算机科学传授进行了一项钻研,发现 Android 手机收集的用户数据是同类 iPhone 的 20 倍。 专家测试:Android 手机收集用户数据量是 iPhone 的 20 倍据圣三一大学研究员兼学院计算机系统主席道格·莱思(Doug Leith)称,iOS 和 Android 手机从将 SIM 卡插入智能手机开始,便一直收集数据并将其别离发送回苹果和谷歌。 测试的手机是运行 Android 10 零碎的 Google Pixel 2 手机,以及一台运行 iOS 13.6.1 的未知型号 iPhone,不过为了监督网络连接,iPhone曾经越狱。测试条件是在手机复原出厂设置后进行测试,首次启动,在手机处于闲暇状态时插入或卸下 SIM 卡,查看设置,启用或禁用地位,以及用户登录到自带利用商店时首次收集的数据。 莱思传授称,就算手机处于闲暇状态时,Android 设施每 12 小时也会发送 1MB 的数据,而 iOS 设施则为 52KB。 而用户应用数据方面就更加离谱了,无论是 iOS 设施还是Android设施,都会从用户设施上收集大量数据,iOS 设施为 5.8GB、Android 设施为 13GB。通过测试,莱思发现 iOS 共享IMEI,硬件序列号,SIM序列号,电话号码,设施ID(包含UDID和广告ID),地位,遥测,Cookie,本地IP地址和左近的Wi-Fi Mac地址无关的信息。 Android发送相似的数据,增加设施的Wi-Fi MAC地址,但不蕴含手机的地位信息,本地IP地址和左近的Wi-Fi Mac地址。 收集的数据不只是来自于 Android、iOS 操作系统自身,也蕴含手机内置的 App 利用,例如 iOS 会从 Siri 语音助手、Safari 浏览器、iCloud 等服务获取数据,Google 则有 Chrome、Messenger、时钟等等。 ...

March 31, 2021 · 1 min · jiezi

关于开源:开源iOS段子类app相乐搞笑分享风趣幽默的段子视频图片

相乐搞笑(xiangle-ios)这个我的项目原本是用来守业的,但上架App Store几个月,下载量寥寥无几,可能方向不对,可能不懂经营... 现分享进去,看有没有须要的敌人 我的项目介绍布局采纳纯代码的形式(frame+masonry),没有storyboard主框架: 自定义UITabBarController+UIScrollView+自定义UINavigationController网络申请: AFNetworking图片加载: SDWebImage列表加载: UITableView文件存储: OSS(sts形式)指示器(HUD): SVProgressHUD下拉刷新,上拉加载: MJRefreshjson转模型: MJExtension主动布局: Masonrytoken存储: NSUserDefaults包管理工具: CocoaPods目录构造Controller:控制器,外面针对不同模块建设对应子目录Model:所有接口的modelView:cell,自定义view等,外面针对不同模块建设对应子目录Bean:相似Java beanExpand:扩大Util:工具类介绍分享有趣风趣的段子/视频/图片 首页:视频/图片/文字 任你抉择详情:珍藏/评论/点赞 雁过留声发现:搜寻/话题/流动 包罗万象我的:珍藏/评论/点赞 一个不少 截图 疾速开始1.在我的项目根目录执行 pod install 2.应用Xcode 12.4关上xiangle.xcworkspace文件 获取最新代码github:https://github.com/chudaozhe/xiangle-iosgitee:https://gitee.com/chudaozhe/xiangle-ios

March 30, 2021 · 1 min · jiezi

关于ios:iOS开发自定义融云选取位置页面和位置信息页面的导航栏

【iOS开发】自定义融云选取地位页面和地位信息页面的导航栏选取地位页面创立 RCLocationPickerViewController 的子类:RCDLocationViewController,能够实现自定义导航栏左右按钮- (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"自定义左按钮" style:UIBarButtonItemStyleDone target:self action:@selector(leftItemDidPressed:)]; self.navigationItem.leftBarButtonItem.tintColor = [UIColor redColor]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"自定义右按钮" style:UIBarButtonItemStyleDone target:self action:@selector(rightItemDidPressed:)]; self.navigationController.navigationBar.barTintColor = [UIColor blueColor];}- (void)leftItemDidPressed:(id)sendr { [self dismissViewControllerAnimated:YES completion:nil];}- (void)rightItemDidPressed:(id)sendr { [super rightBarButtonItemPressed:nil];}在聊天页子类重写以下办法,并设置代理,present 到子类的对象中。/*! 扩大性能板的点击回调 @param pluginBoardView 输出扩大性能板View @param tag 输出扩大性能(Item)的惟一标示 */- (void)pluginBoardView:(RCPluginBoardView *)pluginBoardView clickedItemWithTag:(NSInteger)tag { switch (tag) { case PLUGIN_BOARD_ITEM_LOCATION_TAG: { RCDLocationViewController *vc = [[RCDLocationViewController alloc] init]; vc.delegate = self; UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:vc]; [self presentViewController:navi animated:YES completion:nil]; } break; default: [super pluginBoardView:pluginBoardView clickedItemWithTag:tag]; break; }}聊天页子类须要遵循代理 RCLocationPickerViewControllerDelegate,并实现办法:/*! 地理位置抉择实现之后的回调 @param locationPicker 地理位置选取的ViewController @param location 地位的二维坐标 @param locationName 地位的名称 @param mapScreenShot 地位在地图中的缩略图 @discussion 如果您须要重写地理位置抉择的界面,当抉择地理位置实现后,须要调用此回调告诉RCConversationViewController定位已实现,能够进一步生成地位音讯并发送。 */- (void)locationPicker:(RCLocationPickerViewController *)locationPicker didSelectLocation:(CLLocationCoordinate2D)location locationName:(NSString *)locationName mapScreenShot:(UIImage *)mapScreenShot { RCLocationMessage *locationMessage = [RCLocationMessage messageWithLocationImage:mapScreenShot location:location locationName:locationName]; [self sendMessage:locationMessage pushContent:nil];}地位信息页面创立 RCLocationViewController 的子类LocationViewController- (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"自定义左按钮" style:UIBarButtonItemStyleDone target:self action:@selector(leftItemDidPressed:)]; self.navigationItem.leftBarButtonItem.tintColor = [UIColor redColor]; self.navigationController.navigationBar.barTintColor = [UIColor blueColor];}- (void)leftItemDidPressed:(id)sendr { [self dismissViewControllerAnimated:YES completion:nil];}在会话页面重写点击地位音讯的回调/** * 关上地理位置。开发者能够重写,本人依据经纬度关上地图显示地位。默认应用内置地图 * * @param locationMessageContent 地位音讯 */- (void)presentLocationViewController:(RCLocationMessage *)locationMessageContent { // LocationViewController为 RCLocationViewController 的子类 LocationViewController *locationViewController = [[LocationViewController alloc] init]; locationViewController.locationName = locationMessageContent.locationName; locationViewController.location = locationMessageContent.location; locationViewController.modalPresentationStyle = UIModalPresentationFullScreen; UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:locationViewController]; navc.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:navc animated:YES completion:NULL];}

March 30, 2021 · 1 min · jiezi

关于ios:iOS开发如何使用融云的消息扩展

【iOS开发】如何应用融云的音讯扩大从 【4.0.3 】版本开始,融云新增了音讯扩大性能,文档如下:https://docs.rongcloud.cn/v4/... 总结文档中的几个重点: 4.0.3之前的版本无奈应用。音讯扩大是RCMessage类的属性,也就是说自定义音讯也能够应用。单条音讯只能设置300个kv,(某些场景不可用,比方在群里发400集体可领的红包)。仅反对单聊、群聊。key和value都是字符串类型,并且key不能是中文,否则会报错INVALID_PARAMETER。用IMKit的UI发送音讯时须要拦挡一下,设置音讯扩大开关。应用步骤:音讯的发送端必须给须要音讯扩大的音讯开开关,没有全局设置,只能单条音讯设置。分以下两种状况:如果应用的是IMKit提供的UI发送音讯,或者应用RCConversationViewController中的sendMessage和sendMediaMessage办法发送音讯,都会触发上面回调:/*! 筹备发送音讯的回调 @param messageContent 音讯内容 @return 批改后的音讯内容 @discussion 此回调在音讯筹备向外发送时会回调,您能够在此回调中对音讯内容进行过滤和批改等操作。 如果此回调的返回值不为nil,SDK会对外发送返回的音讯内容。 */- (RCMessageContent *)willSendMessage:(RCMessageContent *)messageContent;在回调中判断如果是须要扩大的音讯,就依据messageContent,本人结构一个RCMessage对象,并设置好canIncludeExpansion和expansionDic。 RCMessage *message = [[RCMessage alloc] initWithType:self.conversationType targetId:self.targetId direction:MessageDirection_SEND messageId:0 content:messageContent];message.canIncludeExpansion = YES;message.expansionDic = dict;再调用RCIM中对应的send办法将音讯发送进来,并且在筹备发送音讯的回调中return nil。 如果是本人调用RCIM和RCIMClient接口发的音讯,用RCMessageContent类的对象结构一个RCMessage对象,而后设置canIncludeExpansion和expansionDic再调用RCIM中对应的send办法将音讯发送进来即可。更新和删除扩大的操作能够参考官网文档。想要实时捕捉音讯扩大的更改和删除,就须要设置回调,在回调中更新UI。设置回调可参考官网文档。

March 30, 2021 · 1 min · jiezi

关于ios:iOS开发融云会话页面去掉电话号码邮箱链接的样式和点击事件

【iOS开发】融云会话页面去掉电话号码、邮箱、链接的款式和点击事件增加 RCAttributedDataSource 协定,设置attributeDataSource。重置attributeDictionary。重写点击回调。// 去掉手机号、邮箱、超链接 高亮+点击事件- (void)willDisplayMessageCell:(RCMessageBaseCell *)cell atIndexPath:(NSIndexPath *)indexPath { if ([cell isKindOfClass:[RCTextMessageCell class]]) { RCTextMessageCell *txtCell = (RCTextMessageCell*)cell; txtCell.textLabel.attributeDictionary = nil; txtCell.textLabel.attributeDataSource = self; }}- (NSDictionary *)attributeDictionaryForTextType:(NSTextCheckingTypes)textType { return nil;}/*! 点击Cell中电话号码的回调 @param phoneNumber 点击的电话号码 @param model 音讯Cell的数据模型 */-(void)didTapPhoneNumberInMessageCell:(NSString *)phoneNumber model:(RCMessageModel *)model {}/*! 点击Cell中URL的回调 @param url 点击的URL @param model 音讯Cell的数据模型*/- (void)didTapUrlInMessageCell:(NSString *)url model:(RCMessageModel *)model {}

March 30, 2021 · 1 min · jiezi

关于ios:融云升级到到50报错

融云降级到到5.0报错应用 pod ,从4.x版本升级到 5.x,写法和报错如下写法: [RCIM sharedRCIM].enableBurnMessage = YES;报错:Property 'enableBurnMessage' not found on object of type 'RCIM *'解决:把代码改成 RCKitConfigCenter.message.enableDestructMessage = YES; 因为 SDK 把接口从 RCIM 类移到了 RCKitMessageConf 中解决完上述属性报错后,呈现了以下报错:报错:Apple Mach-O Linker Error ld: library not found for -lopencore-amrnbclang: error: linker command failed with exit code 1 (use -v to see invocation)解决:TARGETS - Build Settings - Other Linker Flags 里去掉 -l"opencore-amrnb" 解决完上述报错后,又呈现了以下报错:报错:Apple Mach-O Linker Error ld: library not found for -lopencore-amrwbclang: error: linker command failed with exit code 1 (use -v to see invocation)解决:TARGETS - Build Settings - Other Linker Flags 里去掉 -l"opencore-amrwb" ...

March 30, 2021 · 1 min · jiezi

关于ios:融云集成错误码汇总

融星散成错误码汇总最近集成了融云 IM SDK,过程中遇到了错误码,这时须要去 SDK 头文件找到对应的错误码查看起因。下列给大家整顿了一下,心愿能够帮到大家,如果还有疑难,能够分割融云的技术:30007 : 导航 HTTP 申请失败。倡议:更换网络环境,如无奈解决,分割服务端排查(尤其是公有云)' : 31002 : AppKey 谬误。请查看您应用的 AppKey 是否正确 30010 : 创立 Socket 连贯失败。倡议:个别是网络不好,需更换网络试一下。 31004 : Token 有效。倡议:一是 token 谬误,请您查看客户端初始化应用的 AppKey 和您服务器获取 token 应用的 AppKey 是否统一;二是 token 过期,是因为您在开发者后盾设置了 token 过期工夫,您须要申请您的服务器从新获取 token 并再次用新的 token 建设连贯 31005 : AppKey 与 Token 不匹配。倡议:请查看您应用的 AppKey 与 Token 是否正确,是否匹配。个别有以下三种起因。一是 token 谬误,请您查看客户端初始化应用的 AppKey 和您服务器获取 token 应用的 AppKey 是否统一;二是 token 过期,是因为您在开发者后盾设置了 token 过期工夫,您须要申请您的服务器从新获取 token 并再次用新的 token。三是 App 校验未通过,是因为您在开发者后盾设置了 App 校验建设连贯。 ...

March 30, 2021 · 2 min · jiezi

关于ios:教你轻松构建一个可以泡妞的-app

教你轻松构建一个能够泡妞的 app 此篇文章是比拟高级的,次要是指导性内容,不波及技术。适宜非挪动端开发人员,公司拍板的老总,有守业幻想的人士。如果你想做个能泡妞的 app 然而不知如何着手,这边文章对你应该很有帮忙。 1.找一个第三方 IM 通信平台,集成他家的 SDK(省时省力省心省钱)。我教你找的办法,百度搜寻:“即时通讯” 这四个字就行,会呈现一堆搜寻后果。也有很多品牌做广告。倡议还是看前几个品牌吧,起码广告能力和 SEO 引擎优化能力不错 2.。搜寻进去的后果根本都是这云那云的,能够点击进去理解一下价格,手机下载他家的产品,体验一下 demo,看看聊天界面怎么样,音讯达到快还是慢。依据本人的爱好和了解,抉择一家即可 3.接下来须要从他家官网找到文档,比方 iOS 平台的文档。应该会有 pod 集成或者手动集成的形式。第一步就是集成 SDK 到工程中 4.而后注册他家的账号,增加利用,获取 appkey 、用户 token 一类的信息(各个平台可能有差别,需以具体为准)。这些信息是用来连贯他家服务器的。连贯胜利后,本人结构个按钮作为聊天入口,点击事件设置成发送音讯给某人,比方登陆的是 A 用户,发消息给 B 用户。另一台设施也得跑,登陆 B 用户,给 A 用户发消息。同时都须要一个会话列表,在接管音讯的时候展现进去会话。 5.能够聊天的 app 就这样搞定了。剩下的好友列表一类的用户信息就须要从本人服务器申请了。缓缓打磨吧 目前市面上 IM 即时通讯 SDK 比拟成熟的还是有几家的,竞争也绝对比拟强烈。体验了几家,感觉从技术支持服务角度来讲,融云还是能够的。前阵子公司我的项目对接了融云,建了交换群,有问题往里抛就行,会有对应平台的技术解疑答惑。集体认为处理速度还是很及时的,可能是守业公司起因,服务这块没的说。

March 30, 2021 · 1 min · jiezi

关于ios:只需-2-步定位集成融云时的崩溃与错误-iOS-篇

只需 2 步,定位集成融云时的解体与谬误 - iOS 篇在集成融云 iOS SDK 时候,多多少少都会遇到一些问题,可能是解体,也可能是性能接口谬误回调,对于刚接触 SDK 的开发者,不免大刀阔斧,上面分享一个疾速定位问题的办法,只需 2 步哟~ 办法的中心思想就是“疾速拿到 log,通过剖析 log 定位问题“步骤 1: 增加上面代码,将 log 写入沙盒 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //重定向 log 到本地问题 //在 info.plist 中关上 Application supports iTunes file sharing if (![[[UIDevice currentDevice] model] isEqualToString:@"iPhone Simulator"]) { [self redirectNSlogToDocumentFolder]; } //设置Log级别,开发阶段打印具体log [RCIMClient sharedRCIMClient].logLevel = RC_Log_Level_Info;}- (void)redirectNSlogToDocumentFolder { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; NSDate *currentDate = [NSDate date]; NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; [dateformatter setDateFormat:@"MMddHHmmss"]; NSString *formattedDate = [dateformatter stringFromDate:currentDate]; NSString *fileName = [NSString stringWithFormat:@"rc%@.log", formattedDate]; NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName]; freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout); freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);}步骤 2: 退出第 1 步代码后运行我的项目,复现问题后,从”沙盒/Documents“门路下导出 rc 结尾的 log 文件,应用文本编辑工具关上该文件。 ...

March 30, 2021 · 1 min · jiezi

关于ios:升级融云-40-及以上版本的兼容方案

降级融云 4.0 及以上版本的兼容计划 从 2.10.6 版本升级到 4.0 版本时候,遇到了一些坑,也从中总结了些教训,心愿对看到这篇文章的人有帮忙。 降级 SDK 和,会报错的办法根本只有一个,就是 connectWithToken 这个连贯办法,因为 4.0 及以上版本中此办法的回调模式扭转了,所以须要“删除连贯接口 token 非法的回调,并将该回调中的解决逻辑,挪动至 error 回调中” 示例代码: 以下代码以 IMKit 为例,IMLib 批改对应的外围类即可。 iOS 端 [[RCIM sharedRCIM] connectWithToken:token dbOpened:^(RCDBErrorCode code) { //如果音讯数据库关上,能够进入到主页面 } success:^(NSString *userId) { //连贯胜利 } error:^(RCConnectErrorCode status) { if (status == RC_CONN_TOKEN_INCORRECT) { //将旧版本 token 非法的回调解决代码写到这里 //从 APP 服务获取新 token,并重连 } else { //无奈连贯 im 服务器,请依据相应的错误码作出对应解决 } }];Android 端 RongIM.connect(token, new RongIMClient.ConnectCallback() { @Override public void onDatabaseOpened(RongIMClient.DatabaseOpenStatus code) { //如果音讯数据库关上,能够进入到主页面 } @Override public void onSuccess(String s) { //连贯胜利 } @Override public void onError(RongIMClient.ErrorCode e) { if(e.equals(RongIMClient.ErrorCode.RC_CONN_USER_OR_PASSWD_ERROR)) { //将旧版本 token 非法的回调解决代码写到这里 //从 APP 服务获取新 token,并重连 }else { //无奈连贯 im 服务器,请依据相应的错误码作出对应解决 } }});留神 ...

March 30, 2021 · 1 min · jiezi

关于ios:GCD-定时器

Swiftvar timer : DispatchSourceTimer?func startTimer() { var timeCount = 10 // 在global线程里创立一个工夫源 if timer == nil { timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global()) } // 设定这个工夫源是每秒循环一次,立刻开始 timer?.schedule(deadline: .now(), repeating: .seconds(1)) // 设定工夫源的触发事件 timer?.setEventHandler(handler: { //此时处于 global 线程中 print("定时器:",timeCount) // 每秒计时一次 timeCount = timeCount - 1 // 工夫到了勾销工夫源 if timeCount <= 0 { self.stopTimer() DispatchQueue.main.async { //UI操作放在主线程 } } }) // 启动工夫源 timer?.resume()}//进行定时器func stopTimer() { print("定时器完结") timer?.cancel() timer = nil}Objective-C@interface ViewController (){ dispatch_source_t _timer;}@end-(void)startTimer{ __block NSInteger timeCount = 10; dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0)); dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC); dispatch_source_set_event_handler(timer, ^{ NSLog(@"定时器:%li",(long)timeCount); timeCount --; if (timeCount <= 0) { [self stopTimer]; dispatch_async(dispatch_get_main_queue(), ^{ }); } }); dispatch_resume(timer); _timer = timer; }-(void)stopTimer{ dispatch_source_cancel(_timer); _timer = nil;}有两点须要留神:照此办法进行定时器,能够复用,应用suspend进行定时器无奈复用timer 要设置为全局对象。否则代码执行完后 timer 就被开释了;且不便在其余中央操作,如暂停、勾销、置空。

March 30, 2021 · 1 min · jiezi

关于ios:iOS审核被拒Guideline-231-Performance解决

被拒原文:We discovered that your app contains hidden features. Attempting to hide features, functionality or content in your app is considered egregious behavior and can lead to removal from the Apple Developer Program. Specifically, we found that your app includes AliPay (领取寶), which provides access to external payment mechanisms and enables the purchase of content, services, or functionality by means other than the in-app purchase API. Specifically, your app encourages users to watch ads or perform marketing-oriented tasks, which is not appropriate for the App Store. ...

March 29, 2021 · 2 min · jiezi

关于flutter:Flutter渲染之WidgetElementRenderObject

一、Flutter架构家喻户晓,Flutter是由Google推出的开源的高性能跨平台框架,一个2D渲染引擎。在Flutter中,Widget是Flutter用户界面的根本形成单元,能够说所有皆Widget。与Weex和RN框架应用的JsCore转化的中间层不同,Flutter采纳的是全新的架构计划,领有本人的渲染引擎和Dart下层,每一层都建设在前一层的根底之上,并且下层比上层的应用频率更高,其框架架构如下图所示。能够看到,自下而上,Flutter分为Embedder、Engine和Framework三层。其中,Embedder是操作系统适配层,次要负责Surface渲染设置,线程设置,以及平台插件等平台相干个性的适配;Engine层负责图形绘制、文字排版和提供Dart运行时,Engine层具备独立虚拟机,正是因为它的存在,Flutter程序能力运行在不同的平台上,实现跨平台运行;Framework层则是应用Dart编写的一套根底视图库,蕴含了动画、图形绘制和手势辨认等性能,是应用频率最高的一层。 Flutter Embedder:Embedder是Flutter的操作系统适配层,又称为嵌入层,通过该层能够把Flutter嵌入到各个不同的平台下来。Embedder的次要工作包含Surface渲染设置、线程设置、事件循环以及插件的平台适配等。Flutter Engine:纯 C++实现的 SDK,其中包含 Skia引擎、Dart运行时、文字排版引擎等。它是 Dart的一个运行时,它能够以 JIT 或者 AOT的模式运行 Dart代码。这个运行时还管制着 VSync信号的传递、GPU数据的填充等,并且还负责把客户端的事件传递到运行时中的代码。Flutter Framework:纯 Dart实现的 SDK,提供了一整套自底向上的根底库, 用于解决动画、绘图和手势。并且基于绘图封装了一套 UI组件库,而后依据 Material 和Cupertino两种视觉格调辨别开来。在平时利用开发中,与开发者打交道最多的就是这一层,并且最多的就是各种Widget。二、渲染流程不论是什么渲染框架,其根本的原理都是:个别以60Hz的固定频率刷新,每一帧图像绘制实现后,会持续绘制下一帧,而后显示器就会收回一个Vsync信号,按60Hz计算,屏幕每秒会收回60次这样的信号。CPU计算好显示内容提交给GPU,GPU渲染好交给显示器显示。 在Flutter中,渲染会用到很多的线程,次要是UI线程和GPU线程,下图是Flutter App线程的运作原理图。上面重点看一下UI线程和GPU线程。 UI Task RunnerUI Task Runner用于执行Root Isolate代码,它运行在线程对应平台的线程上,属于子线程。同时,Root isolate在引擎启动时会绑定不少Flutter须要的函数办法,这些绑定的函数能够提交渲染帧给Engine层执行渲染操作,下图演示了Widgets生成Layer Tree的过程。对于每一帧,引擎通过Root Isolate告诉Flutter Engine有帧须要渲染,平台收到Flutter Engine告诉后会创建对象和组件并生成一个Layer Tree,而后将生成的Layer Tree提交给Flutter Engine。此时,只生成了须要绘制的内容,并没有执行屏幕渲染,而Root Isolate就是负责将创立的Layer Tree绘制到屏幕上,因而如果线程过载会导致卡顿掉帧景象。 除了用于解决渲染之外,Root Isolate还须要解决来自Native Plugins的音讯响应、Timers、MicroTasks和异步IO。如果的确有无奈防止的沉重计算,倡议将这些耗时的操作放到独立的Isolate去执行,从而防止利用UI卡顿问题。 GPU Task RunnerGPU Task Runner用于执行设施GPU指令,UI Task Runner创立的Layer Tree是跨平台的。也就是说,Layer Tree提供了绘制所须要的信息,然而由谁来实现绘制它是不关怀的。 GPU Task Runner的次要责任就是负责将Layer Tree提供的信息转化为平台可执行的GPU指令,同时它也负责管理每一帧绘制所须要的GPU资源,包含平台Framebuffer的创立,Surface生命周期治理,以及Texture和Buffers的绘制机会等,下图GPU Task Runner的工作流程。 UI Runner和GPU Runner运行在不同的线程。GPU Runner会依据目前帧执行的进度去向UI Runner申请下一帧的数据,在工作沉重的时候还可能会呈现UI Runner的提早工作。不过这种调度机制的益处在于,确保GPU Runner不至于过载,同时也防止了UI Runner不必要的资源耗费。 GPU Runner能够导致UI Runner的帧调度的提早,GPU Runner的过载会导致Flutter利用的卡顿,因而在理论应用过程中,倡议为每一个Engine实例都新建一个专用的GPU Runner线程。 ...

March 28, 2021 · 2 min · jiezi

关于ios:苹果更新系统没有引入新功能官方却强烈建议立即更新

苹果上周五推出了iOS 14.4.2,iPadOS 14.4.2和watchOS 7.3.3,和以往更新不同,这次更新并没有引入任何新性能,但苹果公司却倡议所有用户立刻装置,起因竟是旧零碎中呈现了较为重大的安全漏洞。 Webkit 有Bug依据苹果公司的说法,这次更新对WebKit进行了重要的平安修复,WebKit是苹果开发的一个浏览器引擎,它次要为Safari网络浏览器提供能源,其余iOS网络浏览器也依赖于WebKit。 iOS 14中的WebKit某个谬误可能会让歹意制作的网页内容蒙受广泛的跨站脚本(XSS)攻打。艰深地讲,当网络犯罪分子利用网页破绽注入恶意代码后,能够动员XSS攻打,从而产生窃取敏感数据、刷用户凭证、争夺会话cookie等危险状况。 好在该威逼已通过最新的操作系统更新进行了修补,苹果公司说的解决办法是“改善了对象生命周期的治理”,当初该破绽被列在CVE-2021-1879中,并由Google威逼剖析小组的Clement Lecigne和Billy Leonard进行了具体阐明。 在阐明中它被形容为一种弱小的零日破绽,可影响多种Apple设施,包含iPhone 6s和更高版本,所有型号的iPad Pro,Apple Watch Series 3和更高版本,和基本上所有最新型号的iPhone,iPad,Apple手表和iPod Touch。 新产品信息被曝光尽管此次更新没有其余新性能,但眼尖的用户们还是发现了不少信息。 有用户发现新公布的 iOS 零碎上呈现了代号为「13G」的新芯片,依据苹果的芯片命名计划,这个代号「13G」的新芯片就是 A14X,此外,iOS14.5 Beta5 中还呈现了新款 iPad 的四个新代号:J517, J518, J522, 和 J523,这意味着,新款 iPad Pro 将会在近期推出。 mac电脑公布的零碎 macOS 11.3 Beta5 上,网友还发现了两款新 iMac 的代号:J456 和 J457,新产品的代码被放到了苹果的零碎中,意味着新 iMac 和新 iPad Pro 的公布曾经是板上钉钉的事了! 这次更新并不影响iOS 14.5的公布,苹果曾经公布了几个iOS 14.5的测试版,也就是说iOS 14.5中那些令人期待的新性能也会与咱们马上见面。 新性能包含: 1、在戴上面罩的状况下,也以用Apple Watch解锁iPhone。这意味着领有装备Face ID的iPhone机型的人将不用为理解锁手机而一直输出平安明码。 2、利用追踪通明性能,该性能将要求开发者在拜访利用相干数据以追踪用户或设施时,必须申请用户受权。 不过千万不要因为马上就要推出新零碎,而不去更新iOS 14.4.2,倡议任何具备潜在受影响设施的人都应尽快更新其软件。 CVE-2021-1879:https://cve.mitre.org/cgi-bin...

March 27, 2021 · 1 min · jiezi

关于ios:ios审核被拒43马甲包该如何上架

iOS审核4.3个别存在3种状况,能够依据被拒回复进行判断,如果你真的看不懂被拒回复,上面一一列举,逐个排除,歪斜字体是解决方案。 第一种:简称代码反复,代码重复使用也有三种状况1.可能你之前用这套源码上过一个包,当初用这套代码间接改一个logo跟名字再上一个马甲,这种根本会间接审核4.3这种状况用惟一的字符去代替, 尽量长一点。*第一步:工程中的文件夹的名字全副进行批改。第二步:每一个工程都有一个类前缀, 咱们须要取一个长一点的类前缀, 并且这个类前缀在你的整个工程肯定是一个惟一的字符串, 咱们假如这个类前缀是PayDayLoan, 当初在咱们须要生成一个控制器, 控制器的结尾Controller也须要用一个特定的字符去代替, 比方:Director,剩下的View以及object做法相似, 就不一一介绍了,做马甲的时候就是把这些名字用另一个第三步:把另一个其余的工程中的类全副导入进来, 次要是混同代码, 在现有的工程中调用, 能够没有任何成果, 只是单纯调用办法。况根本要改源码,***注:繁多的退出垃圾代码混同没用的!** 2.如果你的这套源码在一个账号上提交过,然而被拒了,起初因为其余起因你不得不在别的账号上从新提交此源码,在你什么都不批改的状况下第二个账号根本也会报审核4.3这种状况须要在第一个账号做一下解决, xcode新建一个利用, 间接用之前提交过的bundle Id打包,logo用一个纯白或者纯黑的图片, 将这个新建的利用提交到利用市场, 构建版本中将之前被拒的包移除, 用这个新的利用顶替之前被拒的包, app名字改成 “作废-此利用不再提交” 前面再轻易加一个数次, 因为这个名字他人曾经用过了, app形容跟app名字一样, 剩下的信息全副删除.最初点击保留即可.不须要提交审核。 3.你的源码只有提交到itunes connect外面,就算没提交审核,当你再次应用此源码提交审核的时候,根本都会报审核4.3,这种状况的解决方案参照2 第二种:界面性能类似这种状况简略的改源码曾经没用了,须要在原有的app上加一些不同的性能,我用借贷类举例说明该如何解决,其余类型的app能够参考以下举两个利用阐明, 别离用A利用与B利用代替, 你须要如何解决并且如何回复审核人员 *1.A利用 是给没有信用卡的用户应用的一款借款App,B利用 是给有信用卡的用户应用的一款借款App.2.A利用的最高借款额度是1000元, B利用 的最高借款额度是25000元.3.A利用的还款工夫是7天与14天, B利用 的还款工夫是28天. 4.A利用 外部有贷款计算器性能, B利用只是一个一般的贷款app, 并无其余性能5.两款app是咱们公司内不同的部门开发的app, 别离针对不同的用户人群.* 第三种:app名字被用过这一种,可能是最容易被疏忽的,取名字之前肯定要先搜寻app store有没有同名利用,尽量避免同名利用 第四种:被拒了最好换号重提以上3种状况如果都依照我说的办法解决了,如果在同一个账号提交还是被拒,那就须要换账号,集体倡议不要去买市面上800一个的那种,基本上秒考察,须要找真人纯手工注册的那种账号,量大的话找大学生批量注册也能够 本文自己首发www.zfjobslib.com。 【iOS代码混同工具】版本:ZFJObsLib 1.7.2

March 26, 2021 · 1 min · jiezi

关于ios:iOS审核之规避iOS审核43规则的重心

前言最近iOS审核有严格了,很多iOSer都被折磨的够呛,来来回回被拒好几次重大的一申述就被封号。上面我就说说收到iOS审核4.3之后咱们如何躲避的重点吧。 切断相关性切断以后马甲包与以往马甲包的所有相似性关联; 类似关联a. ipa包特色;    b. 开发者帐号;       c. 打包电脑;      d. 上传IP;      e. 资料类似; 分项细述1. ipa包特色:包含有代码相似性,资源相似性; 代码相似性解决办法:a. 已有代码的混同(改类名、改函数名、改属性名、垃圾代码、垃圾类等等)b. 增加一些无用的代码;注:代码混同能够应用ZFJObsLib 1.7.2 www#zfjobslib#com 资源相似性解决办法:a. 资源文件改名;b. 适当增加一些无用的资源;c.批改资源文件的HASH值; 翻新工程:a.批改工程名;b.批改工程目录构造; ##### 2. 开发者帐号:两个马甲包不要关联到同一个开发者帐号的信息;比方打包时关联。 3. 打包电脑:有条件的最好用不同的MAC来打包(每台MAC上最好打包马甲包不要超过5个) 4. 上传IP:上传马甲包时,IP不要跟其余马甲包的IP雷同; 5. 资料类似:itu后盾资料如宣传图,ICON,版权人不要呈现雷同;注:即便是前边没审核过的包,也不要跟他们有关联。尤其是前边被4.3回绝的包,更不能跟他们有相似性。 明天就先写到这里,下次咱们持续向西阐明如何应用iOS代码混同工具进行代码混同提包上架。 本文自己首发www.zfjobslib.com。 【iOS代码混同工具】版本:ZFJObsLib 1.7.2

March 25, 2021 · 1 min · jiezi

关于android:在线教育移动多端开发源码分享讲解app小程序

简介本我的项目的一个教育培训服务APP。提供在线浏览机构信息、名师风采和课程预约订购等性能。 我的项目前端应用了 avm.js 多端开发技术 ,可同时编译为 Android & iOS App 以及微信小程序; 后端应用 APICloud 数据云3.0 云函数自定义接口。 技术要点本我的项目在开发过程中,在“能拆就拆”的思维下,对我的项目进行细粒度的组件化拆解。 能够从中理解到组件拆分逻辑和一些操作技巧,对自定义组件进行坚固。 效果图![上传中...]() 源码目录构造介绍我的项目源码在github仓库的 widget 目录下。残缺源码请查看:https://github.com/apicloudco...其中该目录下的文件构造如下: ┌─component/ // 我的项目公共组件目录│ ├─img/ // 组件专用素材│ ├─a-card.stml // [根底组件]卡片组件│ ├─a-cell.stml // [根底组件]单元格组件│ ├─a-cell-group.stml // [根底组件]单元格容器组件│ ├─a-header.stml // [根底组件]头部导航组件│ ├─a-section.stml // [根底组件]章节组件│ ├─a-tab.stml // [根底组件]选项卡组件│ ├─a-tabs.stml // [根底组件]选项卡容器组件│ ├─b-course.stml // [业务组件]课程详情组件│ ├─b-notice.stml // [业务组件]揭示面板组件│ ├─c-course-list.stml // [组合组件]课程列表页├─images/ // 图片素材图标资源目录├─pages/ // 新版的AVM页面目录│ ├─course-detail/│ │ └─course-detail.stml // 课程详情页│ ├─course-list/│ │ └─course-list.stml // 课程列表页│ ├─course-pay/│ │ └─course-pay.stml // 购买课程页│ ├─course-preorder/│ │ └─course-preorder.stml // 预约课程页│ ├─order-detail/│ │ └─order-detail.stml // 用户订单详情页│ ├─order-list/│ │ └─order-list.stml // 用户订单列表页│ ├─pay-result/│ │ └─pay-result.stml // 下单(领取)后果页│ ├─play-video/│ │ └─play-video.stml // 视频播放页│ ├─preorder-detail/│ │ └─preorder-detail.stml // 用户预约详情页│ ├─preorder-list/│ │ └─preorder-list.stml // 用户预约列表页│ ├─tab-home/│ │ └─tab-home.stml // tab页-0 入口主页│ ├─tab-course/│ │ └─tab-course.stml // tab页-1 课程分类列表│ ├─tab-user/│ │ └─tab-user.stml // tab页-2 用户主页├─script/ // JavaScript脚本目录│ ├─UserManager.js // 用户数据管理类│ └─req.js // 我的项目申请交互文件└─config.xml // 利用配置文件开发详情TabBar 的组织如果有留意到 APICloud 官网的 github 上前几个模板我的项目源码的同学们曾经对 TabBar 的实现很相熟了。 ...

March 25, 2021 · 5 min · jiezi

关于ios:iOS性能优化的那些事

前言自己在这家公司曾经三年多了,这款三年多我始终在做的APP也烂熟于心,APP也0到1到目前的500万的用户量;对于APP的性能来说也是比拟全面的,用到的技术知识点也比拟多吧,APP的优化也是始终在做的事件,而且APP性能的优化也不是久而久之的事件,在此离别之际,我将具体阐明解说一下我在三年里对APP性能优化方面做过的一些事,大家仁者见仁智者见智,也欢送大家进群提供贵重的意见和倡议! 根底优化应用ARC,当初的iOS开发大家用的都是ARC,简直没有人再去应用MRC了,应用ARC的益处就是不必再时时刻刻留神要开释创立的对象了;防止应用xib或者storyboard。 这里说一下xib和sb的毛病吧,如下: 1.占用API包比拟大;2.导致APP启动工夫比拟耗时,因为在APP启动main()以前须要加载他们;3.加载速度比较慢;4.前期的版本更新迭代保护工夫老本比拟高;5.多人开发容易引起抵触。 列表图片优化列表不管在哪一个APP中是应用最为宽泛的一款控件了,在我的APP中也不例外,咱们的APP只有性能列表相似于微信的朋友圈,图片有0~9张的模式还能够是视频文件;先说一说图片吧,如果一个列表都是9张图片,列表在加载和滑动的时候会耗用过多的内存;我在这里是把图片这一块独自抽出来做一个图片资源的封装,而后依据创立的图片容器(UIImageView)的大小加载缩略图,咱们公司的APP存储用的是七牛云存储,所以在获取图片资源的时候,只须要设置对应的字段就能够拿到缩略图了,点击的查看大图的时候才查看原图; 再说说视频,视频的解决逻辑和图片差不多,这里在CELL上咱们应用一个UIImageView来代替视频播放器,能够去出视频的第一帧作为封面,点击图片的时候才调用咱们封装好的视频播放组件。 复用机制说道复用,咱们可能罕用的有CELL的复用,其实咱们也能够本人写咱们的服用,就比方上图中的列表,咱们个别采纳的思路就是在主控制器上增加一个UIScrollView,再依据有多少个小标题类型创立多少个子控制器,接着把子控制器增加到主控制器的childViewControllers中,最初把子控制器的视图增加到UIScrollView上,有没有更节俭内存空间的做法呢???当然有的,咱们能够只创立5个控制器而后丢到咱们的可重用数组中,依据每次滑动去加载不同的缓存数据;还比方我在直播间创立刷礼物的视图动画的时候,因为最多只能显示三条,那么我只会创立三个视图,当有大于三条的礼物信息过去的时候也只会创立三个视图,而后丢进我的可重用数组外面,每个视图动画实现当前才从新复制Model,如下图左下角的礼物动画最多三个,起码没有: 就如下面所说,在我的项目中咱们能够在很多中央创立属于咱们本人的重用机制! 离屏渲染在开发中,咱们罕用有圆角解决、暗影、遮罩等等;先说说圆角优化吧,咱们个别设置圆角的形式如下: view.layer.cornerRadius = 10;view.layer.masksToBounds = YES;这样解决的渲染机制是GPU在以后屏幕缓冲区外新开拓一个渲染缓冲区进行工作,也就是离屏渲染,这会给咱们带来额定的性能损耗,如果这样的圆角操作达到肯定数量,会触发缓冲区的频繁合并和上下文的的频繁切换,性能的代价会宏观地表当初用户体验上——掉帧。 优化计划:a.能够做一个通明的png图片盖在下面;b.应用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角;c.应用CAShapeLayer和UIBezierPath设置圆角;d.也能够将图片的解决放在服务端(比方:七牛云贮存就能够设置图片的圆角);e.尽量把view设置成不通明的。 阐明:离屏渲染还能够做很多货色,具体的能够自行查找! 懒加载这里的懒加载次要说的是懒加载思维,能够懒加载的类型有很多,当然益处有很多,最次要的是能够节俭内存资源; 重大开销对象咱们在APP应用过程中会用到很多重大开销对象(比方NSDateFormatter和 NSCalendar),如咱们在列表须要计算用户年龄的时候会常常用到NSDateFormatter,还有一些工夫的格式化输入,或者在网络申请的时候须要传一些工夫戳,所以咱们能够把NSDateFormatter放在单利外面,这样就不必常常创立了,其余的也是同样的情理。 还有就是,像年龄生日什么的最好不要由前端APP来计算,最好放在服务器上,由服务端计算好而后再传给咱们。 内存正告如果程序在运行过程中产生了内存正告(didReceiveMemoryWarning),咱们须要疾速应急解决一下,不要用不了多久APP就会被杀死掉,所在在收到内存正告次要思路就是想着去清理栈上的货色,当前咱们能够做以下几点: a.清理不须要的曾经创立的对象,不论是试图还是工具类; b.开释单利外面不须要的对象,比方上文进步过得重大开销对象; c.如果有正在下载的工作,勾销或者暂停全副工作; d.如果应用了SDWebImage,能够清理一下缓存clearMemory; 主线程晦涩不要阻塞主线程,要保障主线程的流程性;咱们不要把一些重大开销对象放到主线程外面,咱们能够创立子线程去解决这些事件;比方多个网络申请完结一起刷新UI、多个动画成果、数据的读写操作等等; 数据缓存做缓存这个事件,一方面减小内存的小号,还有很重要的一方面就是优化用户体验;能够做缓存的货色很多,咱们能够对数据接口进行缓存,还能够对WebView进行缓存,还有图片缓存、高度缓存等等; 在这里不得不说一下,数据存储了;咱们在做缓存的时候抉择正确适合的存储形式也很难重要,当然大家也能够依据我的项目的理论需要来抉择存储,咱们公司的APP本地存储我抉择的是SQLite,治理类是我基于FMDB的又一次封装. 网络API优化这个优化不单单需是前端小伙伴的事,还须要后端开发人员的配合,防止一些不必要数据的返回,更要防止在APP端解决或者计算太多货色,比方年龄、星座的计算;即便后端的小伙伴把一些不必要的数据返回了,咱们在创立数据模型Model的时候能够抉择不去接管! PS:这里我须要吐槽一下,以前公司有个java后端,返回的数据全副是一个表的实体类,管你有用没用,间接一股脑的全给你,本人去计算和本人去查找,那真叫一个心累啊,所以一个优良的API开发工程师也是一个十分重要的起因! 主动开释池主动开释池(autoreleasepool)在MRC的时代真是用的十分多,然而当初的我的项目都是ARC,主动开释池用的也就比拟少了,因为有零碎帮咱们监管,然而如果咱们一个页面创立了太多的类或者对象,如果等页面销毁的时候由零碎对立开释难免会呈现一个峰值影响整体性能,这时候咱们就能够思考应用autoreleasepool了,防止峰值的呈现!? 还比方咱们在遍历一些大数组或者字典的时候,能够应用主动开释池来升高内存峰值,比方: NSArray *bigArray = @[] //这是一个很大很大的数组NSMutableArray *newArray = [[NSMutableArray alloc] init];for (NSStirng *item in bigArray) {    @autoreleasepool { ZFJModel *model = [[ZFJModel alloc] init]; model.item = item;        [newArray addObject: model];    }}APP启动优化在AppDelegate外面咱们会写一些很多货色,你写的货色越多越影响APP的冷启动工夫就会越长,因而咱们须要对AppDelegate进行减负,具体如何减负大家能够依据各自我的项目的理论状况,第一能够删除一些不是必须的货色;第二能够把一些货色写在别的中央(如RootViewController),我在APP的RootViewController写的货色比方IM聊天的配置初始化登录,一些未解决的工作,还有一些版本的保持和缓存的清理等等! InstrumentsInstruments 是什么我这里就不作过多的介绍了,这里我次要说我用Instruments干什么;我平时用Instruments次要干两件事,一件事是查看内存透露,还有一件事是查看耗时函数;对于内存透露咱们对应批改补漏就行了,对于耗时函数要么就换一种写法,要么就创立一个子线程来解决! ?这里要说一个我的习惯,我的所有的控制器都继承于BaseViewController,而后我再BaseViewController外面写了以下的一部分代码: (void)dealloc{NSLog(@"=== %@ dealloced! ===", NSStringFromClass([self class]));}如果我的页面销毁不走dealloc的打印,那么页面必定有没有被开释的对象,要么是产生循环援用了,要么是须要手动开释,具体打印以下对象的援用计数! 本文自己首发www.zfjobslib.com。 【iOS代码混同工具】版本:ZFJObsLib 1.7.2

March 24, 2021 · 1 min · jiezi

关于ios:苹果审核的这些坑我踩过现在写出来让你避坑

苹果审核始终是APP上架时要面对的一座大山,很多iOSer同样也有过这么一段苦楚的经验。 在App上架苹果利用商店的过程中,置信大多数iOSer往往都有过这样的经验:辛苦开发进去的产品,测试验收也通过了,满怀期待的提交App给苹果审核,后果常常被苹果各种理由拒之门外,苦不堪言。 苹果为了给开发者和用户发明一个良性、偏心、衰弱、平安的利用商店环境,同时也为保障苹果本身利益,因而制订了一系列的利用商店条款《App Store Review Guidelines》,所有开发者必须遵循这些条款,能力取得App上架的资格。不可否认,App审核在肯定水平上保障了利用商店中的App品质,然而iOS提审对泛滥开发者来说,往往会有谈虎色变的感觉! 的确如此,很多手游同样也有过这么一段苦楚的经验,早在2015年之前,苹果审核始终是手游上架时要面对的一座大山,无论是首个版本还是更新版本的提审,都是一段忐忑甚至是悲壮的旅程,经常性被拒,无比煎熬。 大家都晓得,过来苹果响应App提审(提交实现从正在期待审核“Waiting for Review”变成正在审核 “In Review”,如下图)等待时间是十分漫长的,少则几天,多则十几天,审核被拒就意味着手游版本要整改、测试验收和从新提审排队,将大大缩短版本过审工夫,从而影响了上架的节奏和经营流动的打算,甚至是手游的流水! 为了进步手游产品的苹果审核通过率,公司成立了苹果审核的测试团队,将苹果审核条款以及各种被拒理由整顿成可测试的验收条目,并对验收项进行可自动化剖析,开发出ipa包、图片/视频、利用形容等自动化扫描工具,力求高效地裸露App的提审危险,全面保障App的提审通过率。通过近2年的运行,iOS审核通过率从最早的均匀35%晋升到目前的90%+,本篇文章将会与大家分享预审我的项目的一些实在案例。 iOS提审需面对的压力上节咱们曾经大略理解了开发者们在提审过程中遇到的重大阻力,为什么过审会是如此的艰巨?不外乎如此: 1. 更粗疏、更刻薄的审核条款2016年6月,苹果在官网更新了审核条款《App Store Review Guidelines》,通篇6000多英文单词,分5大章节,一共100+条款,波及平安、业务、性能、设计和法律畛域,让人目迷五色,开发者们如没有零碎的、全面的把控,稍有不慎便会触犯其中条款,一旦触犯便有可能被拒。 2. 苹果半自动半人工的审核机制苹果审核是采纳半自动半人工的审核形式,不同审核人员对条款了解水平和执法力度往往会因人而异,所以时常会呈现开发者们遇到的如下状况:上次提审通过,但下一版本更新时便被拒了,审核人员呈现脱漏或者审核人员产生了变更。总之,不同时间段,审核后果可能会不一样,这些人为因素造成的后果,对开发者来说,容易产生困扰和不解。 3. APP数量激增,审核工作微小,审核人力不足据苹果官网统计,利用商店App的数量以后曾经有200万+,均匀每周有上万款新App上线,5万+款App更新(每个App存在反复审核的可能)。对于苹果审核团队来说,要解决如此微小的审核工作(具体数据,笔者无从考据),难免会呈现精力有余, App性能的拜访门路略微深一点、实现逻辑略微简单一点,文字描述略微有含混,便有可能会被回绝。有开发者曾吐槽过,提交的一款娱乐类利用,被拒的起因是:苹果感觉利用并不具备娱乐性,让人举手无措! 咱们产品踩到的坑每个App上架苹果利用商店时,须要提交给苹果进行审核的内容,基本上能够归类为以下几方面: 1. App信息App信息(名称/副标题、类型等)评级信息(年龄、暴力、赌博、色情等内容水平)定价相干内购信息(IAP配置)审核信息(体验账号) 2. ipa包(ipa规格属性、App内容)ipa包规格属性(查看项很多,篇幅受限,不一一列举了):公有API和Non-public API的调用64位反对Info.plist键值的设置第三方违规SDK的应用Icon资源….. App内容:(查看项很多,篇幅受限,不一一列举了)违规字样:测试字样、苹果产品英文拼写错误、色情/暴力/诋毁舆论等抽奖流动内容IAP充值性能QQ会员专属福利未凋谢的性能占位符…… 3. 宣传素材(预览图片、视频、Large App Icon)图片图片内容图片规格属性 视频视频内容视频规格属性 Large App IconIcon内容Icon规格属性 4. 元数据(利用形容等)苹果审核也是围绕以上四方面来发展的,如果提审App呈现被拒,无非就是如上某些内容不满足苹果要求导致。接下来一起看看腾讯手游过去所踩过的一些坑吧 4.1 App信息被拒的案例【案例1】游戏A的副标题蕴含显著关键词和宣传流动形容:【案例2】游戏B提交的IAP档位,审核人员无奈在游戏内找到对应的档位:【案例3】游戏C提交的体验账号,明码谬误,审核人员无奈通过该账号体验游戏: 4.2 ipa被拒的案例【案例4】游戏D因存在调用公有API或non-public API导致被拒:【案例5】游戏E因应用违规的第三方SDK导致被拒:【案例6】游戏F因应用后盾服务(地位)但未在info.plist进行申明,导致被拒:【案例7】游戏G弹出的布告中,呈现测试、删档等字眼(苹果认为是测试版本)导致被拒:【案例8】游戏H弹出的布告中,呈现谬误的苹果产品的英文拼写”IOS“(正确的格局:iOS),导致被拒:【案例9】游戏I,IAP领取性能异样,导致被拒。 4.3 宣传素材被拒的案例【案例10】游戏J,提交的图片/视频中有“萝莉”“御姐”等低俗词语,导致被拒。【案例11】游戏K,提交的图片/视频不能体现游戏实在内容(只显示了游戏角色,不能反馈游戏实在场景),导致被拒。【案例12】游戏L,提交的图片/视频内容是在安卓机上截取的,导致被拒。 通过下面的被拒案例,大抵能够感触到,提审被拒的起因是形形色色的,稍有不慎便会被拒,对过往一段时间的提审数据,进行归类,详情如下:当初咱们本人写了个iOS代码混同工具,每次上架前都混同下源码,上包通过率目前达到了85% 本文自己首发www.zfjobslib.com。 【iOS代码混同工具】版本:ZFJObsLib 1.7.2

March 24, 2021 · 1 min · jiezi

关于ios:2021出海社交必看产品技术运营指南

社交产品出海淘金还有机会吗?我能够怎么从0到1搭建一款产品? 我做出海泛娱乐一年了,感觉曾经没什么增长空间了,有什么新技术、新玩法吗?怎么从同行产品中怀才不遇呢? 针对不同习俗文化的国家和地区,不同生活习惯的海内用户,如何将“本地化”一以贯之呢? 随着国内泛娱乐的多元化蓬勃发展,出海需要成为新的增长点。Clubhouse 又再次点燃了寰球音频社交玩法,如何保障这些新场景、新玩法的疾速实现和晦涩应用,对于背地音视频技术服务商的技术撑持和难点又有哪些? 3月30日19点,拍乐云Pano携手扬帆出海和 LiveCloud,为你带来线上收费公开课《音视频出海新风口:浸入式体验感,用户需要搭建》,一起解锁出海赛道抉择及市场定位,理解出海社交潮流背地的新玩法实现和音视频技术。 分享嘉宾介绍Sandy Live Fun Group COO,出海社交专栏作者,经手过十多款社交泛娱乐产品,有着十分丰盛的海内产品教训,指标市场包含:欧美、中东、印度等。 Ark 拍乐云Pano 首席音频专家,8年音频技术积攒,曾就任于 Cisco WebEx 和网易,精通音频3A算法,对音频社交的技术实现和玩法翻新十分理解。 对出海社交、音视频畛域感兴趣的同学们,快扫码报名,锁定公开课席位!参加直播间互动,还能抽取拍乐云Pano专属惊喜福利哦!

March 24, 2021 · 1 min · jiezi

关于ios:IOS-如何快速的将数组每个元素设置成0

惯例做法当然是遍历。 var arr = [1, 2, 3, ...]for i in arr.indices { arr[i] = 0}惯例做法没有问题,然而有时候太慢了,咱们须要更快的办法。侥幸的是,IOS 提供了 vDSP 框架。 能够在外面找到 Vector Clear and Fill Functions 好家伙,这不就是咱们所须要的吗? func vDSP_vfilli(UnsafePointer<Int32>, UnsafeMutablePointer<Int32>, vDSP_Stride, vDSP_Length)// Populates an integer vector with a specified scalar value.具体是这样: var arr: [Int32] = [1, 2, 3, ...]var fill: Int32 = 0 // 待填充的数,其余的也行vDSP_vfilli(&fill, &arr, vDSP_Stride(1), vDSP_Length(arr.count))如果以上内容对你有所帮忙,请在这些平台上关注我吧,谢谢。o( ̄▽ ̄)d

March 23, 2021 · 1 min · jiezi

关于RTC:如何在3分钟内实现音频变声和趣味音效

在泛娱乐社交和互动游戏场景中,用户已不再满足于高清的音质体验和实时的互动成果,他们还想要减少趣味性和沉迷感,让声音变得好玩乏味。拍乐云Pano上线了音频变声接口,开发者能够通过 Pano SDK 设置不同的变声成果,如大叔音、小姐姐音、萝莉音、山谷音、惊悚音、困兽音等,加强语聊乐趣。本篇文章就来跟大家介绍如何在3分钟内基于 Pano SDK 实现音频变声性能。 筹备工作:拍乐云开发者账户(通过拍乐云官网注册)Pano SDK v1.3.4+ 版本Windows、Android 端RtcEngine对象的setOption办法中配置OptionType:AudioVoiceChangerMode。通过setOption将AudioVoiceChangerOption的枚举值设置进去,就能够实现windows端的变声成果。 Windows 端接口代码: /*! @~english@brief Set option and paramters@paramoption option@paramparam paramter defined with option@paramsize the size of parameters@returnOK: Successothers: Failure@~chinese@brief设置参数@paramoption参数类别@paramparam参数, 参数的定义需遵循不同的option所定义的参数构造@paramsize参数的大小@returnOK:胜利其余: 失败*/ virtualQResultsetOption(OptionTypeoption, void * param, uint32_tsize) = 0; 示例代码: AudioVoiceChangerOptionvcOption = AudioVoiceChangerOption::Male; rtcEngine_->setOption(OptionType::AudioVoiceChangerMode, & vcOption,sizeof (vcOption)); Andorid 端接口代码: /** @~english@brief Set option object to PANO SDK@paramtype PanoOptionType enum type@paramvalue The parameter of the option, the actual type of value is option-specific * @returnOK: Successothers: Failure@~chinese@brief 设置可选项@paramtype可选项类型PanoOptionType@paramvalue参数的定义需遵循不同的object所定义的参数@returnOK: 胜利其余: 失败*/ ...

March 23, 2021 · 1 min · jiezi

关于ios:iOS模拟器录屏制作GIF

正所谓一图胜千言,有时候在REAMDE外面放一张gif动图比写一堆阐明有用的多。这篇小文就简略来阐明一下如何用XCode提供的性能来录制iOS的视频,最初转换为Gif动图。 须要用到的工具XCodeffmpeg其中ffmpeg能够利用brew来装置。 一、用XCode来录屏首先关上模拟器,而后运行上面的命令启动录制(能够应用control + c来完结播放): xcrun simctl io booted recordVideo --code=h264 --mask=black --force out.mov 参数阐明: --codec: 能够用h264或者hevc两种格局--mask: 用black能够带上边框,或者用ignored不显示边框二、用ffmpg来转换格局能够执行上面的命令把out.mov视频转换成output.gif。 ffmpeg -i out.mov -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif参数阐明: fps=10: 每秒10帧,能够依据本人须要调整。scale=320:-1: 用于输入gif文件宽高缩放,这里320这个值是指iphone竖屏的时候幕宽度,-1示意放弃宽靠比进行缩放。-loop 0: 这个用来管制输入gif是否循环播放 -loop 0: 有限循环-loop -1: 不循环,只播放一次-loop 1: 循环一次,会播放两次三、另一种多此一举的办法另外能够应用ffpmg生成png图片序列,再用ImageMagick生成gif。 ffmpeg -i out.mov -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output/out%3d.png这条命令会在output文件夹上面生成一堆png文件,诸如out001.png,out002.png,out003.png... 而后用ImageMagick生成gif convert -delay 10 -loop 0 -layers optimize output/out*.png output.gif这种办法次要是须要在两头调整编辑一下png文件时有用,只须要Gif的话还是举荐只应用ffpmg来生成gif简略一些。

March 23, 2021 · 1 min · jiezi

关于ios:iOS-拍照录频画质问题相关

问题后面写了拍照、扫码、录视频的性能,后面要求性能实现即可,前面发现画质不够 思路可能起因剖析: 1.AVCaptureSession设置输入格局会影响画质清晰度 2.拍照中并未做聚焦/曝光解决, 或 聚焦/曝光设置参数导致含糊 解决 针对起因1,列举如下sessionPreset对应的像素(height *width): AVCaptureSessionPresetHigh                 1920*1080AVCaptureSessionPresetMedium            480*360AVCaptureSessionPresetLow                  192*144AVCaptureSessionPresetPhoto                 4032*3024AVCaptureSessionPreset352x288             352*288AVCaptureSessionPreset640x480             640*480AVCaptureSessionPreset1280x720          1280*720AVCaptureSessionPreset1920x1080          1920*1080AVCaptureSessionPreset3840x2160          3840*2160AVCaptureSessionPresetiFrame960x540    960*540AVCaptureSessionPresetiFrame1280x720 1280*720AVCaptureSessionPresetInputPriority         1920*1080按需来设置该参数 针对起因2,聚焦/曝光设置: /* 必须先设置聚焦地位,再设定聚焦形式 */CGRect rectLayer = self.preView.frame;CGPoint ccenter = CGPointMake((rectLayer.origin.x + rectLayer.size.width) / 2, (rectLayer.origin.y + rectLayer.size.height) / 2);CGPoint cpoint = [self.preView captureDevicePointForPoint:ccenter];AVCaptureDevice *devices= [self.dInput device];[self.session beginConfiguration];[devices lockForConfiguration:nil];// 设置聚焦点的地位if ([devices isFocusPointOfInterestSupported]) { [devices setFocusPointOfInterest:cpoint];}// 设置聚焦模式if ([devices isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) { [devices setFocusMode:AVCaptureFocusModeContinuousAutoFocus];}// 设置曝光点的地位if ([devices isExposurePointOfInterestSupported]) { [devices setExposurePointOfInterest:cpoint];}// 设置曝光模式if ([devices isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) { [devices setExposureMode:AVCaptureExposureModeContinuousAutoExposure];}[device unlockForConfiguration];[self.session commitConfiguration];其中聚焦模式 跟曝光模式的设置很有意思: ...

March 22, 2021 · 1 min · jiezi

关于小程序:uniapp跨端开发H5小程序IOSAndroid二开发工具HBuilderX使用技巧

大家好,我是黑马腾云。 这是一个原创系列连载文章,基于企业实在我的项目案例分享教训,带你疾速入门uni-app开发!欢送点击头像关注,防止迷路! 前几天,不少读者私信征询前文中我的项目案例的种种实现细节,本文先揭晓应用的开发工具。 特地阐明:系列文章定位是帮忙初学者从入门到实战,适宜零根底或根底较差uni-apper。为了节约工夫,高手勿进,可关注后续的实战局部。 一、我的项目演示前文提到的我的项目是实在上线的商业我的项目,如果还没体验的能够找前一篇文章的入口进入体验。 贴心的小编也为你录好了屏,不便各位看官儿查看。 1、商城我的项目APP2、外卖我的项目小程序ps:平台不反对间接上传视频,就临时不上传了。 以上我的项目都蕴含APP(IOS、Android)、小程序和H5。 看到这个演示,置信大家脑海里肯定有不同的实现形式。那么,你想到了哪些实现形式呢? 咱们思考的实现计划有很多,比照剖析后,最终抉择uni-app多端开发(至于起因前文有提到)。 采取不同的凋谢计划,对应的开发环境和工具也有所不同。既然抉择了 uni-app 开发,工具天然是采纳官网的HBuilderX。 下边来看看它和其它前端开发工具的一些比照 二、前端工具比照抉择1、VSCode微软公布的收费跨平台编辑器,应用的人也是十分多。 VSCode 全称 Visual Studio Code,现代化轻量级的代码编辑器,反对简直所有支流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码比照 Diff、Git 等个性,反对插件扩大,并针对网页开发和云端利用开发做了优化。软件跨平台反对 Win、Mac 以及 Linux,运行晦涩。 2、HBuilderXHBuilderX(简称:HX)是轻量编辑器和弱小IDE的完满结合体,是HBuilder的升级版。麻利的性能,清新的界面,弱小的性能。 国产编辑器,且领有世界级语法分析引擎,与uni-app出自同一家公司,有很多本地化的人造反对劣势。 HBuilder最大的劣势就是速度比拟快,弱小的代码提醒和代码输出,大大增加了开发者的开发效率。 3、webStorm对js反对十分好,用的人也十分多(尽管免费,但置信聪慧的你肯定有方法,懂得)。 4、Sublime Text一款代码编辑器,领有丑陋的用户页面和实用功能,以及多功能插件。性能很多,包含多抉择和多窗口和python api等性能。 5、Bracket收费、开源且跨平台的 HTML/CSS/JavaScript 前端WEB集成开发环境IDE。由 Adobe 创立和保护,依据 MIT 许可证公布,反对 Windows、Linux 以及 OS X 平台。 当然除了这些,还有一些其它的工具(DreamWeaver等等)也十分优良。工具实质都是为开发服务的,因而抉择适宜的即可。 接下来演示如何利用HBuilderX来创立一个uni-app我的项目: 三、HBuilderX创立我的项目1、下载安装间接去官网下载安装即可,截至写文时最新版本为:3.0.7,本系列开发也是采纳此版本。 留神:官网版本更新比拟快,如果你的版本不统一,可能软件界面和性能有些区别。此系列文章我的开发环境为windows,如果你用的mac环境,快捷键和界面也有肯定区别。 装置过程就不再赘述,按提醒一路点击下一步即可。 如果网速较慢或不不便下载,也能够私信我发你。 2、创立我的项目HBuilderX能够创立多种类型的我的项目,此处以创立基于HTML的Web我的项目为例,演示我的项目创立过程。 新建我的项目 通过菜单栏:文件-新建-我的项目,或者间接主界面点击“新建我的项目”都会弹出如下:“新建我的项目”界面 如上抉择“一般我的项目”,输出项目名称,抉择存储地位,点击“创立”,就会胜利创立我的项目。 新建文件在创立的“test”我的项目上右键-新建-html文件,就能够为我的项目增加文件 输出文件名称:getstart.html 文件创建胜利后,预览文件 在文件中输出内容并保留,点击右上角的“预览”按钮,就能够实时预览批改的内容。 创立我的项目和增加文件的过程,和其它编辑器或IDE并没有太大的区别。 3、软件界面 主界面如上图,界面比拟简洁,右下角还能够抉择文件的编码。 4、关上、敞开我的项目关上我的项目菜单:文件-关上目录,弹出框中抉择对应我的项目所在的文件夹即可。 敞开我的项目在我的项目上右键-移除我的项目或敞开我的项目。 移除我的项目会从本地电脑删除。 ...

March 22, 2021 · 1 min · jiezi

关于前端:使用githooks库助力Flutter团队编码规范

原文链接 前言随着Flutter 2.0的公布,越来越多的公司和集体都在尝试应用Flutter来编写性能优异、跨平台、渲染一致性好的App。当然,在谋求效率的同时,也不要忘了给你的代码增加更多谨严的限度,来保障代码的品质。明天我给大家举荐一个插件,用于给提交代码到Github或者GitLab时,在本地应用dart语言,即可限度提交代码的品质。 Git HooksGit Hooks是什么,Hooks顾名思义,就是钩子。它在Git中的作用就是在咱们通过git命令操作仓库或者增加我的项目文件时,运行一些脚本,脚本通过即可实现事件,如果失败就被终止事件。这里是官网定义的所有钩子,有趣味的能够一一查看。比方咱们在.git/hooks/下新建了一个pre-commit文件,并输出以下内容 #!/bin/shecho '文件正在提交'exit(-1)而后咱们在命令行中执行 git add testgit commit -m '提交信息'而后咱们就会在命令行看到文件正在提交,并且文件最初没有提交到本地仓库,因为下面我exit了。 这样,咱们就能够在这个文件中写一些校验,比方通过dartanalyzer查看本地我的项目语法是否有语法问题。 git_hooks这是一个Dart命令行插件,也是一个Dart插件。咱们看到下面应用shell脚本来写校验,它存在一些问题: 每个人的.git文件夹是不通过版本治理的,所以一个人第一次拉了代码,在.git/hooks文件夹下是不会存在能运行的hooks文件的shell脚本比拟生涩难写,上手难度高git_hooks库就是为了解决下面问题。它的作用就是能通过命令生成所有hooks,而后在咱们通过git命令提交代码时,能够通过dart来进行提交前或者提交信息的校验。它让咱们程序员能够疏忽hooks文件存在,在dart代码中实现对所有钩子的操作。 这里咱们定一个咱们能看懂的术语 hooks文件:指在.git/hooks文件夹下生成的钩子文件dart钩子文件:指在我的项目中生成的应用dart语言来操作hooks文件的dart文件咱们能够通过上面命令来装置它,装置它前请保障你的dart曾经装置且曾经配置了环境变量,还要保障你的 dart 版本大于 2.1.0 运行命令dart --version查看dart版本号 而后运行pub global activate git_hooks即可全局装置git_hooks命令 创立hooks我的项目文件当咱们关上一个领有git版本治理的我的项目(在我的项目中可看到.git文件夹) 在我的项目中的pubspec.yaml文件中增加 dev_dependencies: git_hooks: ^0.1.5创立hooks文件和dart钩子文件的命令是: git_hooks create {{targetFileName}}targetFileName指的是dart钩子文件,它能够是我的项目中任何地位,比方在根目录下的git_hooks.dart文件(这也是如果此参数不传默认会创立的文件)那咱们来执行: git_hooks create git_hooks.dart如果输入 create files... All files wrote successful!0.2s那阐明咱们曾经创立胜利。咱们来检查一下文件是否生成胜利,查看.git/hooks文件下是否有多个文件例如pre-commit,pre-push等等,查看根目录下是否已生成git_hooks.dart文件 关上git_hooks.dart文件会看到如下 import 'package:git_hooks/git_hooks.dart';// import 'dart:io';void main(List arguments) { // ignore: omit_local_variable_types Map<Git, UserBackFun> params = { Git.commitMsg: commitMsg, Git.preCommit: preCommit }; GitHooks.call(arguments, params);}Future<bool> commitMsg() async { // String rootDir = Directory.current.path; // String commitMsg = Utils.getCommitEditMsg(); // if (commitMsg.startsWith('fix:')) { // return true; // you can return true let commit go // } else // return false; return true;}Future<bool> preCommit() async { // try { // ProcessResult result = await Process.run('dartanalyzer', ['bin']); // print(result.stdout); // if (result.exitCode != 0) return false; // } catch (e) { // return false; // } return true;}解释: ...

March 18, 2021 · 2 min · jiezi

关于java:五个问题三大策略手把手教你定制App性能监控方案

作者:友盟+U-APM团队 Why? 为什么要做利用性能监控? 首先,咱们要晓得利用性能监控具体指什么?以及目标: 监控是一套残缺的“监督+报警”的零碎。对于像咱们这样的App开发者来说,利用性能监控是掂量App的第一道关卡,如果利用的品质不好,会给用户带来最间接的体验挫伤。App上线后,开发者是无奈7*24实时获取到用户应用及体验状况的,这时就须要一套优质的监控工具。 那么,咱们到底须要监控哪些指标? 安卓和iOS的客户端监控指标就有很多不同,比如说安卓须要的是Java、Native、ANR谬误等等,iOS须要的是Objective-C、Swift、C++层的谬误等等。 在定义谬误指标上,最根底的是不同类型的谬误数,如果思考到谬误数与整体利用使用量的比照,能够思考用比值的形式,比方能够定义错误率: 如果要关注谬误的产生次数,及谬误的影响用户数,则能够在谬误数的根底上,依据用户排重计算得来影响用户数。 如何定义独立用户呢?咱们能够思考用设施ID分别,比方imei、idfa、AndroidID等等,如果这些信息很难获取,也能够应用业务上的用户ID,比方登录账号,会员名等。除此之外,应用第三方SDK提供的设施辨认定义ID也是个不错的抉择。在应用这类ID排重后,就能够失去谬误的影响用户数。 如果咱们已知谬误的影响用户数,但无奈确定它的影响范畴占比,则能够看以下这个指标: 总结下来,咱们能够统计不同类型谬误在某一个工夫范畴内的谬误数、错误率、影响用户数、影响用户占比等指标。在指标的细化分类上,咱们还能够用不同的维度定义监控,比方版本号。 How? 如何灵便地制订属于你的告警打算? 咱们先请您做个小测验来判断下您的监控告警类型(一共5道题,仅需1.5分钟) 规定如下:A选项记5分,B选项记10分,C选项记15分,D选项记20分 Q1: 请问您的产品目前处于什么阶段? A: 曾经上线,处于比较稳定的状态,对监控告警的需要较低 B: 还在开发阶段,须要捕获一些测试中的谬误,对监控告警的需要个别 C: 刚刚上线,整体来说比较稳定,对监控告警的需要较高 D: 刚刚上线,成果未知,十分须要7*24小时实时关注,对监控告警的需要十分高 Q2: 请问您在您的公司/部门的职务是什么? A:领导者,关注利用的品质做得如何 B:运维人员,负责监控整体利用性能的线上问题监督官 C:测试人员,负责利用发版前的品质把控 D:安卓/iOS端的客户端开发人员 Q3: 请问您所属团队有多少人在关注利用性能品质,并参加其中呢? A:  1,光杆司令干活靠本人 B:2~5人,小型开发团队 C:6~25人,互相打配合,一起优化利用品质 D:25+,超大型的开发团队,不谦虚的说算是行业龙头 Q4: 您日常关注哪些利用性能监控指标: A:  最根本的谬误数就能够 B:思考到客户端影响的用户应用范畴,在上述的根底上须要监控影响的用户数以及占比 C:在上述的谬误数以及影响用户的根底上,还要思考各个版本的散布 D:须要制订组合型的告警规定:比方:谬误数>100且错误率>1%或者影响用户数比1天前多1%时触发告警,也要思考版本散布 Q5: 请问您对告警的告诉形式有精细化设置的要求么? A:没什么要求,只有能收到就行 B:在工夫上有一些要求,中午不想被打搅 C:在通道上有一些要求,须要邮件或者特定的办公聊天软件 D:对工夫和触达通道都有要求 What?那么如何设置告警打算呢? 以上的分加总,请先断定下您的测验总分(A选项记5分,B选项记10分,C选项记15分,D选项记20分),来看您的App在上面哪个监控告警需要等级范畴内:(数据在哪个范畴?还是监控告警在哪个层级?) 热血青铜(25~50分):您属于监控告警的初级阶段使用者,您在日常工作中无需十分精密地查看各种谬误的产生状态。可能是因为您的利用还在初始阶段,或者您位高权重,无需亲自修复告警信息,只须要整体监控就好。请查看下文中的计划1 勇敢黄金(50~75分):您属于监控告警的中级阶段使用者,您或者您的团队曾经有了监控告警的意识,并且在日常工作中会关注到实时的利用品质状况。您曾经能够用肯定精细化的规定设置告警了,请跳转至计划2 光荣王者(75~100分):您曾经属于监控告警的高能玩家了,只须要一点点疏导,就能够成为监控告警界的“超级王牌”了 根据上述测验的分值高下,您能够判断您所须要的告警设置的难易,整体分为上面几个计划,实现水平由易到难。如果您想学习最全面的告警设置性能,请间接跳转到计划3哦 计划1:简易型--整体利用品质监控 作为最高级的告警设置,您只须要思考两个问题: a. 我应该在什么状况下收到告警?   b.我如何能收到利用告警音讯呢? 解决第一个问题,您能够思考最简略的状态,只有有谬误我就要收到预警,那么只有设置谬误数>0的条件就能够解决。如果您感觉这样被打搅的十分多,能够依据本身的利用状况,设置谬误数>xx个这类的告警规定 解决第二个问题,您须要有一个能够接管音讯的媒介,最简略的就是邮箱: ...

March 17, 2021 · 1 min · jiezi

关于RTC:拍乐云创始人-CEO-赵加雨深耕-18-载打造全景式音视频服务

2020年疫情来袭,“云生存”成了人们相熟并依赖的体验。在线会议、线上教学等“云服务”也迎来了前所未有的时机和挑战,行业竞争变得越发强烈。 在一众精兵强将中,有支不容小觑的队伍——拍乐云,它也是映魅征询2021值得关注教育公司上榜企业。依靠团队弱小的音视频技术班底,推出Pano SDK和PaaS云服务,为在线教育、泛娱乐等多个场景提供了全新的、升级版的体验,一跃成为业界领军之一,而更令人另眼相看的是,它才刚刚成立1年多。 这番“开天辟地”的背地离不开一个人,他就是拍乐云的缔造者——深耕音视频畛域18年的技术专家赵加雨。 拍乐云创始人&CEO 赵加雨 技术专家转型创业者,一直自我冲破赵加雨是音视频技术的权威之一,这点毋庸置疑。 毕业于东南大学计算机系的他,在2003年退出了WebEx。过后,WebEx在视频会议畛域的市场占有率达到了70%以上,近乎占垄断位置。能够说,是WebEx真正定义了视频会议的产品状态。 “真正进入行业后,你就会发现音视频技术的难度很高、技术栈很深,因为用于视频会议,它是实时的,自身也是分布式的,”赵加雨说,“它对技术架构、对平台服务、对通信品质的挑战要远远高于其余产品。”这些不间断的难题,对于向来敢于自我冲破的赵加雨而言,则是绝佳的成长机会。 在WebEx良好的工作气氛里,凭借一次次卓越的体现,他从基层技术岗位,降职WebEx中国高级经理、WebEx美国架构师,整整14年。 2017年,寻求扭转的赵加雨来到美国,回国任网易云信CTO。技术工作之余,他须要花更多的精力去接触市场,由此他窥见音视频技术背地微小的市场需求, “咱们能够看到,新守业的我的项目、互联网倒退、各种翻新的玩法,都离不开音视频技术,市场需求是确确实实存在的。” 与此同时,在与国内音视频团队进一步接触的过程中,他也逐步意识到国内外在音视频技术畛域的差距。“海内同行在实践中认为‘理所应当’的技能、常识,国内业界其实并不分明。更精确地说,过后外乡团队对音视频的认知是不够的,这让我清晰地意识到音视频的技术门槛比我料想得要高。” 市场的需要、技术自身的倒退空间还有他那份不变的闯劲都促使着赵加雨做出新的决定。2019年,他来到网易,在杭州创建了拍乐云,很快取得红杉资本的青眼,实现红杉中国种子基金领投的2500万人民币天使轮融资。 “我创建拍乐云的年纪和袁征创建Zoom是一样的”,赵加雨谈起了好友、今日领导,“Eric (袁征英文名)在湾区时已成为思科的VP,很少有华人能取得这样的位置和成就。当他发现公司的翻新节奏达不到预期、客户需要无奈很好地失去满足的时候,就果决抉择了守业”。 “Eric的经验对我是很大的激励,他自己也十分反对并激励我的抉择”,赵加雨说,“主观看,目前行业内,真正可能做好音视频技术,提供稳固且好用的音视频产品的团队并不多。但拍乐云在音频、视频、服务端散发和网络散发上都有着深厚的积攒,有信念、有能力、有技术为客户提供更好的音视频产品。” 为客户化解痛点,开辟线上教育新场景2020年,疫情迫使教育行业近乎仓促地步入线上化转型,一时间,无论互联网大厂,还是新兴的守业组,都将眼帘瞄准了线上教育市场,赵加雨也不例外。在他看来,教育是一条有着广大前景的赛道。 基于在音视频行业十多年的潜心深耕,他敏锐地发现,视频会议外面的很多技术积淀能够很好地被利用到教育场景中。比方像视频大小流、多路共享、多路推流、多路录制、视频会中会性能,都能与教育场景有所分割。 不过,相通中也存在差别。和传统的视频会议不同,教育的主体是老师和学生,而教育的次要场景在于教和学。在传统课堂中,老师站在黑板前,手拿粉笔写写画画,板书的变动,配合着老师的解说,常识的交互便悄悄产生。如果仅仅依靠传统的视频会议性能,这样的交互很难在线上教育场景中实现。 如何能力在现有的音视频技术上翻新,适应线上教育需要?拍乐云的答案是从客户的痛点中寻求灵感。“客户的痛点也是翻新的源泉,”赵加雨说,“你不可能在实验室里翻新,翻新肯定是在跟客户沟通打磨,在解决客户痛点的过程当中造成的。” 在具体的实际场景中,拍乐云团队很快发现,过后市面上现有的视频会议类产品中,可能代替黑板和粉笔这一教学刚需的线上教学工具简直为零,这大大减弱了线上教学的互动性。基于这一痛点,技术团队研发出了拍乐云互动白板。在这块充当黑板的“白板”中,老师能够在课件中进行实时标记,与学生进行课堂互动。 随着与教育客户沟通的深刻,拍乐云对教育客户的需要有了更深的理解。他们逐步意识到,只管大多数教育场景都基于教和学,但不同学科,教学需要和侧重点却截然不同。例如在K12课堂答题互动中,为了更精准的领导,老师会心愿每个学生都有一块属于本人的白板,就须要独立多白板的展现和互动;而在线上编程、美术教学中,老师须要在屏幕共享或实时视频的根底上,指出重点、难点和问题点,就须要共享标注和视频标注来实现……不同的需要在雄厚技术实力的加持下最终变成了一项项技术创新。 通过一直“做加法”,现在的拍乐云互动白板蕴含了文档转码共享、多通道轨迹同步、多种教具切换、多样化工具栏、共享标注、视频标注、多白板互动、自定义内容传输、激光笔和视角追随等多个性能,反对模块化定制,实用于多种教学、娱乐场景。 “咱们的价值实质上体现在咱们解决客户的痛点,满足他们的需要,”赵加雨示意,“基于客户的反馈和需要,从而更好地服务他们,成就客户的同时成就咱们本人”。 技术,不止于眼前身为一名技术专家和创业者,赵加雨信念动摇:技术的后退,永无止境。 从WebEx第一代云视频会议的诞生,到新生力量Zoom、Clubhouse等异军突起,向人们昭示了一件事:技术的倒退正让音视频产品状态从“能用”走向“好用”。他也置信RTC技术将会和更多其余的技术联合,实现丰富化、多样化。 “技术的利用,是为了让用户取得更强的互动性,更好的沉迷感,更高的效率,从而更好地达成指标”,他说。虚构背景和智能降噪技术的事实利用曾经是无力的佐证。即使身处凌乱的房间,虚构背景技术也能够帮忙用户在视频会议中出现适合的背景。而智能降噪技术,则可能让用户跳脱空间的限度,随时随地发明一个污浊的对话场景。 在未来,拍乐云会一直实现教育全场景赋能 “随着5G通信的倒退,技术瓶颈的冲破,许多在咱们传统认知中应该在线下实现的流动和事件,最终都可能在线上取得很好的实现,”赵加雨说,“所以我也置信,将来,RTC将实现全场景赋能,在全场景中去利用。” 这恰好也是“拍乐云” (Pano,全景panorama缩写)名字所蕴含的愿景——为客户提供一个全景式的沉迷体验,构建云上的每一次美妙互动。 以上文章来源于 映魅征询,作者 闻艺

March 17, 2021 · 1 min · jiezi

关于flutter:即刻报名-Flutter-Engage-China-线上见

在刚刚过来的 Flutter Engage 流动上,咱们正式公布了 Flutter 2: 为任何平台创立好看、疾速且可移植利用的能力得以更上一层楼。通过 Flutter 2,开发者能够应用雷同的代码库为五种操作系统构建原生利用: iOS、Android、Windows、macOS 和 Linux;以及为 Chrome、Firefox、Safari 和 Edge 等浏览器打造 Web 体验。Flutter 甚至能够嵌入到汽车、电视和智能家电,为环境计算提供最普适、可移植的体验。 为了给中国开发者带来更多对于 Flutter 2 的更新,理解在您的团队里 Flutter 的实际状况和反馈,咱们真挚邀请您加入 2021 年 3 月 25 日 (星期四) 上午举办的 Flutter Engage China 流动 (线上直播),与 Google Flutter 团队和来自国内的开发者们独特探讨和交换 Flutter 的最新更新、实际和将来的倒退,咱们十分期待您的加入! 流动工夫2021 年 3 月 25 日 (星期四) 10:00 - 12:00 流动模式线上直播 流动注册 立刻扫码注册报名 本次线上流动名额有限,咱们可能无奈接收所有的报名者参加,咱们将在报名截止日期或者人数满员之后敞开报名;咱们将在 3 月 17 日后通过邮件陆续收回确认函与您确认最终的参会席位,敬请关注 (举荐应用公司邮箱报名加入本流动)。流动内容 (工夫和最终安顿以当天流动议程为准)Flutter Engage China 流动介绍来自 Google 平台及生态事业群大中华区开发者市场负责人 Jijia Huang 会为大家介绍 Flutter 中国市场和社区的状况,以及本次流动的流程。 ...

March 16, 2021 · 1 min · jiezi

关于资源:开发资源总结-持续整理中-2021315-更新

集体阶段性总结,也心愿对大家有些帮忙。 原文地址: 点击查看最新 开发资源总结 就像开发一样, 这篇文档如果没有人关怀和保护, 外面的内容就会变得老旧, 过时而不再具备参考价值. 所以, 我心愿所有看到并喜爱这篇文档的人都一起来保护它. 放心大胆的提交 Pull Request 和 Issue 吧!!这是对本人这些年工作的一个总结,各种我的项目、资源、书籍、博客等 喜爱么?或者对您有用? ☞ 立刻去 ⭐️ Star ⭐️ 一下 ☞ 奉献形式Fork 这个我的项目请不要间接在 README.md 中间接增加内容所有的文档都放在 docs 中, 请依据内容找到相应的文件并增加如果是 Mac 或者 Linux 用户, 请在提交前运行 ./build.sh 来主动生成 README.md 文件保留并提交新建一个 Pull RequestWeb 前端Javascriptparallel.js: 前后端通用的一个并行库zepto: 用于古代浏览器的兼容 jQuery 的库totoro: 稳固的跨浏览器测试工具TheaterJS: 一个用于模仿人输出状态的 JS 库stellar.js: 前端用于实现异步滚动成果的库,现已不再保护skrollr: 另一款实现一步滚动的开源库,应用人数泛滥,可实现各种狂拽酷炫掉渣天的前端成果,看假相Framework7: 前端框架,是开发人员能够基于 web 技术构建 IOS7 程序regulex: 用于生成 正则表达式 的可视化流程图markdown-it: 新型 Markdown 解析器,疾速,反对插件multiline: 用于 Javascript 中的多行文本,相似于 Ruby 的 HERE Docscreenfull.js: 全屏插件,反对各大浏览器lunr.js: 相似于 Solr, 然而用于浏览器上的全文搜索引擎,能够为 JSON 创立索引,离线也能够应用jquery.hotkeys: jQuery 插件,用于绑定热键breach_core: Javascript 编写的 Browser (浏览器)octocard: 用于生成 Github 信息卡片的库github-cards: 用于生成 Github 信息卡片的库money.js: 轻量级货币转换库,web 和 node 皆可用accounting.js: 轻量级的数字、货币转换库javascript-algorithms: Javascript 实现的各种算法汇合lazy.js: 相似于 underscore, 然而会提早执行,某些场景下,性能会有很大的晋升seajs: 前端模块加载器,解决模块化、依赖等问题jQuery-One-Page-Nav: 单页利用中一个用于解决导航栏的库js.js: Javascript 实现的 javascript JITjquery-ui: jQuery 团队开发的 UI 相干的前端库,功能强大todomvc: 别离基于 AngularJS/EmberJS/Backbone等实现的 TODO List, 帮忙开发者抉择前端 MVC 库localForage: Mozilla 出品,用于离线存储,基于IndexedDB, WebSQL 或者 localStorage, 提供统一的接口EventEmitter: 浏览器版的 EventEmitterjquery.serializeJSON: jQuery 插件,用于将 form 表单序列化成 JSON 数据knockout: 前端 MVVM 框架,用于开发富前端利用mermaid: 能够依据文本生成流程图,相似于 Markdown 的语法js-sequence-diagrams: 另一款能够依据文本生成流程图的库,相似于 Markdown 的语法flow: 一个用来检测 Javascript 语法错误的库, Facebook 出品zoomooz: jQuery 插件,用来解决浏览器缩放fancyBox: 一个用于放大放大图片、Web 内容或者多媒体元素的库,优雅慷慨mithril.js: 轻量型前端 MVC 框架,局部应用场景下性能优于 Angular.js 和 Reactbackbone: 弱小的前端 MVC 库,鼻祖级前端库,最后为了配合 Rails 来模块化前端利用,兼容性良好 (兼容到 IE6),插件丰盛,性能良好jquery.smartbanner: smartbanner 是从 IOS6 开始反对的一个新个性, 这个插件提供了对晚期 IOS4/5 和 Android 的反对jquery.scrollTo: 在页面上以一个元素为起始以动画的形式挪动(ScrollTo)到另一个元素, 反对回退等jScrollPane: 自定义的滚动条,让所有浏览器都显示一样的滚动条onepage-scroll: 提供相似于 iPhone6 展现页相似的成果,实用于单页利用,兼容到 IE8scrollMonitor: 前端插件用来监控元素的滚动事件(进入、退出等),性能很好ScrollMagic: 神奇的滚动交互成果插件,能够在滚动的过程中设置各种各样的动态效果infinite-scroll: 滚动加载,滚动到最下到主动加载, Paul Irish 大神之作animatable: 仅仅依附 border-width 和 background-position 实现的各种动态效果,看假相Fluidbox: 页面上内嵌图片的放大放大成果,相似于 Medium 中的成果jquery-validation: jQuery 的一个插件,用于校验 Form 表单BigVideo.js: jQuery 的一个插件, 用于实现大背景(视频、图片)成果emscripten: 一款基于 LLVM, 能够将 C/C++ 转换成 Javascript 的工具,使得 Javascript 能够近乎 Native 的速度qrcode-generator: 各种语言的二维码生成工具device.js: 一个能够检测设施类型的工具,能够让咱们依据不同的设施来为其定制响应的 Javascript 和 CSSjquery-qrcode: jQuery 插件,用来生成二维码Wookmark-jQuery: jQuery 的一个插件,能够用来实现瀑布流的成果isotope: 能够用来过滤、排列布局,实现好看的动静布局切换成果,Demolazysizes: 功能强大的图片提早加载工具,能够首先加载一个低质量的图片,而后再加载高质量的图片progressbar.js: 简洁好看的进度条,扁平化pigshell: 一个由 Javascript 实现的Shell, 将互联网当做一个大的文件系统, 通过 cd/ls/cat.....等命令, 能够拜访 Facebook/Twitter/Google Drive 等网络服务 ...

March 15, 2021 · 11 min · jiezi

关于react-native:React-Native-064版本发布iOS开启支持Hermes引擎

React Native 0.64版本公布了,次要更新内容是在iOS开启反对Hermes。 1.iOS反对Hermes引擎。Hermes是一个为优化运行React Native而开源的JavaScript引擎。它通过升高内存利用率、缩小下载大小和缩小应用程序可用或“交互工夫”(TTI)所需的工夫来进步性能。 其实Hermes在之前就曾经优先在Android平台上进行了反对,应该是在0.60.4版本上开启了反对,相干文章Meet Hermes, a new JavaScript Engine optimized for React Native以及开启Hermes反对的办法Using Hermes. 此次版本更新也正是开启了iOS平台上反对了Hermes。开启Hermes反对也很简略,在Podfile文件中设置hermes_enabled为true,而后在执行pod install就能够了。 use_react_native!( :path => config[:reactNativePath], # to enable hermes on iOS, change `false` to `true` and then install pods :hermes_enabled => true)值得注意的是,当初iOS上反对Hermes尚在初期阶段。React Native团队会持续进行大量的根底测试,激励用户在利用中进行尝试。 2.默认启用Inline RequiresInline Requires是一个Metro配置选项,它通过提早加载JavaScript模块的执行,来缩短启动工夫,提交加载速度。其作为可选配置抉择曾经存在很多年,当初新版本利用中默认开启,以此帮忙用户无需额定配置就能够疾速应用React Native. Inline Requires 是一种 Babel 变换,它能够将模块导入并转换为 inline。例如,Inline Requires 将这个模块导入调用从文件的 top 转换到应用它的中央。 Before: import { MyFunction } from 'my-module';const MyComponent = (props) => { const result = MyFunction(); return (<Text>{result}</Text>);};After: ...

March 14, 2021 · 1 min · jiezi

关于ios:IOS-监听音量变化监听音量按键及隐藏系统音量UI

监听音量变动仿佛并没有一种正式的形式能够监听并笼罩掉零碎音量按钮的行为。咱们能够应用的是一个对系统音量变动的事件监听。只须要按如下代码增加上监听即可。 func someInit() { NotificationCenter.default.addObserver(self, selector: #selector(onVolumnChanged), name: Notification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)}func onVolumnChanged(noti: Notification) { // do your works}当任何音量扭转的事件产生时,这个监听都会被触发,据我测试的后果: 按下音量+-键下拉关上控制面板,调节音量前后摄镜头切换还好,监听给的 Notification 对象外面提供了一些有用的参数帮咱们辨别出这些状况。能够应用 AVSystemController_AudioVolumeChangeReasonNotificationParameter key来获取音量扭转的起因。代码如下: func onVolumnChanged(noti: Notification) { let reason = (noti.userInfo?["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String) ?? "" if reason == "ExplicitVolumeChange" { // 明确的,用户行为的音量扭转,比方按下音量键和下拉控制面板调节音量 }}暗藏零碎音量UI另一个问题是当按下音量按键时,UI 上会主动显示出零碎的音量条,有些业务需要须要暗藏,其实也很简略,只须要在以后的 viewController 外面的某个 view 中增加上 MPVolumeView ,而后把它的 frame 设置得屏幕里面,就行了。仿佛零碎会主动找到它,替换掉零碎的音量条,这个只针对以后这个 ViewController 无效。跳转到下一个 ViewController,如果须要屏蔽,也须要独立增加。 let mpVolumeView = MPVolumeView()mpVolumeView.frame = CGRect(x: -500, y: -500, width: 10, height: 10)addSubview(mpVolumeView)如果以上内容对你有所帮忙,请在这些平台上关注我吧,谢谢。o( ̄▽ ̄)d ...

March 12, 2021 · 1 min · jiezi

关于ios:喜讯-音视频云服务商拍乐云荣登2021值得关注的中国教育公司榜单

3月11日,映魅征询「2021值得关注的中国教育公司」榜单揭晓,拍乐云入围「2021值得关注的教育科技公司」。在此,特别感谢客户搭档的反对和信赖,期待携手共创将来。作为专一教育科技等新经济的行业钻研及征询的翻新服务媒体,映魅征询以“产业实质·技术驱动·品质优先·锐意进取”的理念,致力于关注报道将来教育。此次榜单评比历经三个月左右的征集和教育行业专业人士的意见收集,共有数百家企业参加其中,旨在通过媒体的形式与力量,挖掘在2021年那些值得关注的新教育、新科技、新服务,期盼独特携手推动行业的倒退,发明更加美妙的2021。 (残缺榜单) 随着5G通信的倒退、技术瓶颈的冲破,教育行业对于实时互动的需要和场景越来越多,也催生了各大通信技术云厂商在教育赛道的布局和深耕。 拍乐云在2019年创建之初就将教育赛道作为团队的主力方向之一,并在2020年上半年正式公布了语音通话、视频通话、互动白板、互动直播和云端录制等产品矩阵。在和泛滥客户的深刻沟通中,拍乐云基于本身技术劣势,深刻打磨互动白板产品,也翻新出了更多的性能点,比方屏幕共享标注、多摄像头采集等,致力于为教育行业客户解决互动体验的痛点,提供新一代实时通信云服务。 将来,拍乐云还将保持以“构建云上的每一次美妙互动”为使命,持续翻新产品、深耕技术、优化服务,携手客户共创出更多教育实时互动最佳实际。

March 11, 2021 · 1 min · jiezi

关于ios:UIButton-禁用高亮

参考:https://www.itranslater.com/qa/details/2129903136516080640 形式一:设置高亮和 Selected 同样(如果有title、image等,也要这样设置,不举荐这个形式)button.adjustsImageWhenHighlighted = NO;[button setBackgroundImage:[UIImage imageNamed:@"switch_close"] forState:UIControlStateNormal];[button setBackgroundImage:[UIImage imageNamed:@"switch_open"] forState:UIControlStateSelected];[button setBackgroundImage:[UIImage imageNamed:@"switch_open"] forState:UIControlStateSelected | UIControlStateHighlighted];形式二:UIControlEventAllTouchEvents(举荐)[button addTarget:self action:@selector(allTouchEventsClick:) forControlEvents:UIControlEventAllTouchEvents];- (void)allTouchEventsClick:(UIButton *)button{ button.highlighted = NO;}Tip:能够创立一个本人的Button,方便使用 #import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface TMButton : UIButton/// 如果里面须要监听UIControlEventAllTouchEvents能够应用 block 代替@property (copy, nonatomic) void(^allTouchEventsClickBlock)(UIButton *button);@endNS_ASSUME_NONNULL_END#import "TMButton.h"@implementation TMButton- (instancetype)init{ self = [super init]; if (self) { [self addTarget:self action:@selector(allTouchEventsClick:) forControlEvents:UIControlEventAllTouchEvents]; } return self;}- (void)allTouchEventsClick:(UIButton *)button{ button.highlighted = NO; if(self.allTouchEventsClickBlock){ self.allTouchEventsClickBlock(button); }}@end

March 11, 2021 · 1 min · jiezi

关于ios:Flutter-返回上一页并刷新

用flutter路由跳转页面时,次要用到的就是Navigator.push();和Navigator.pop();两个办法。 然而存在一个问题: 当我从主页跳转到另一个页面,再返回到主页时,主页并不能被动刷新。怎么解决呢? 答案时,当返回到主页时,监听到返回事件,而后被动触发主页刷新。 class PageOne extends StatefulWidget { @override _PageOneState createState() => new _PageOneState();}class _PageOneState extends State<PageOne> { // 第一个页面 _getRequests()async{ print('这里进行操作'); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: RaisedButton(onPressed: ()=> Navigator.of(context).push(new MaterialPageRoute(builder: (_)=>PageTwo()),) .then((val)=>val?_getRequests():null), // 通过then进行监听回调参数 ), )); }}class PageTwo extends StatelessWidget { // 第二个页面 @override Widget build(BuildContext context) { //somewhere Navigator.pop(context,true); // 第二个就是须要传到参数 }}

March 10, 2021 · 1 min · jiezi

关于ios:扫盲贴如何评价一款App的稳定性和质量

作者:友盟+挪动开发专家 张文 「解体」与「卡顿」、「异样退出」等一样,是影响App稳定性常见的三种状况。相干数据显示,当iOS的解体率超过0.8%,Android的解体率超过0.4%的时候,沉闷用户有显著降落态势。它不仅会造成要害业务中断、用户留存率降落、品牌口碑变差等负面影响,而且会间接带来卸载和散失。也同时给开发者带来不可小觑的资本损失。 那么,解体率低的App品质就高么?是否能够通过解体率直接判断App的稳定性?  首先,掂量一个App品质好坏时咱们须要定义一个对立的口径,即哪些指标能够作为稳定性的评估口径?以友盟+的U-APM定义的稳定率这个概念为例,评估一个App的稳定性和品质,个别从以下三点综合思考: 产生了解体,如java解体和Native解体,即用解体率这个指标来评估计算; 产生了ANR,即用ANR率这个指标来评估计算; 异样退出,如:low memory killer、工作列表中划掉、零碎异样、断电、用户触发关机/重启等,即用异样率这个指标来评估计算。 解体,也就是程序出现异常,导致程序退出。包含: Java解体,也就是在Java代码中呈现了未捕捉异样,导致程序异样退出。如:空指针异样、数组越界异样等。 Native异样,也就是在Native代码中,呈现谬误产生相应的signal信号,导致程序异样退出。如:拜访非法地址、地址对其问题等。 Java解体的捕捉绝对会简略一些,Native解体的捕捉可能要求咱们对系统底层常识要有肯定的把握。咱们晓得Android是基于Linux零碎的,零碎中的解体大多是因为编码谬误或硬件谬误导致的。当零碎遇到不可复原的谬误时会通过异常中断的形式触发异样解决流程,这些中断的解决被对立为了信号量。当应用程序接管到某个信号量时会依照内核默认的动作解决,如Term、lgn、Core、Stop、Cont。同时咱们也能够通过sigaction注册接管信号来指定解决动作,比方捕捉解体信息等。当然捕捉过程中也会有一些艰难点,尤其在极其环境中,比方栈溢出时,因为栈空间曾经被用完,造成咱们的信号处理函数没法被调用,以至于无奈捕捉到解体信息,这时咱们须要思考应用signalstack,使咱们的信号处理函数能够在堆外面调配到一块内存空间作为“可替换信号栈”来解决解体信息。 当然,除了稳固、平安的捕捉能力外,还须要丰盛解体现场的上下文信息,比方Logcat信息、调用栈信息、设施信息、环境信息等等,为咱们后续定位和解决问题提供全面的参考。  对于产生解体的状况,咱们应用解体率作为数据指标。包含: UV解体率,也就是产生解体谬误的去重用户/去重沉闷总用户; PV解体率,也就是产生解体谬误的次数/启动次数; 启动解体率,也就是利用启动过程中产生的解体,很容易被疏忽但又十分重要的解体指标,因为启动是APP生命周期中十分重要的一个阶段,很多广告、闪屏、流动等内容都在这个过程中透出,同时启动时又须要加载各种初始化,并且如果启动呈现谬误,往往热修复、降级融灾策略都无法弥补。  ANR,也就是Application Not Responding,当应用程序一段时间无奈及时响应,则会弹出ANR对话框,让用户抉择持续期待,还是强制敞开。从用户体验的角度看,有时候ANR可能要比解体会带来更蹩脚的体验,所以开发者器重解体的同时也要非常重视ANR。  ANR捕捉的准确性始终是一直降级打怪、不断完善的过程。晚期咱们通过FileObserver 监听/data/anr/traces.txt文件的变动进行捕捉和上报,但很遗憾随着版本升级,零碎和厂商开始收紧系统文件但权限,此计划的笼罩设施状况越来越低,造成ANR捕捉的准确性也始终升高。 随后咱们改良为监控音讯队列的运行工夫的形式捕捉ANR,也就是向主线程Looper中放入一个空音讯,监听该空音讯在5秒后是否被执行,但该计划无奈实在的捕捉ANR状况(存在漏报和误报状况),并且也无奈失去残缺的ANR内容。后续咱们参考Android ANR的实现原理,实现了一套实时、精确的ANR捕捉计划,并且能够兼容所有零碎版本。咱们晓得零碎的system_server 过程在检测到 APP 呈现 ANR 后,会向呈现ANR 的过程发送 SIGQUIT (signal 3) 信号。默认状况,零碎的 libart.so 会收到该信号,并调用 Java 虚拟机的 dump 办法生成 traces。 咱们通过拦挡SIGQUT,在呈现ANR时优先接管到信号,并生成traces和ANR日志,在解决完信号后,将信号持续传递给零碎让系统生成traces文件,生成traces文件时,在保障内容与零碎原生的一致性的同时还对生成traces文件的速度进行了显著的晋升,无效地防止了可能因生成 traces 工夫过长,而被 system_server 应用 SIGKILL (signal 9) 再次强杀,同时咱们对捕捉到的内容进行了丰盛,包含:触发 ANR 的起因、手机中 TOP 过程CPU 使用率、ANR 过程中 TOP 线程 CPU 使用率、CPU 各外围解决工夫散布状况、磁盘 IO 操作期待时长等重要信息,对剖析、定位和解决 ANR 问题,提供了更加强有力的撑持! ...

March 9, 2021 · 1 min · jiezi

关于ios:IDA使用笔记

IDA比拟重要对几个窗口:IDA View-A汇编窗口,所有函数都列在一起.当初选取其重要局部来分析它的构造:1.一个函数的开始中央有上面这种正文语 =============== S U B R O U T I N E ======================================= EXPORT InitFunc_11 函数名为InitFunc_11,这里个别会有函数返回值和函数参数Data XREF函数申明地址End of function InitFunc_11 示意函数完结如图: 第二个重要窗口反汇编窗口Pseudocode,在IDA View-A窗口按下F5健,进入反汇编窗口 通过字符串查找应用改字符串的地位:1.关上Strings Window,按下Ctrl+f健搜寻字符串(可能中文的不大好使)2.双击搜寻后果跳转到IDA View-A界面,如果没有DATA XREF示意ida还没有破解实现3.双击DATA XREF后的函数或地址,跳转到函数汇编实现重要操作: X 键,抉择一个地址,按下X键,会弹出一个框,如果只有一个示意没有被其余函数援用(可能不正确) 抉择其中一个跳转到中央.

March 8, 2021 · 1 min · jiezi

关于ios:iOS-逆向hook的几种方法

1.hook oc办法,应该是用runtime实现的吧`#import <UIKit/UIKit.h> #import <Foundation/Foundation.h> %hook AppDelegate (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {} %end`2.hook 零碎的c办法,零碎的c办法hook次要用fishhook神器.要晓得fishhook的原理就要晓得内部动态链接库的加载原理.程序启动的时候,程序先通过dyld加载内部动态链接库(包含零碎库、dylib库),函数符号属于内部符号,因为ASLR偏移量动态链接库每次加载到内存的地址不定,就须要加载的时候将符号重绑定,以修改其地址内容.所用到的就是lazy_symbol_pointers(函数用到的时候再去绑定符号)和non-lazy_symbol_pointers(非懒加载,程序启动的时候就去符号绑定).fishhook就是批改了lazy_symbol_pointers(处于_DATA数据段,可读可写)和non-lazy_symbol_pointers的绑定符号,从而达到hook 零碎c办法的目标.具体代码:以uname函数为例int uname(struct utsname *);第一步:申明一个函数和原函数一样的(参数和返回值类型要保持一致)int (* origuname)(struct utsname *);第二步:实现一个和原函数一样的函数 int myuname(struct utsname *uts){ origuname(uts); char *mod = "_modified"; //机器名 strcat(uts->machine, mod);// Name of this network node strcat(uts->nodename, mod); strcat(uts->release, mod); strcat(uts->version, mod); strcat(uts->sysname, mod); NSLog(@"============ modify uname func"); return 0;}第三步:用fishhook绑定 + (void)toHookgettimeofday{ //定义rebinding构造体 struct rebinding nslogBind; //函数的名称 nslogBind.name = "uname"; //新的函数地址 nslogBind.replacement = myuname; //保留原始函数地址变量的指针 nslogBind.replaced = (void *)&origuname; // //定义数组 struct rebinding rebs[] = {nslogBind}; rebind_symbols(rebs, 1);}3.hook app里的c函数,这个因为符号表不是动静链接的,符号存在mach_o的__Text,_text代码段,只读权限无奈批改,所以只能换substrate去hook.第一步:通过ida剖析找到函数地址(先省了) ...

March 8, 2021 · 1 min · jiezi

关于ios:Flutter-2-正式发布

3月4日凌晨,Flutter 2 正式公布: 开发者为任何平台创立好看、疾速且可移植利用的能力得以更上一层楼。通过 Flutter 2,您能够应用雷同的代码库为五种操作系统构建原生利用: iOS、Android、Windows、macOS 和 Linux;以及为 Chrome、Firefox、Safari 和 Edge 等浏览器打造 web 体验。Flutter 甚至能够嵌入到汽车、电视和智能家电,为环境计算提供最普适、可移植的体验。 咱们的指标是从根本上扭转开发者的利用构建思路,让体验先于平台。Flutter 能够让您纵情雕刻精美的利用体验,畅快表白本人的品牌和设计格调。Flutter 能够将您的源代码编译为机器码,并疾速运行,同时借助有状态热重载性能为您带来了解释环境的高效生产力,让您能够在利用运行时做出更改并立刻查看后果。而且 Flutter 是开源的,有成千上万的贡献者在为外围框架添砖加瓦,并围绕其打造了蕴含海量 package 的生态系统。 在 公布 的 Flutter 2 中,咱们将 Flutter 从挪动框架扩大为可移植框架,让您的利用根本能够不加变动地在多种平台上运行。仅 Google Play 商店就已有超过 15 万款 Flutter 利用,而当初利用能够在无需重写的状况下部署到桌面设施和 web 平台,能够说每款利用都通过 Flutter 2 失去 "收费降级"。 世界各地的用户都在应用 Flutter,包含 WeChat、Grab、Yandex Go、Nubank、Sonos、Fastic、Betterment 和 realtor.com 等热门利用。Flutter 在 Google 也是备受依赖的重要工具,咱们有一千多名工程师正在应用 Dart 和 Flutter 构建利用。许多产品曾经公布,包含 Stadia、Google One 和 Google Nest Hub。 几个月前,Google Pay 改用 Flutter 打造其旗舰挪动利用,在生产力和品质上获得重大提高。通过对立代码库,团队打消了平台之间的性能差别,精简了超过 50 万行代码。Google Pay 还示意,其工程师效率大幅提高,技术债权显著缩小,并在 iOS 和 Android 零碎上对立了平安审查和试验等公布流程。 ...

March 7, 2021 · 2 min · jiezi

关于ios:iOS编译运行错误汇总

编译谬误<继续更新...> 运行谬误The request to open "bundleId" failed.题目:The request to open "bundleId" failed.形容:The reqeust denied by service delegate (SBMainWorkspace). 解决:Environment Variables中有个空参数,删除即可 参考:https://blog.csdn.net/qq_1505... <继续更新...>

March 6, 2021 · 1 min · jiezi

关于ios:Pano-React-Native-SDK-来了快速实现移动端音视频和白板

前言 React Native 是 Facebook 于2015年4月开源的跨平台挪动利用开发框架,反对iOS和安卓两大平台。React Native 着力于进步多平台开发的开发效率 —— Learn once, write anywhere。背靠着伟人的肩膀出世,React Native 一路景色有限,禁受住了重重考验。至今,它依然是挪动端跨平台开发的热门框架之一。 拍乐云Pano 是业余的实时通信PaaS云服务提供商,开发者通过集成 Pano SDK 即可在利用里疾速实现高清、稳固、易用、低时延的实时音视频和互动白板等。当 React Native 与 Pano SDK 相碰撞,会迸发出怎么灿烂的火花呢? 于是,Pano React Native SDK 来了! Pano React Native SDK 是基于 Pano SDK 封装的npm动态库。如果你也在应用 React Native 开发利用并且想要接入音视频通话和互动白板,那么本篇技术分享可能会对你有所帮忙。 筹备工作拍乐云开发者账户(通过拍乐云官网注册)React Native 0.60 及以上iOS 9.0及以上Android 4.4及以上iOS/Android设施(不反对模拟器)开始接入获取一个 App ID 和长期 Token应用开发者账户登陆 Pano 控制台,创立利用,获取 App ID 和长期 Token,前面将会用到。(创立利用获取长期 Token 请参考文档:创立第一个利用 https://developer.pano.video/...) 在利用中集成 panortc-react-native-sdk 在工程根目录下执行以下命令增加panortc-react-native-sdk依赖: yarn add @pano.video/panortc-react-native-sdk 或者 npm i --save @pano.video/panortc-react-native-sdk ...

March 5, 2021 · 2 min · jiezi

关于ios:让你的iOS-app配置多个环境

前言大多数开发者在开发的时候都会遇到多个环境的问题,development, test, production. 通常会通过宏或变量来管制,或者打包前手动切换环境变量,这种办法确实能够解决问题,只不过不是很优雅很高效。 开始吧 just do it!1. 新建Build Configuration如图 创立新配置 零碎默认是2个,一个Debug,一个Release。这里咱们须要抉择是复制一个Debug还是Release。每个环境都有Debug和Release配置,Release不能调试程序,因为默认是屏蔽了可调试的一些参数,具体能够看BuildSetting外面的区别,而且编译时有做编译优化,会比用Debug打包进去的体积更小一点。以开发和公布两个环境为例 (零碎默认的为开发环境)我的项目中应用了Pod 关上Configuration Set就会发现是如下的样子留神:刚刚新建完Build Configuration之后,这时如果有pod,请立刻执行一下 pod install pod装置实现之后会主动生成xcconfig文件 2. 新建Scheme如图复制一个Scheme更改配置为新的 Configuration 3.创立xcconfig文件配置我的项目目录 将xcconfig放到Config文件夹新建xcconfig文件在文件中创立一些变量 例如 // DevConfig.xcconfig// Environments// Server URLROOT_URL = http:/$()/localhost:3000// KeysAPI_KEY = 783u9djd8a_hkzos7jd803001nd//VariableTHEME_TITLE = "测试题目"// App SettingsAPP_NAME = Env-DevAPP_BUNDLE_ID = com.foo.env.dev 4.从我的项目设置拜访配置值回到 project - info - configurations 配置如下(图中有误) 配置一下拜访值配置多个icon 和 启动展位图进行这些更改后,能够应用“计划”选择器中的不同计划来构建和运行应用程序。后果是应用程序的两个不同版本,每个版本应用其相应的环境。 运行有效 能够尝试CocoaPods对现有我的项目的正文:如果您要在现有我的项目中应用CocoaPods,并且想要持续进行上来,则您须要做一些额定的工作来进行设置,因为CocoaPods具备本人的xcconfig文件。 删除.xcworkspace档案删除Podfile.lock文件和Pods/目录保留Podfile从新运行 pod install 5.从代码拜访配置值在info.plist中增加 CustomEnvironmentVariable 类型 为字典配置键值如当初这些变量在咱们的plist中了,咱们能够从Swift中拜访它们了。举荐的一种做法是创立Environment.swift文件。这将蕴含一个没有大小写的枚举,以用作拜访plist和其中蕴含的变量的命名空间。咱们将创立两个动态属性,rootURL 并将别离apiKey返回aURL和a String。咱们将在闭包中对其进行初始化,以蕴含从plist检索它们的逻辑,并fatalError:应用适当的音讯进行调用。 请留神,fatalError:在这种状况下,咱们已明确决定调用它,因为它示意编程谬误,而不是遇到预期的nil状态。咱们不心愿xcconfig文件或Info.plist不具备这些值,并且在提供此有用音讯的同时使应用程序解体将提供上下文并容许程序员进行纠正。 将此文件增加到_Configs_文件夹: //// Environment.swift// Environments//// Created by Foo on 2021/3/4.import Foundationpublic enum Environment { static let plistKey = "CustomEnvironmentVariable" // MARK: - Keys enum Keys { enum Plist { static let appName = "APP_NAME" static let themeTitle = "THEME_TITLE" } } // MARK: - Plist private static let infoDictionary: [String: Any] = { guard let dict = Bundle.main.infoDictionary else { fatalError("Plist file not found") } return dict }() // MARK: - Plist values static let appName: String = { guard let environmentVariable = Environment.infoDictionary[plistKey] as? [String: String] else { fatalError("Key environment not set in plist") } guard let value = environmentVariable[Keys.Plist.appName] else{ fatalError("This Key not set in plist environment") } return value }() static let themeTitle: String = { guard let environmentVariable = Environment.infoDictionary[plistKey] as? [String: String] else { fatalError("Key environment not set in plist") } guard let value = environmentVariable[Keys.Plist.themeTitle] else{ fatalError("This Key not set in plist environment") } return value }()}当初,咱们曾经创立了一种结构化的形式来拜访这些值在须要应用的调用 ...

March 4, 2021 · 2 min · jiezi

关于ios:CRMEB-Pro-v12快速打包-APP步骤详解

CRMEB Pro商城零碎是一款H5/公众号/小程序商城零碎,其后端开发使用了当下最为风行的技术,比方异步工作、数据库链接池、表单生成、长连贯、工作队列、定时工作、前后端拆散、Redis缓存等,前端也采纳前后端拆散的形式开发,实现了标准接口,挪动端应用uni-app作为开发框架,实现了多端数据互通,反对公众号+H5+小程序+PC+APP+DIY设计! 基于以上能够看出是一款十分优良的商城零碎,不过较为遗憾的是这是一款商业版零碎,须要付费,不过相比拟行业内同样配置的商城零碎动辄几十万的价格,这套零碎的价位就十分亲民,良心了! 不过该团队也开源了多个开源我的项目,同样也十分优良,有须要的小伙伴,能够去体验下良心开源我的项目,地址:http://github.crmeb.net/u/xingfu 回归主题,最近CRMEB团队降级了该零碎,对APP做了大量优化反对,第一工夫就去体验了,各方面相当不错,当初就将打包过程记录下来,分享给各位,对学习uni-app的同学也有肯定的帮忙! APP打包IDE软件HBuilder X,该零碎是采纳uni-app开发,所以打包就必须要依赖这款IDE! 根底配置一、模块配置关上我的项目点击 manifest.json模块配置勾选 领取、登录、分享、 ViderPlayer和本人须要用的模块填写相干配置 Ctrl+s 保留APP主动生成图标抉择一个1024x1024的图片传上去,生成一下就好了。 二、权限配置 安卓的曾经配置好了,ios的必须开发者填写相干的形容信息,须要用那些就填写哪些,ios必须填写具体,不然上架容易被拒!安卓的权限中文阐明地址:http://www.kjson.com/files/androidmanifest 三、模块配置 定位抉择高德地图,App端只反对高德地图,所以尽量抉择高德地图,key在高德开发平台就能够申请到OAuth 受权登录一键登录是uni-app官网自带的,详情请看官网文档地址:https://uniapp.dcloud.io/univerify 自定义第三方登录比方:微信登录请填写相干的配置就能够了留神:ios端如果蕴含了任何第三方登录,那必须也得把苹果登录也带上,不然苹果上架审核不通过 依据苹果审核指南要求,如果 app 应用第三方或社交登录服务 (例如,Facebook 登录、Google 登录、通过 Twitter 登录、通过 LinkedIn 登录、通过 Amazon 登录或微信登录) 来对其进行设置或验证这个 app 的用户主帐户,则该 app 必须同时提供“通过 Apple 登录”作为等同选项。详情参考:App Store 审核指南 - 通过 Apple 登录阐明:https://ask.dcloud.net.cn/art...领取、分享填写相干的配置就能够了如果有视频,须要勾选VideoPlayer(视频播放) 四、App罕用其它设置为了不便测试抉择了全副反对,测试的时候因为各种模拟器反对的不一样所以都勾选了,打包上线的时候抉择第一个就能够,不然ios容易呈现以下问题具体阐明能够看dcloud的文档:https://ask.dcloud.net.cn/art... 开发调试一、Windows端 装置java 抉择 Windows x64下载地址:https://www.oracle.com/java/t... 装置Android Studio (此软件须要翻墙),能够用这个中文网下载地址:http://www.android-studio.org/ 用andriod本人的开发调试工具会呈现代码热更新失败,安卓adb抵触,所以举荐第三方模拟器 装置雷电模拟器或者mumu模拟器 我这里抉择抉择的是mumu模拟器 装置好后在设置核心>高级设置抉择关上Hbuildx 编辑器设置Android模拟器端口配置和ADB门路 双击App.vue文件>点击运行>运行到手机或模拟器>Android模拟器端口配置mumu模拟器的默认端口是7555,别的模拟器端口须要去官方网站下面去查问,adb门路就是模拟器装置的门路,批改好后保留而后启动模拟器,重启HbuildX软件,期待一会点击运行>运行带手机或者模拟器 这时候就能看到模拟器的设施了,看不到的话须要敞开HbuildX,先开模拟器再关上HbuoldX编辑器而后点击运行就能够调试了 二、mac端装置xCode,装置苹果模拟器,在ios模拟器外面抉择手机款式三、真机调试 安卓连贯数据线之后开启开发者模式,不关上开发者辨认不到安卓手机苹果手机下载iTunes 官网说下载低版本的下载地址:https://mydown.yesky.com/pcso...而后点击运行-运行带手机或者模拟器就能够看到设施了,点击运行就行了四、各种问题解决方案 https://ask.dcloud.net.cn/art...https://ask.dcloud.net.cn/art...https://ask.dcloud.net.cn/art...打包上线一、安卓端 点击发行>原生-app云打包正式包和自定义调试基座的区别看这篇文章:https://ask.dcloud.net.cn/art... 生成证书教程:https://ask.dcloud.net.cn/art... 签名生成工具用于获取装置到手机的第三方利用签名的apk包。点击下载 [签名生成工具]下载链接:https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android2.apk配置好当前点击打包,打包胜利后管制有链接自行下载就能够了 在本人须要的平台选择性上架APP二、苹果端(必须在macOs零碎中操作以下流程) ...

March 4, 2021 · 1 min · jiezi

关于ios:React-Navigation-5x版本实战指南

如果你想理解React Navigation 5.x的根本的概念,能够查看我之前的发的一篇文章:React Navigation 5.x详解 如果说形成视图元素的根本单位是组件,那么形成应用程序的根本单位就是页面。在前端利用中,页面又称为路由,是应用程序页面的抽象概念。因为单页面的利用是不存在的,那么对于领有多个页面的应用程序来说,如何从一个页面平滑地过渡到另一个页面,就是路由须要实现的事件。在0.44版本之前。开发者能够间接应用官网提供的Navigator组件来实现页面的跳转,不过Navigator组件对于稍大的我的项目反对并不是很敌对,且代码的嵌套升高了代码的可读性。所以,官网举荐开发者应用react-navigation库来治理页面及其跳转。目前,react-navigation反对三种导航性能,别离是Tab导航、Drawer导航和Stack导航,它们的含意如下。 Tab Navigation:用于实现页面底部的Tab导航成果。Drawer Navigation:用于实现侧边栏抽屉导航成果。Stack Navigation:蕴含导航栏的页面导航组件,用于实现页面跳转。其中,开发中应用的最多的还是Stack Navigation。和应用其余的第三方库一样,应用react-navigation库之前须要先装置依赖脚本,如下所示。 npm install @react-navigation/nativenpm install react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view下面的依赖库是必须装置的,它们是其它导航库的根底库,并且这些根底库装置实现之后,还须要在原生工程中链接原生插件。对于iOS环境来说,关上原生iOS工程目录,而后执行pod install命令来装置原生插件即可。对于Android环境来说,因为最新的React Native应用到了很多的Androidx属性,所以应用react-navigation之前还须要在原生我的项目中增加Androidx属性的反对。应用Android Studio关上原生Android工程,而后在app/build.gradle文件中增加如下脚本代码。 android {… //省略其余脚本packagingOptions { pickFirst "lib/arm64-v8a/librealm-jni.so" }}configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" }}def useIntlJsc = falsedependencies { … //省略其余脚本 if (useIntlJsc) { implementation 'org.webkit:android-jsc-intl:+' } else { implementation 'org.webkit:android-jsc:+' }}从新编译我的项目,如果没有任何谬误则阐明胜利集成react-navigation,如果遇到其余问题,大家能够依据提醒进行批改。同时,因为Tab Navigation、Drawer Navigation和Stack Navigation属于不同的库,所以理论应用过程中还须要装置对应的性能库,如下所示。 npm install @react-navigation/stack //Stack导航npm install @react-navigation/bottom-tabs //Tab导航npm install @react-navigation/drawer //Drawer导航须要阐明是,下面的三个库是互相独立的,应用时须要依据需要状况来装置对应的性能库。react-navigation库一个最根本的性能就是实现路由的治理,路由治理应用的是Stack Navigation。借助Stack Navigation,开发者能够很轻松的治理路由页面。和Android中的Activity栈治理一样,每次关上一个的新页面时,新页面都会被放到路由栈的顶部。首先,新建HomePage和DetailPage两个页面,代码如下。 const HomePage=(navigation)=> { function jumpDetail() { navigation.navigate('Detail'); } return ( <View style={styles.ct}> <TouchableOpacity style={styles.touchableStyle} onPress={jumpDetail}> <Text style={styles.txtStyle}> 跳转详情页面 </Text> </TouchableOpacity> </View> );}const DetailPage=()=> { return ( <View style={styles.ct}> <Text style={{fontSize: 24}}>Detail Screen</Text> </View> );}接下来,应用createStackNavigator()函数创立一个路由堆栈导航器,记得应用export关键字导出文件,如下所示。 ...

March 4, 2021 · 2 min · jiezi

关于ios:iOS-Fastlane

问题天天打包,即使面对的是肤白貌美小姐姐,终有装置辨认别烦我的苦恼以及事到一半打个包的郁闷, 咋整? Fastlane吧! 思路 1.xcode-select装置,确定装置了最新版本 xcode-select --install2.装置fastlane, 独自装置,去掉sudo; 应用零碎自带的ruby,须要sudo权限 sudo gem install fastlane3.我的项目根目录,初始化fastlane fastlane init // 命令行// 执行后果What would you like to use fastlane for?1. ???? Automate screenshots2. ????✈️ Automate beta distribution to TestFlight3. ???? Automate App Store distribution4. ???? Manual setup - manually setup your project to automate your tasks? 44.配置下Fastfile文件 default_platform(:ios)platform :ios do lane :beta_release do |options| # 版本号设置 increment_build_number( build_number: options[:buildnumber] ) # 打包ipa文件 buildapp( workspace: "xxx.xcworkspace", configuration: "Release", scheme: "xxx", export_method: "ad-hoc", output_name: "xxx.ipa" ) # 上传到蒲公英 pgyer(api_key: "xxx", user_key: "xxx", update_description: options[:message]) end desc "build app" private_lane :buildapp do |options| gym( workspace: options[:workspace], configuration: options[:configuration], scheme: options[:scheme], clean: true, export_method: options[:export_method], output_directory: "./fastlane/package/", output_name: options[:output_name], sdk: "iphoneos" ) end end5.管制Version版本号设置自增 ...

March 3, 2021 · 1 min · jiezi

关于ios:iOS之CoreBluetooth

思路 手机与设施间的通信形式CoreBluetooth是比拟常见且通用的。在iOS开发中需清晰以下几点 蓝牙4.0最多可联机7个设施,iPhone6以上都是蓝牙4.0两台iPhone并不间接通过蓝牙相互搜寻配对苹果设施不反对和其余非苹果设施连贯蓝牙,当然,除了蓝牙耳机和车载蓝牙之外蓝牙传输的字节程序是小端CoreBluetooth的最大传输单元是20个字节常识科普: 字节程序只是对内置数据类型而言 例如对于一整型(int,int 是内置数据类型)数,比方 0x123456大端模式:高地址---------->低地址 0x56 | 0x34 | 0x12小端模式:高地址 ---------->低地址0x12 | 0x34 | 0x56 流程 以核心设施为例剖析整个流程 1.实例化核心设施管理者 cManager = CBCentralManager(delegate: self, queue: nil)2.监测状态为PowOn,并搜寻左近设施 func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state == .poweredOn { scanForServices() } else { print("\(central.state)") }}3.发现外设,保留并展现 func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { if let name = peripheral.name { if !list.contains(name) { list.append(name) dict[name] = peripheral table.reloadData() } }}4.依据须要抉择连贯的外设 ...

March 3, 2021 · 2 min · jiezi

关于ios:视频直播app和网页版怎么开发

视频直播APP和网页开发定制的几个性能点: 1、直播类软件最次要的性能是反对手机APP端和电脑端视频直播推流,稳固低提早,保障画面传输晦涩、清晰。 2、主播间接连麦PK、和用户互动聊天,包含文字和表情等。 3、用户可间接通过手机直播APP用在线领取购买礼物、以及身份座驾。给主播打赏等,主播收到礼物后可和平台折算抽成。 一套成熟的直播平台APP和网页版零碎,根本要做到以下几点: 1、保障视频直播品质和用户体验 2、直播APP画面的低提早 数据传输是依照直播视频客户端上传到服务器,服务器再下传到客户端的模式。优质的传输技术设计,是保障系统直播晦涩的关键因素。 3、全平台终端反对,零碎残缺度:像点量直播零碎,反对PC端、Android端和IOS端主播一键开播、用户间接观看,全套技术残缺闭环,间接能够上线经营。 一套成熟的直播平台,源代码也是比拟成熟,对运营者来说,能够搭建后间接上线经营,也能够拿到源代码后按需二次开发后,节省时间,投入使用。

March 1, 2021 · 1 min · jiezi

关于ios:从预编译的角度理解Swift与ObjectiveC及混编机制

写在后面本文涉及面较广,篇幅较长,浏览完须要消耗肯定的工夫与精力,如果你带有较为明确的浏览目标,能够参考以下倡议实现浏览: 如果你对预编译的理论知识曾经理解,能够间接从【原来它是这样的】的章节开始进行浏览,这会让你对预编译有一个更直观的理解。如果你对 Search Path 的工作机制感兴趣,能够间接从【对于第一个问题】的章节浏览,这会让你更粗浅,更全面的理解到它们的运作机制,如果您对 Xcode Phases 里的 Header 的设置感到蛊惑,能够间接从【揭开 Public、Private、Project 的实在面目】的章节开始浏览,这会让你了解为什么说 Private 并不是真正的公有头文件如果你想理解如何通过 hmap 技术晋升编译速度,能够从【基于 hmap 优化 Search Path 的策略】的章节开始浏览,这会给你提供一种新的编译减速思路。如果你想理解如何通过 VFS 技术进行 Swift 产物的构建,能够从 【对于第二个问题】章节开始浏览,这会让你了解如何用另外一种晋升构建 Swift 产物的效率。如果你想理解 Swift 和 Objective-C 是如何找寻办法申明的,能够从 【Swift 来了】的章节浏览,这会让你从原理上了解混编的外围思路和解决方案。概述随着 Swift 的倒退,国内技术社区呈现了一些对于如何实现 Swift 与 Objective-C 混编的文章,这些文章的次要内容还是围绕着领导开发者进行各种操作来实现混编的成果,例如在 Build Setting 中开启某个选项,在 podspec 中减少某个字段,而鲜有文章对这些操作背地的工作机制做分析,大部分外围概念也都是一笔带过。 正是因为这种现状,很多开发者在面对与预期不符的行为时,亦或者遇到各种奇怪的报错时,都会无从下手,而这也是因为对其工作原理不够理解所导致的。 笔者在美团平台负责 CI/CD 相干的工作,这其中也蕴含了 Objective-C 与 Swift 混编的内容,出于让更多开发者可能进一步了解混编工作机制的目标,撰写了这篇技术文章。 废话不多说,咱们开始吧! 预编译常识指北#import 的机制和毛病在咱们应用某些零碎组件的时候,咱们通常会写出如下模式的代码: #import <UIKit/UIKit.h>#import 其实是 #include 语法的渺小翻新,它们在实质上还是非常靠近的。#include 做的事件其实就是简略的复制粘贴,将指标 .h 文件中的内容一字不落地拷贝到以后文件中,并替换掉这句 #include,而 #import 本质上做的事件和 #include 是一样的,只不过它还多了一个可能防止头文件反复援用的能力而已。 ...

March 1, 2021 · 15 min · jiezi

关于ios:一款可以让大型iOS工程编译速度提升50的工具

cocoapods-hmap-prebuilt 是什么?cocoapods-hmap-prebuilt 是美团平台迭代组自研的一款 cocoapods 插件,以 Header Map 技术 为根底,进一步晋升代码的编译速度,欠缺头文件的搜寻机制。 尽管以二进制组件的形式构建 App 是 HPX (美团挪动端对立继续集成/交付平台)的支流解决方案,但在某些场景下(Profile、Address/Thread/UB/Coverage Sanitizer、App 级别动态查看、ObjC 办法调用兼容性查看等等),咱们的构建工作还是须要以全源码编译的形式进行;而且在理论开发过程中,大多是以源码的形式进行开发,所以咱们将试验对象设置为基于全源码编译的流程。 废话不多说,咱们来看看它的理论应用成果! 总的来说,以美团和公众点评的全源码编译流程为试验对象的前提下,cocoapods-hmap-prebuilt 插件能将总链路晋升 45% 以上的速度,在 Xcode 打包环节上能晋升 50% 以上的速度,是不是有点动心了? 为了更好的了解这个插件的价值和性能,咱们无妨先看一下以后的工程中存在的问题。 为什么现有的我的项目不够好?目前,美团内的 App 都是基于 CocoaPods 做包治理方面的工作,所以在理论的开发过程中,CocoaPods 会在 Pods/Header/ 目录下增加组件名目录和头文件软链,相似于上面的模式: /Users/sketchk/Desktop/MyApp/Pods└── Headers ├── Private │ └── AFNetworking │ ├── AFHTTPRequestOperation.h -> ./XXX/AFHTTPRequestOperation.h │ ├── AFHTTPRequestOperationManager.h -> ./XXX/AFHTTPRequestOperationManager.h │ ├── ... │ └── UIRefreshControl+AFNetworking.h -> ./XXX/UIRefreshControl+AFNetworking.h └── Public └── AFNetworking    ├── AFHTTPRequestOperation.h -> ./XXX/AFHTTPRequestOperation.h    ├── AFHTTPRequestOperationManager.h -> ./XXX/AFHTTPRequestOperationManager.h    ├── ...    └── UIRefreshControl+AFNetworking.h -> ./XXX/UIRefreshControl+AFNetworking.h也正是通过这样的目录构造和软链,CocoaPods 得以在 Header Search Path 中增加如下的参数,使得预编译环节顺利进行。 ...

March 1, 2021 · 4 min · jiezi

关于ios:iOS-MultipeerConnectivity

问题 承接上文[iOS实现WIFI传书],如果去掉局域网会如何?是否实现设施间文件传输 iOS设施间的数据传输罕用形式: 1.蓝牙2.airdrop3.MultipeerConnectivity该篇单讲MultipeerConnectivity 上菜 设施作为服务端 要有一个标记本人的PeerIDlazy var me: MCPeerID = { let peer = MCPeerID(displayName: UIDevice.current.name) return peer}()一个sessionlazy var session: MCSession = { let ss = MCSession(peer: me, securityIdentity: nil, encryptionPreference: .none) ss.delegate = self return ss}()播送进来,其余设施能力搜寻到lazy var advertiser: MCNearbyServiceAdvertiser = { let advertiser = MCNearbyServiceAdvertiser(peer: me, discoveryInfo: ["demo": "data"], serviceType: "shanzhai") advertiser.delegate = self return advertiser}()开始播送advertiser.startAdvertisingPeer()播送的代理办法执行extension MultipeerConnectVC: MCNearbyServiceAdvertiserDelegate { func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) { // 确认连贯,赋值session invitationHandler(true, session) } func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) { advertiser.stopAdvertisingPeer() print("Woops! Advertising failed with error \(String(describing: error))") }}设施作为客户端 ...

March 1, 2021 · 2 min · jiezi

关于ios:iOS中web与Js的交互

问题感觉到uni-app框架有pit,公司强推该框架的小哥识趣的闭嘴,思考到全盘替换周期跟老本挺大,基于uni-app能打包成H5,采纳webview+js的原生形式集成 根本构造:原生壳 + webview[iOS & Android] + js 计划确定根底框架后,次要的问题就是web与js的交互,限于技术能力,只谈iOS方向 首先,UIWebView用的不多,曾经iOS14+了,用UIWebView不被diss的话,大略你们团队也就那样了,其对应的交互框架为JavaScriptCore。Pass不讲 再次,可拦挡跳转的url并解析,以约定好的key/value,调用原生办法,该交互方式满足简略的性能需要,仅限web唤起iOS调用,看状况 接着,WKWebview中,JS调用native办法,通过WKScriptMessageHandler协定,外围是:window.webkit.messageHandlers.办法名.postMessage(参数),native调用JS就简略很多,外围是:[weblview evaluateJavaScript:xxx completionHandler: ^(id object, NSError * _Nullable error) { }]; 如上:如果有异步操作,怎么办?如果实现block岂不更好? 最初:WebViewJavascriptBridge,来吧,你值得领有 分析1.js调用native办法 - html中web中按钮点击,- bridge调用callHandler, - 调用_doSend()- 赋值messagingIframe.src = xxx://__wvjb_queue_message__- native的webview执行代理办法decidePolicyForNavigationAction- 获取url, native执行WKFlushMessageQueue- webview执行evaluateJavaScript, 调用js的_fetchQueue(),把_doSend()调用时写入sendMessageQueue中的值取出来,即获取js传递过去的参数- native办法flushMessageQueue,解决js传递过去的参数,封装在block中- 留神:js传递过去的参数,有可能还有function回调的存在,function是解决js调用native之后,native的执行后果回调给js,造成一个js->native->js的过程。2.native调用js办法 - native中的bridge调用callHandler办法- BridgeBase中调用-(void)sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName- BridgeBase中调用_queueMessage- 这里有个判断,当startupMessageQueue!=nil时,音讯放在数组中,当=nil时,间接调用_dispatchMessage- native中startupMessageQueue在执行injectJavascriptFile办法后会被设置为nil- injectJavascriptFile追溯可知当decidePolicyForNavigationAction中判断url的host=__bridge_loaded__时调用,- 而在js中设置的bridge时设置的WVJBIframe.src = 'https://__bridge_loaded__', 到此应该不必多问,分析_dispatchMessage- _dispatchMessage中执行_evaluateJavascript, 执行的js中的办法_handleMessageFromObjC(xxx)- Bridge_JS中查问_dispatchMessageFromObjC, 接着调用_dispatchMessageFromObjC- 此时设置回调A-block, 外面的数据是js中的执行后果,js在开始的时候注册registerHandler,是key/block,此时通过key能够找到对应的B-block,将message传递过去的data跟设置的A-block当做对应的key/block的B-block的参数,间接执行该B-block即可。可能在js的registerHandler中获取到native传递过去的参数,同时也可能通过A-block将js的执行后果回调给native3.总结 初始化时给web注入不少料,外围是 1.拦挡url, 2.回调实现基于初始化注入字典便于key/value形式治理block 3.evaluateJavaScript执行js4.延长 如上的做法适宜UIWebView&WKWebView。实际上如果只针对WKWebView的话,可在_doSend办法中间接调用window.webkit.messageHandlers.xxx.postMessage(null),而非设置src的形式。可参照WKWebViewJavascriptBridgeGame Over。

February 27, 2021 · 1 min · jiezi

关于ios:丁磊炮轰安卓高抽成称其对产业生态非常不利

在昨日网易的财报电话会议上,网易CEO丁磊示意:中国的安卓分成是全世界最贵的,高达50%,网易有几个游戏是30%,比方《梦幻西游》。目前的分成生态是不衰弱的,因为国内安卓的抽成比苹果还贵20%左右,心愿当前安卓市场可能在游戏分成上跟国内接轨,即使是海内,当初也只有30%,所以50%的分成是没理由的,这对产业生态而言是十分不利的。 当下在线游戏特地是挪动端游戏,成为了网易最外围的业务,财报显示,第四季度网易在线游戏服务净收入134亿元,同比增加15.5%,相当于均匀每天进账约1.5亿元,2020年全年,网易游戏营收冲破500亿元,达546.1亿元。反推抽成金额,能够看到网易至多要交上百亿人民币给渠道,如此微小的费用,也难怪丁磊要公开发声。 在网易之前已有不少游戏研发商认为渠道分成过于低廉,开始公开和渠道破裂,如此前热门游戏《万国沉睡》和《原神》。还有今年年初华为游戏核心社区将腾讯游戏下架,过后就有音讯称华为之所以下架腾讯游戏,就是因为单方的分成比例没有谈拢。 原本开发者们对与「苹果税」曾经疾恶如仇,可没想到国内的安卓分成居然能还高出「苹果税」 20%,不过随着腾讯、网易和一些游戏厂商的相继发声,将来规定肯定会改写,安卓渠道们会更多吸纳游戏研发商的意见,因为苹果曾经成了前事不忘;后事之师。 就在最近,荷兰成为了全世界第一个对苹果作出反垄断裁决的国家,荷兰消费者和市场局(ACM)示意行将出台一则解决决定草案,无关此前苹果要求开发者应用自家的利用内领取零碎,并抽取15%到30%的支出作为佣金的事件。目前尚未披露将作出怎么的解决决定,但已知的是ACM也在考察苹果的其余涉嫌垄断行为,比方苹果禁止iOS软件开发商告知用户,在iOS软件之外,还有其余老本更低的领取伎俩。

February 26, 2021 · 1 min · jiezi

关于ios:比尔盖茨-ClubHouse-首秀探讨操作系统疫情比特币与气候变化

近期,微软联结创始人比尔·盖茨(Bill Gates)正在通过各种渠道推广他的新书《如何防止气象劫难》(How to Avoid a Climate Disaster)。本周三,他首次来到最近火爆的语音社交平台 Clubhouse,与 CNBC 记者安德鲁·罗斯·索尔金(Andrew Ross Sorkin)在一个小时的交换中分享了对新冠疫情、比特币与气候变化的分割、为何应用 Android 手机等观点,以及他在疫情期间居家隔离时的追剧轶事。以下是盖茨此次分享的次要内容: 一、习惯 Android,但和应用 iPhone 并不矛盾因为 Clubhouse 目前只兼容 iOS 零碎,所以很多人好奇这位微软联结创始人是否投入了老对手的怀抱,购买了一部iPhone手机。但盖茨示意,其实并非如此,他平时罕用的手机并非苹果制作。 “有的 Android 厂商预装的微软软件对我来说很不便。”盖茨说,“他们处理软件与操作系统之间的关系时更加灵便。这也是我最终习惯 Android 的起因……我有很多敌人用 iPhone,所以这并不矛盾。” Clubhouse 联结创始人保罗·戴维森(Paul Davison)也曾在对话期间短暂进入房间,他通知盖茨和索尔金,Android 版 Clubhouse 是该公司目前的重中之重。 二、不像马斯克那么有钱,就慎入比特币"马斯克有很多钱,他是个很前沿的人,所以我并不放心他的比特币会随机上涨和上涨。但我认为,没有雷同储蓄的人可能会陷入一种妄想,如果不像伊隆马斯克那么富裕,那可能就须要小心谨慎。"盖茨在直播间里示意,他对比特币汇率的上涨并不乐观。并且制作比特币须要大量的能量,对环境不利。 索尔金问盖茨,他对比特币引发的“气象争执”有何认识。这种观点认为,加密货币的挖矿过程须要耗费大量的计算能力,而且十分耗电。事实上,盖茨之前也针对这一问题明确表态并不看好比特币。 “比特币在每笔交易过程中耗费的电量超过人类已知的任何一种领取形式。所以从气象角度来讲,它的影响很大。”盖茨说,“如果应用绿色能源,而且没有排斥其余应用形式,那或者没有大碍。只管你可能因为我还没有投资比特币就给我贴上‘比特币怀疑论者’的标签,但我不认为这些事件之间有太多关联。我投资疟疾疫苗、麻疹疫苗,还投资生产各种产品的公司。但这种模式不是为了低买高卖。不过,如果其他人能用这种形式发家致富,我会为他们鼓掌。” 盖茨补充说,其实还有其余形式来做数字货币,但重点并不在于机密交易。他走漏,比尔和梅琳达盖茨基金会就在投资这样的服务,帮忙印度和非洲最贫苦的人口脱贫。 三、新冠疫情中犯的谬误太多了,政府须要吸取教训盖茨一周前注射了第二剂新冠疫苗,与第一剂大概距离一个月。“这是我惟一一次因为本人是一个 65 岁的老人而感到庆幸。”他说。依据盖茨所在的华盛顿州的规定,老年人享有新冠疫苗的优先接种权。 在被问及何时能力安心出行时,盖茨答复道:“我心愿建立一个好的楷模。你即便注射了疫苗,仍然会传染病毒。我不会因而就不戴口罩,或者放松警觉,尤其是在跟其余还没有打疫苗的老年人相处时。应该要到春末或者夏天能力通过数字理解状况,那时能力‘放肆’一些。” 盖茨重申应该在所有国家或地区散发疫苗,而不能只在富裕国家接种,只有这样次能力真正放松寰球旅行限度。他预计美国到今年夏天会有很大改观,所有学校应该在秋天开学,但儿童依然应该佩戴口罩。 “戴口罩不是什么了不起的事件,价格不贵,咱们也曾经慢慢习惯了。”他说,“我会始终言传身教,始终戴到秋天,直到明确感化人数曾经大幅缩小为止。” 谈到整个美国社会是否通过这场疫情意识到置信迷信的重要性时,盖茨示意,领导力在危机中至关重要,领导人应该违心分享负面音讯,并制订一套适合的测试零碎。 “疫情中犯的谬误太多了,多到不堪设想。”盖茨说,“咱们很庆幸病毒的致命性还不算太强。但依然有 50 万美国人死亡,这个数字难以置信。我认为,这至多会给一代人留下记忆,政府也会吸取教训,采取失当的措施,即使可能还是会有 10% 或 20% 的人永远不会置信——大选显然也是这种状况——但这是件庄重的事件。少数人身边都有人死于疫情。” 在盖茨的新书《如何防止一场气象劫难》(How to Avoid a Climate Disaster)中,他为寰球实现净零排放制订了一份全面的策略路线图,指出了须要哪些额定的翻新能力获得成功。 鉴于此,盖茨基金会也正在![上传失败,undefined]()强烈呼吁各国政府、私营部门和国内组织增强社会保障体系,帮忙最软弱社区的人取得信贷、保险和储蓄的机会。此外,因为气候变化对水资源、土壤、森林等其余重要的自然资源都造成了越来越顽劣的影响,公共政策应及时意识到这些问题,并尽可能爱护好这些自然资源。 四、与 10 年前相比,当初的内容制作之精良令人震惊与普通人一样,盖茨也在疫情中花了很多业余时间观看 Netflix 等平台上的电视节目。他示意,与 10 年前相比,当初的内容制作之精良令人震惊,呈现了很多让人爱不释手的内容。 “简单的情节,精良的制作,就连纪录片的成果都很惊人。”盖茨说。他还补充道,他本周有一天早晨本来筹备看完一本书,后果却迷上了 Netflix 上的一部法语悬疑惊悚剧《亚森·罗宾》(Lupin)。 ...

February 26, 2021 · 1 min · jiezi