Devhua's Blog

爱生活,有理想,会思考,能沟通!


  • 首页

  • 归档

  • 分类

  • 标签

  • 留言

读《周鸿祎自述:我的互联网方法论》

发表于 2018-04-20   |   分类于 阅读   |  

背景:这本书跟我们做互联网产品相关,尤其是在做一款创新型人工智能产品时,需要团队成员能有互联网思维,通过互联网方法,能为了一致的目标团结一起,将产品做到极致。不过书中谈到的很多都是前几年吵的比较火的概念,自己也一直在互联网圈子里,所以对他提到的观点和看法也是了解的。

不得不说,这本书讲的还是非常通俗易懂的,老周从自己的做360的初衷、过程及遇到的问题和解决方式思维,多个角度分析了自己在互联网这块的认识和简介。简单来讲就是,以免费带量,靠增值服务来赚钱;用户至上,体验为王。

阅读全文 »

iOS近期知识总结

发表于 2017-12-20   |   分类于 技术   |  

1.APP之间通信方式有哪些

  • URL Scheme
    (在info.plist中配置LSApplicationQueriesSchemes,指定目标app的scheme,然后在目标app的info.plist中配置好URL types)场景:分享,支付等
  • Keychain
    本质是sqlite数据库,独立每个app的沙盒之外,即使删除app,keychain中的信息还存在
    特点:不同app之间需要通过keychain access groups才行,同一个teamID
    场景:用户登录信息保存,同一平台上多个app之间实现统一账户登录
  • UIPasteboard
    系统剪切板 场景:淘宝口令
  • UIDocumentInteractionController 系统级别,同设备上app之间的共享文档,以及文档预览,打印,发邮件和复制等
  • local socket
    app1在本地端口port1234建立socket tcp的bind和listen,APP2在同一端口port1234 发起tcp的connect连接
    场景:某个App1具有特殊的能力,比如能够跟硬件进行通信,在硬件上处理相关数据。而App2则没有这个能力,但是它能给App1提供相关的数据,这样APP2跟App1建立本地socket连接,传输数据到App1,然后App1在把数据传给硬件进行处理。
    缺陷:需要后台运行,因此,系统在任意时刻只有一个app在前台运行,那么就需要通信的另一方具备后台运行权限,类似导航,音乐,蓝牙通信类

2.json解析及第三方库分析

  • 苹果原生NSJSONSerialization
    原生有一些解析未进行容错处理
    //如:如何被解析的JSON数据如果既不是字典也不是数组(比如是NSString), 那么就必须使用这

    1
    2
    3
    NSJSONReadingAllowFragments
    NSData *data = [test dataUsingEncoding:NSUTF8StringEncoding]
    id obj = [NSJSONSerialization JSONObjectWithData: data options:NSJSONReadingAllowFragments error:nil];
  • SBJSON 、JSONModel
    字典转模型框架:
    a.Mantle 需要继承自MTModel
    b.JSONModel 需要继承自JSONModel
    c.MJExtension 不需要继承,无代码侵入性(运行时)
    注意点:json解析中,jsonkit解析空数据时会变成NSNull类型,既不是nil也是string。解决方案可以使用NullSafe
    使用afnetwork时可以设置self.removesKeysWithNullValues = YES;

3.AFNetwork3.x源码解析

源文件简而言之:AFHTTPSessionManager -> 简单的HTTP请求封装
AFURLSessionManager -> 网络通信核心,负责调配NSURLSession启动网络任务,设置session代理的转发、操作回调线程执行、组装参数及解析参数的调配等
AFNetworkReachabilityManager -> 网络状态监控
AFSecurityPolicy -> 网络安全策略
AFURLRequestSerialization/AFURLResponseSerialization -> 数据序列化和反序列化
工具包AF UIKit -> 图片下载及缓存策略,网络请求时状态栏上的菊花出现时机等
追问:self.operationQueue.maxConcurrentOperationCount = 1 AF3.x中操作队列并发线程数设置为1的目的?

阅读全文 »

GCP Shadowsocks

发表于 2017-11-24   |   分类于 Network   |  

一键式通过GCP自建科学上网服务

1.前期准备

需要准备一张visa卡(本人使用的是招行visa信用卡),在google cloud platform注册账号信息

说明:GCP新用户有免费一年的使用时长,配额是300美金

阅读全文 »

WKWebview tips

发表于 2017-04-24   |   分类于 技术   |  

WKWebview 踩坑之旅

前言

关于iOS 8后出来的WKWebview的简介,及对比UIWebview的优势 就不再做赘述了。可以参考
nshipster介绍WKWebview
学习WKWebview需研究源码,可以调试下miniBrowser项目

背景

在WKWebview出来这几年后,老项目一直未迁移到wkwebview,尽管我们知道它有着60 fps滚动刷新率,内存占用少,和safari相同的JavaScript引擎等优势,但由于其本身的不完善和一些坑点以及迁移的工作量等问题,一直未深入研究迁移方案。
但多个UIWebview浏览的内存暴涨导致容易crash一直是块心病。于是还是尝试迁移到wkwebview,便有了一段踩坑之旅。

阅读全文 »

iOS应用脱壳与重签名

发表于 2016-11-05   |   分类于 技术   |  

前期干货

iOS破壳

用dumpdecrypted给App砸壳

iOS逆向工程之给App脱壳

给微信加 hook 尝试记录

一步一步实现iOS微信自动抢红包(非越狱)

工具:

