最近公司新开了一个项目,由于我的同事的离职,所以就剩我自己了。于是就果断的使用纯纯Swift写了,之前也用过Swift,不过很早了,那时候Swift还不稳定,每次一升级Xcode,Swift升级以后语法也跟着变了,所以就多了一堆的警告。现在Swift进化到3.X了,Swift众多新特性的支持,让我果断的要投入生产环境使用了。

这篇博客是项目上线了,可以有两天的空闲时间了,可以写写博客了,记录一下第一个Swift项目遇到的一些问题。也会顺带开源一些我写的小控件,大家可以参考或者使用一下。


Tips

1.webkit相关

内置的浏览器抛弃webview升级到了webkit,内存等各方面都要比之前好很多。不同的地方是还要实现WKUIDelegate的协议,因为alert弹窗都是需要你实现协议了,这样更能让自己的app的web部分和原生部分样式等方面的统一。不过和前端交互的时候需要我这边自定义User-Agent(UA),以确定到底是在哪打开(微信,android,其它手机浏览器?)的。WKWebView有个属性是customUserAgent,不过遗憾的是只能在iOS9.0以上使用,我还要兼容iOS8呢。

不过我喜欢把这种配置单独的在程序的某个单例里面,这样即使有多个包裹WKWebView的controller也可以统一配置(在程序启动的时候执行一下了事)。因为我还不想破坏掉原有的UA,我只是想在保留原有的UA的基础上,在符合UA规则下添加一条自定义的参数即可,毕竟完全自定义UA在访问其他站点的时候可能会有浏览器识别问题。基于这两点就踩了一个坑:

WKWebView有个方法可以获取当点的默认UA

  1. open func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Swift.Void)? = nil)

但是因为是通过回调的方式,虽然WKWebView已经晚于设置UA好久了,还是会有不能生效的问题,只有第二次new WKWebView的对象才可以,很奇怪。无奈啊,后来想到了之前的UIWebView,在那个全局配置的单例里面通过

  1. open func stringByEvaluatingJavaScript(from script: String) -> String?

获取设备默认的UA,然后拼接字符串,然后再通过设置

  1. UserDefaults.standard.register(defaults: ["UserAgent": newUA])

就可以了。

2.String转Class

这次也把我之前的一篇博客的iOS controller解耦探究实现——第一次写博客OC代码用Swift重写。

这个东西的主要原理就是通过String转Class,这个要用到OC的Runtime(感觉还是离不开这种拥有魔法黑科技的Runtime啊),结果String不是单单的ClassName了,需要添加App本身的Bundle name加英文点号再加ClassName。具体的苹果官方文档有说明。示例如下:

let myPersonClass: AnyClass? = NSClassFromString("MyGreatApp.Person")

暂时就想起来了以上2个小Tips,以后想起来再做补充吧

Swift开源库

SwiftyJSON

用过Swift原生的解析json就知道了,因为Swift引入了optional,虽然使得Swift比OC更安全了,但是对于多层级的json取值简直能折磨死人。用了SwiftyJSON,感觉整个Swift的json解析再也不是问题了。强烈安利使用,看看这个库的源代码,基本也能学习不少知识呢。

Kingfisher

一个Swift的图片下异步加载缓存模块,作者也是说了受SDWebImage的启发。写的也非常棒,效果也很好。当然因为要配合我自己的一个banner轮播图控件,我修改了一下源代码(仅仅修改了图片的缓存文件夹),哈哈,我的修改版也放在了我的GitHub,在cunstom分支里面。

可以在CocoaPods这样引用就可以了

  1. pod 'Kingfisher', :git => 'https://github.com/ysk666666/Kingfisher.git', :branch => 'custom'

PS:一开始我都用了SDWebImage了,也写了很多的逻辑了,但是后来发现了这个库后,看了一下代码,真的很棒,然后又用了一个小时把之前的逻辑都迁移到了Kingfisher 上面,

