ionic——使用本地代理服务器解决http跨域问题

在ionic开发中我们常常会遇到http请求相关问题。在设备中我们常用的方法是使用白名单插件cordova-plugin-whitelist。通过在config.xml中配置<access origin="*"/>参数来对http请求进行本地化而解决跨域问题。但是我们在实际开发中我们经常使用ionic serveionic run ios -l -c -s来进行调试工作。使用白名单插件无法正常运行。这里就要使用代理服务器了。

什么是代理服务器

代理服务器就是一个将http请求进行中转的服务器。以代理服务器的名义去访问远程服务器。而ionic CLI就提供了一个本地的代理服务器来解决$http跨域的问题

如何使用代理服务器

在项目根目录下找到文件ionic.config.json添加proxies字段。如下:

1
2
3
4
5
6
7
8
9
10
{
"name": "test",
"app_id": "",
"proxies": [
{
"path": "/api",
"proxyUrl": "http://api.yourdomain.com"
}
]
}

使代理服务器监控path字段的http请求。将相应请求通过代理服务器中转发送到proxyUrl字段的地址上

当你访问/api的时候。实际上是发送到http://api.yourdomain.com。如请求/api/data.json。实际上请求的是远程服务器http://api.yourdomain.com/data.json的数据。在项目目录中api文件夹其实不存在

同时代理服务器能设置多个以满足不同的需求

定义常量方便切换开发环境与发布环境

代理服务器的使用仅在ionic CLI环境在才能工作。在真机下实际上是会真的访问/api目录导致404错误的。为了解决问题需要设置全局常量以方便不同环境下的切换。

1
2
.constant('ApiServer', '/api')
//.constant('ApiServer', 'http://api.yourdomain.com')

使用如下:

1
2
3
4
5
6
7
8
9
.controller('test',function($scope, ApiServer){
var url = ApiServer + "/data.json"
$http.get(url)
.success(function(data,status,headers,config) {
console.log(data);
}).error(function(data,status,headers,config){
console.log(status);
});
})

MMD静画渲染

最近花了几天时间去入了一下MMD的大坑。想着渲染几张静画来当一下桌面的壁纸。不过裙子什么的真是太难弄了。物理引擎有点坑。

第二弹

纯黑背景下的微笑miku

第三弹

天台miku

第四弹

黄昏下的教室之新房45°

第五弹

星夜下的爱蜜莉雅

网络不好怎么办?通过分析找出原因

我们经常会遇到这样那样的网络问题。比如游戏玩着玩着卡死了。游戏丢包。网速上不去等等。可能的原因多种多样。我们要通过一些科学的分析找出原因,才能对症下药。

【可能原因一:电脑<--->路由器】
这种情况其实并不少见。其根本原因是在于网络传输的可靠性低。可能的原因的有很多。比如网卡、网线、路由器过热、路由器老化等等。如何检测?按下win+r输入cmd打开命令行。输入ipconfig找到我们使用的网卡。比如:

找到网关比如我的网关设置是192.168.1.1。那么在命令行中输入命令ping 192.168.1.1 -t对我们的网关进行ping。具体地址视自己情况而定。后面跟上-t表示无限期。也就是一直ping下去。观察返回结果。如果出现如下情况:

在一堆低延时中出现一个高延时。甚至超时。那么就是电脑到路由器之间发生了问题。可能的解决方案如下

  • 重启电脑
  • 重启路由
  • 换个路由器
  • 换个网卡

PS:按下 Ctrl+C 结束ping

如果出现一直是高延时甚至是超时,那么就是长期不稳定。可能的解决方案如下:

  • 关闭电脑一段时间
  • 关闭路由一段时间
  • 更换网线(如为无线可以视信号情况尝试使用无线信号放大器)
  • 更换路由
  • 更换网卡

【可能原因二:路由器<--->运营商】
最常见的问题。个人的电脑虽然很卡。但是其实路由器到运营商的线路其实已经满负荷了。说明可能是有陌生人连入了wifi。或者有舍友或者同事占用了网速。唯一的方法是进入路由器的后台界面。查看各个用户的使用情况。把不认识的人的mac地址屏蔽。
相信大家都知道这些方法。网络上也有很多。在此不加赘述。

【可能原因三:运营商<--->因特网】
这种情况多出现在铁通,长宽等二级运营商。这些运营商是从电信、网通等一级运营商购买了他们的带宽,然后再经过一定的分流与调整。下放到普通用户中。其特点是价格便宜,网络不稳定。偶尔还会出现网页无法访问,DNS劫持等情况。这些是用户个人无法解决的。唯一的方法就是上网时段避开高峰期,网络情况就会有所改良。
所以建议不要贪便宜购买二级运营商的网络服务

【可能原因四:因特网<--->服务器】
如果出现其他都正常,就一个不正常。那么很可能是远程服务器出现了故障。比如用户量太大,被黑客攻击,服务器瘫痪、维护、关闭等等。当然也有可能是DNS解析出错。查查自己的HOSTS文件。看看有没有奇怪的东西。如果有,删掉或在前面加#号注释掉
HOSTS文件路径:C:\windows\system32\drivers\etc