hopper:对脱壳app进行反汇编、反编译 可以分析app二进制文件
dumpdecrypted:用于脱壳
class-dump:对脱壳app 导出头文件

越狱设备一台(当时是6s Plus ,ios9.2)
越狱后安装有 cydia ,通过cydia安装openSSH,可以通过网段连接到mac

阅读全文 »

iOS RunLoop理解及实践场景分析

发表于 2016-09-14   |   分类于 技术   |  

前言

线程知识:

线程是任务分解成不同的工作单元分配给线程去执行,解决了多任务并发执行的问题,提高了系统性能。在现代交互式系统中,还存在大量的未知不确定的异步事件,这时候线程是一直是出于等待状态的,直到有事件发生才会唤醒线程去执行,执行完成后系统又恢复到以前的等待状态。

如何控制线程在等待和执行任务状态间无缝切换,就引入了RunLoop的概念。

一、RunLoop概念介绍

RunLoop称为事件循环,可以理解为系统中对各种事件源不间断的循环的处理。

应用在运行过程中会产生大量的系统和用户事件,包括定时器事件,用户交互事件(鼠标键盘触控板操作),模态窗口事件,各种系统Source事件,应用自定义的Source事件等等,每种事件都会存储到不同的FIFO先进先去的队列,等待事件循环依次处理。

被RunLoop管理的线程在挂起时,不会占用系统的CPU资源,可以说RunLoop是非常高效的线程管理技术。

RunLoop的作用:

  • a.使程序一直运行并接受用户输入
  • b.决定程序在何时应该处理哪些Event
  • c.调用解耦(Message Queue消息队列)- 比如用户手势操作,被调方队列处理一系列的事件
  • d.节省CPU时间(操作系统按照时间片调度)每个程序按照时间片切分执行,RunLoop使线程没事就休眠
阅读全文 »

iOS 网络层架构设计与实现

发表于 2016-03-20   |   分类于 技术   |  

前言

客户端网络层交互流程:

  • 获取参数,统一配置
  • 根据API配置公共参数
  • 构造网络请求
  • 发送网络请求
  • 获取返回结果
  • 展示数据

注:此处还应该有个 数据持久化 流程,因项目业务层逻辑及存储方案各不相同,本篇中不展开介绍
另:本篇幅中暂时只涉及到HTTP的请求,TCP及UDP的网络交互处理又不一样,需要考虑的也不相同(如:TCP考虑包顺序处理及回调分发问题,UDP考虑丢包及无序处理)

记录: iOS TCP链接使用 GCDAsyncSocket库;
UDP简单实现丢包处理方法,给文件分块,每个数据包的头部添加一个唯一标识序号的ID值,当接收到的包头部ID不是期望中的ID号,则判定丢包,将丢包ID发回服务端,服务端接收到丢包响应则重发丢失的数据包
UDP模拟TCP协议三次握手,这样对丢包处理有帮助

本文是博主15年读casa中网络层设计方案的记录与思考总结。

阅读全文 »

非典型程序猿羊年总结

发表于 2016-02-05   |   分类于 生活   |  

工作

14年底到15年年初的工作一言难尽,自己从嵌入式转到iOS开发,新的平台新的部门都需要重新学习和提高,压力可想而知。年初终于在我们大C司定岗,正式成为一个iOS开发,非常感谢我的三位iOS启蒙导师(李思哥哥、陆爷、彦群),他们帮助我跨过前期的障碍,也看到移动开发技术的未来。总体来讲,自己看到既年轻又活跃的天空,跟着团队也逐步认识到了一个创业团队的磨合期和碰撞期。风云变幻,莫笑少年愁。

阅读全文 »

GCD死锁大作战

发表于 2016-01-25   |   分类于 技术   |  

GCD死锁大作战

什么是死锁

死锁(deadlock) 通常是当多个线程在相互等待着对方的结束时,就会发生死锁,这时程序可能会被卡住。此时就导致了deadlock!
dead-lock.png

串行与并行

在使用GCD的时候,我们会把需要处理的任务放到Block中,然后将任务追加到相应的队列里面,这个队列,叫做Dispatch Queue。然而,存在于两种Dispatch Queue,一种是要等待上一个执行完,再执行下一个的Serial Dispatch Queue,这叫做串行队列;另一种,则是不需要上一个执行完,就能执行下一个的Concurrent Dispatch Queue,叫做并行队列。这两种,均遵循FIFO原则。

dispatch_get_global_queue为全局并行队列

dispatch_get_main_queue为主线程串行队列

阅读全文 »

Change Your App Icon at build time

发表于 2016-01-06   |   分类于 技术   |  

需求背景

为了区分线上版本、测试版本以及调试版本,我们在开发过程中一般会修改bunlde Id以便在一个设备上安装不同版本的App。然而问题来了,如何快速区分出桌面上的App是什么版本呢?最直观的就是改变App图标,达到显而易见的目的。


在看了这篇译文后,利用脚本可以非常便利的实现这个需求(这是原文)。虽然译文翻译有些问题,但还是确实让大家能伸手一把(原文作者真心是手把手教学)。

阅读全文 »
洛上倾城华少

洛上倾城华少

谁的头顶上没有灰尘,谁的肩上没有过齿痕

10 日志
4 分类
3 标签
RSS
GitHub Weibo
友情链接
  • double dragon
  • 王小新
© 2015 - 2019 洛上倾城华少
由 Hexo 强力驱动
主题 - NexT.Muse
本站总访问量次 本站访客数人次