Swift App项目总结的更多相关文章

  1. swift开源项目精选

    Swift 开源项目精选-v1.0 2016-03-07 22:11 542人阅读 评论(0) 收藏 举报  分类: iOS(55)   Swift(4)    目录(?)[+]   转自 http: ...

  2. 43个优秀的Swift开源项目

    作为一门集百家之长的新语言,Swift拥有着苹果先天的生态优势,而其在GitHub上各种优秀的开源项目也层出不穷.本文作者@SwiftLanguage从2014年6月苹果发布Swift语言以来,便通过 ...

  3. 必须Mark!43个优秀的Swift开源项目推荐

    摘要:拥有着苹果先天生态优势的Swift自发布以来,各种优秀的开源项目便层出不穷.本文作者站在个人的角度,将2014年Swift开源项目做了一个甄别.筛选,从工具.存储.网络.界面.框架到Demo以及 ...

  4. 【转】43个优秀的Swift开源项目推荐

    作为一门集百家之长的新语言,Swift拥有着苹果先天的生态优势,而其在GitHub上各种优秀的开源项目也层出不穷.本文作者@SwiftLanguage从2014年6月苹果发布Swift语言以来,便通过 ...

  5. Swift 开源项目练习应用

    小的View.动画实现练习 拥有着苹果先天生态优势的Swift自发布以来,各种优秀的开源项目便层出不穷.本文作者站在个人的角度,将2014年Swift开源项目做了一个甄别.筛选,从工具.存储.网络.界 ...

  6. 400多个开源项目以及43个优秀的Swift开源项目-Swift编程语言资料大合集

    Swift 基于C和Objective-C,是供iOS和OS X应用编程的全新语言,更加高效.现代.安全,可以提升应用性能,同时降低开发难度. Swift仍然处于beta测试的阶段,会在iOS 8发布 ...

  7. Swift 开源项目精选

    Swift 开源项目精选 站在个人的角度,并基于<Swift 语言指南>,针对开源项目做了一个甄别.筛选.当然,由于个人能力及涉足范围所限,还远远不够,其中肯定有偏颇及不足,还望同学们多多 ...

  8. 我在开发第一个Swift App过程中学到的四件事

    本文转载至 http://www.itjhwd.com/wzkfyigeswiftsjs/ 译者注:本文作者Greg Heo,这是他为讲授iOS 8 App Extensions视频教程而实际使用Sw ...

  9. 必须Mark!43个优秀的Swift开源项目推荐(转)

    作为一门集百家之长的新语言,Swift拥有着苹果先天的生态优势,而其在GitHub上各种优秀的开源项目也层出不穷.本文作者@SwiftLanguage从2014年6月苹果发布Swift语言以来,便通过 ...

随机推荐

  1. POJ 1007

    DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 83069 Accepted: 33428 Descrip ...

  2. 解决xmapp中Apache端口号占用问题

    [原]解决 "安装xmapp后Apache不能正常启动" 问题 小伙伴们安装xmapp后发现Apache不能正常开启,下面给出了不同情况的解决办法,可以分为以下几种情况分析问题: ...

  3. JDK安装以及安装过程中出现的问题(日志二)

    上一篇:初识hadoop-历史及其家族(日志一) 我安装的这个版本的Ubuntu,已经在java包中存在了,所以当使用java -version的时候,会出现下载包的提示,使用apt-get命令之后, ...

  4. [刷题]算法竞赛入门经典(第2版) 5-5/UVa10391 - Compound Words

    题意:问在一个词典里,那些单词是复合词,即哪些单词是由两个单词拼出来的. 渣渣代码:(Accepted, 30ms) //UVa10391 - Compound Words #include<i ...

  5. 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】

    首先,了解一下循环嵌套的特点:外层循环转一次,内层循环转一圈. 在上一篇随笔中详细介绍了JS中的分支结构和循环结构,我们来简单的回顾一下For循环结构: 1.for循环有三个表达式,分别为: ①定义循 ...

  6. 《Android进阶》Sqlite的使用

    之前认为Sqlite只能一次性创建多个表,其实不是 关键是对Sqlite的操作需要一些技巧: package com.example.mydemo; import android.content.Co ...

  7. .net实现多重继承问题(virtual)

    C#中是没有类的多重继承这个概念.要使用多重继承必须要通过接口Interface来完成, 一.接口类 interface  getTable{      DataTable Getdatatable( ...

  8. Iterator(es6)

    1.任何数据结构只要部署了Iterator接口(本质是一个指针对象),也就是部署了Symbol.iterator属性,便可以完成遍历操作:数组原生就具备Iterator接口,就可以用for...of遍 ...

  9. 磁盘分区-gdisk用法

    gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-modemenu ...

  10. 并行类加载与OSGI类加载

    这回来分析一下OSGI的类加载机制. 先说一下OSGI能解决什么问题吧. 记得在上家公司的时候,经常参与上线.上线一般都是增加了一些功能或者修改了一些功能,然后将所有的代码重新部署.过程中要将之前的服 ...