Unity物理碰撞

unity物理碰撞大致能分为两大类:碰撞与触发。其碰撞具体属性由物体上的碰撞器组件(Collider)决定。而物体的物理性质由物体上的刚体组件(Rigidbody)决定。为使两个物体满足碰撞/触发条件。必须满足如下条件:

  • 两个物体所在的层(Layer)为可相互碰撞的两个层
  • 两个物体都必须有碰撞器组件
  • 两个物体中至少有一个物体拥有刚体组件

满足如上条件方可使物体产生碰撞事件

碰撞与触发不同。碰撞会阻碍物体运动而触发不会。其区别由碰撞器组件上Is Trigger标识区别
碰撞函数:
OnCollisionEnter/OnCollisionExit/OnCollisionStay
触发函数:
OnTriggerEnter/OnTriggerExit/OnTriggerStay

总结一些好用的ios第三方库

进行ios开发有一段时间了,也真实使用了一些好用的第三方库。这里开始进行一些总结。也算为后来者提供一个方向

AFNetworking

进行基于webservice开发的必备互联网套件,然而其实我就没用。个人喜欢比较轻量级一点的东西。相对其他第三方库来说有些重了
github
cocoapods

SDWebImage

好用的网络图片加载工具。一行代码解决异步懒加载图片与本地缓存
github
cocoapods

MJRefresh

一个国人自产的ios下拉刷新与上拉加载的库,支持纯文字,静态图片与gif动图
github
cocoapods

SwiftyJSON

Swift原生JSON解析库。感觉一般。但是是Swift的,所以我用了
github
cocoapods

iOS编程——让NSURL认识特殊字符

正如我之前所说。其实NSURL(string:String)这个用法对于输入参数的字符串验证是很蠢的。因为他有自己的一套判定机制。比如在Github API编程中使用如下网址:

https://api.github.com/search/repositories?sort=stars&order=desc&q=stars:>500

NSURL就不认识。因为在他的q字段中有一个特殊字符>。如果将这段网址直接输入浏览器是毫无问题的。然而NSURL不认。
因为NSURL使用的是web服务最底层的API判定。事实上最基础的浏览器也是无法直接输入这段网址的。因为这是个不合法的网址。之所以我们能在浏览器直接使用是因为浏览器本身对输入的网址进行了转译的操作。这个操作是不可见的。因此解决方案也是让iOS在处理这段带有特殊字符的网址进行转译操作。解决方案如下:

1
2
let url = "https://api.github.com/search/repositories?sort=stars&order=desc&q=stars:>500"
let _url = NSURL(string:url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)

通过stringByAddingPercentEscapesUsingEncoding方法将网址转译。成功通过编译。

转译后的网址:

https://api.github.com/search/repositories?sort=stars&order=desc&q=stars:%3E500

输入浏览器后会发现和原来的一样。地址栏自动将%3E转译成>

任务栏快速启动真实地址

最近被流氓软件劫持了浏览器主页。打开chrome后会自动跳转到hao360上。真实原因是快捷方式启动时被加入了网站地址的参数。只要删除了就好了。然而桌面上的快捷方式很好修改。但是任务栏中的快速启动栏的快捷方式怎么也不好修改。取消固定重新弄也没办法消除。因此在多番查询后终于找到了其真实地址

任务栏快速启动文件真实地址:
当前用户文件夹下的
\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar

iOS编程时需要注意的一些问题

  • 异步编程
    很多时候我们需要异步获取数据然后在用户界面上实时的反应异步获取到的数据。如果发现会卡。不能马上将界面上的数据修改。不妨试试强制将代码在主线程中执行。因为异步代码的执行线程和界面绘制的主线程是两个独立的线程
    1
    2
    3
    dispatch_sync(dispatch_get_main_queue()) { 
    //code
    }

国际化标准时间格式




























































































































Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996;96
M Month in year Month July;Jul;07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday;Tue
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time;PST;GMT-08:00
Z Time zone RFC 822 time zone -0800

Mac中的字符中英文问题

NSURL 是 OC 或 Swift编程中对http网络通信很常见的一个方法。常用的方法是NSURL(string: "http://.../")
在这里要注意一点。string的参数中不能有中文字符。否则会报错。

fatal error: unexpectedly found nil while unwrapping an Optional value

需要注意的是。在mac中,和windows不同的是,有很多windows中英文通用的字符在mac中并不通用。比如在Mac中中文的=与英文的=并不等价。这点可以在Mac中打开记事本在两个输入法中切换一下输入试试。以及其他的很多字符都会出现这种问题。而两者的差别非常大。又因为输入的是字符串。编译器并不会提示这种问题。因此当编写OC或Swift的时候出现这种摸不着头脑的事情。不放重新输入一遍试试。或许会有意外的收获