Android、iOS http请求加上User-agent

最近在排查一些问题,发现很难下手,nginx 的log如下:

182.37.109.153 - - [25/Aug/2013:00:02:52 +0800] "-" 400 0 "-" "-" "-"
182.37.109.153 - - [25/Aug/2013:00:02:52 +0800] "-" 400 0 "-" "-" "-"
182.37.109.153 - - [25/Aug/2013:00:02:52 +0800] "-" 400 0 "-" "-" "-"
171.36.8.66 - - [25/Aug/2013:09:40:07 +0800] "POST /xxxxx.htm HTTP/1.1" 200 251 "-" "-" "-"

不知道哪个请求是Android,哪个是iOS的。Square的Jack在演讲中提到过,他们最开始做后台系统,基于twitter有过的经验,第一个系统不是实现后台交易功能,而是控制台,先做好监控用户的每个交易行为,使得可控。

iOS 如果使用 ASIHTTPRequest 库,ASIHTTPRequest.m 里的代码如下:

[self setDefaultUserAgentString:[NSString stringWithFormat:@"%@ %@ (%@; %@ %@; %@)", appName, appVersion, deviceName, OSName, OSVersion, locale]];
得到默认的 User-agent: “miniCashbox 2.0.6 (iPhone; iPhone OS 6.1.3; zh_CN)”

Android可以使用系统提供的,需要设置
HttpProtocolParams.setUserAgent(params, System.getProperty(“http.agent”));
结果为:User-agent: “Dalvik/1.6.0 (Linux; U; Android 4.1.2; Nexus S Build/JZO54K)”

根据实际需要,以上的 User-agent 还不足够满足需要,比如想要知道是哪个用户发送的请求,但不可能把用户id显示出来,那么就需要显示设备的唯一标识 Device Id。系统设计时,用户与终端设备信息的关系是: user has_many devices。从常用的QQ、微信在移动终端登录体验过程中,我们可以感受到的。给客户端做消息push推送,更需要如此做。

参考: http://cdrussell.blogspot.com/2012/09/programmatically-get-user-agent-string.html

新浪微博Android客户端实战 – 使用ActionBarSherlock与MenuDrawer

很久没有为 Android for WordPress 项目贡献代码了,最近他们把代码放在 github 上,pull requests 方便了许多。之前我都是在trac上给他们提交patch, 新建一个ticket 贴上 svn diff 的结果,苦不堪言,最后只好放弃。在google play 上更新了客户端,界面比以前有很大的进步,可圈可点。因此,我决定参考wordpress, 使用上 ActionBarSherlock 与 MenuDrawer, 替换 android-action 组件。为什么一开始使用 android-action?因为 actionbar 的颜色我喜欢,而且组件使用简单。学习 ActionBarSherlock 是有些成本的,编译 sample 示例,边看效果边看代码。

主要修改点:

1. 将 android.app.Activity 替换为 SherlockActivity

// file: BaseActivity.java
import com.actionbarsherlock.app.SherlockActivity;

public class BaseActivity extends SherlockActivity {
// activity implementation
}

2. getMenuInflater 修改为 getSupportMenuInflater,注意,要把android 自带导入的Menu包删掉,导入ActionBarSherlock的包,不然会提示无法 Override onCreateOptionsMenu。

3. 把项目中 libs/android-support-v4.jar 干掉,这个会与abs的冲突。eclipse 报错:

Found 2 versions of android-support-v4.jar in the dependency list, but not all the versions are identical (check is based on SHA-1 only at this time).
All versions of the libraries must be the same at this time.
Jar mismatch! Fix your dependencies

4. abs 进度条尺寸很大,需要改小一点的,参考: Android: Changing the Default Indeterminate Progress Size in ActionBarSherlock

ActionBarSherlock 修改记录: https://github.com/lytsing/weibo/commit/3d6f203a390460b4cdd1c8f8543c523ad55f0ccb

使用 MenuDrawer

MenuDrawer 跟 abs 可以很好的结合使用,照着 android-menudrawer-abs-sample 写。修改记录:https://github.com/lytsing/weibo/commit/15e61dc2fbb556b68db21d2fe8a4d0e2aadc4938 图标,背景颜色,后期再需要调整。

Google I/O 2013 – Volley: Easy, Fast Networking for Android

我把这视频高清版本从youtube下载优放在优酷上,地址: http://v.youku.com/v_show/id_XNTU4ODgzNjg4.html ppt下载: Volley

以前反编译过android market,发现里面有用到volley,起这么个名字不知道啥用的,现在才知道主讲者Ficus Kirkpatrick 就是负责开发Google play 的。

看完视频,发现 Jeff Sharkey 就利用它写了简单的Flickr 客户端 , 这速度快得没的说。在前面写的新浪微博客户,Timeline 图片异步下载,使用的是AQuery.image, 但效果还是差一点,于是也考虑试试 volley,代码提交记录见 https://github.com/lytsing/weibo/commit/7c84aea7ae27e6fa7da7aa4e477e41e07c1d79ac 。图片加载性能改善很多,谁用谁知道 :-)

有人问:

Network loaded images in a list view? Solved by several different Android libraries, 3 years ago ;)

https://github.com/koush/UrlImageViewHelper/

https://github.com/nostra13/Android-Universal-Image-Loader

https://code.google.com/p/android-query/wiki/ImageLoading

Ficus 回答说:

Volley does a lot more than that, and does better at the images problem than any of them.

volley 没有提供jar包,需要自己手动编译,使用方法:

git clone https://android.googlesource.com/platform/frameworks/volley
cd volley
android update project -p .
ant jar

拷贝 bin/volley 到 libs 文件夹下面。注意,这个库要求最低SDK版本为Froyo,即至少要设置android:minSdkVersion为8以上。

Android 来电归属地显示

有网友邮件问, “你好,能否指导一下如在在源码里面添加通话归属地的支持?例如给CM7添加通话归属地。”

基本上,没有什么技术含量。但这个功能对小白用户太有吸引力了,哪里来的电话,很快的识别是不是骗子的电话,心里至少有个底。回到BBS telnet年代,在大学校园里,使用Cterm,鼠标掠过ip地址,当某个未曾见面的网友的ip显示是隔壁楼女生宿舍的,那种兴奋惊讶的感觉真是美妙。后来保护隐私,几乎所有高校的BBS都把ip后面两位以星号代替。扯远了。

玩过第一款Android手机 HTC G1的人都知道,蛋总做的ROM,那是相当的好用。蛋总基于cm的本地化,里面有来电归属地显示,那时觉得很贴心呀,于是做逆向工程,贡献出来放在 github上,没想到很多人也用上了。搜了一下github,原来cytown 早把代码开源出来。geesun 提交一次代码 merge from froyo version for Chinese Phone location 参考这个就可以自己手动修改了。

关于归属地数据库 phoneloc.dat ,很多论坛都贴出最新的版本。这是个二进制文件,具体格式,请看这个 手机号归属地数据导入及查询工具源代码(C++) phoneloc 是在这个基础上做优化的。

新浪微博Android客户端实战 – 查看详细微微博信息

Only those who have the patience to do simple things perfectly ever acquire the skill to do difficult things easily. 只有那些有耐心将小事做好的人才能掌握轻而易举完成难事的技巧。 ——Friedrich Schiller

上一节实现了Timeline, 点击某条记录,进入新的Activity,观看更详细的信息,实现的功能有:

  • 加载中等大小的图片
  • 显示地理位置信息
  • 加载评论
  • 转发、评论、收藏

预览图如下:

微博详细信息

微博详细信息

上面是微博信息,跟Timeline的差不多,layout布局稍作调整,其中图片显示为中等大小的图片,根据地理位置经纬度参数,插入Google地图。

中间位置是评论信息,放在ListView里,那么就遇到了滚动问题,本博客有篇小文 千万不要把Listview放在ScrollView里 描述了这种情况,那么这里也使用MergeAdapter,把不同的view合在一块。

最下边的位置,提供快速回复,方便输入。

那么转发、评论、收藏放在ActionBar即可,因为不是常用的功能。

完成了这些,到这里先打住,定时的回头自己给自己做 code review,删除没用的代码,要下狠心清理掉垃圾代码,对代码有洁癖感。顺便提一提实际开发过程中需要注意的,这些是初学开发者累犯的错误,有的甚至是有经验的工程师,平时对自己要求不严,就容易犯下这样的错误。

调试Log信息

插入调试信息,输入 aaaaaaaaa, bbbbbbbbbbbbbbbbb, —————— 1111111111111111111 222222222222222 这样没有规范的调试log。千万不要偷懒,再这样下去,别人看到你的代码,显得不够专业,是业余水平。而且不要烂使用 System.out.println 函数,统一使用 Android 提供的Log 方法,无论是哪个手机操作系统或者其他大型的系统,都有自己封装的Log函数,一致的使用只有好处没有坏处。这里问题又来了,有的使用一律使用Log.e 插入调试信息,问ta为什么?ta说醒目啊,一看都是红色的,令人哭笑不得。

语言国际化及文件编码

有的图省事在代码直接写入赤裸裸的中文,后期老板要求发个英文版的,才搞得很抓狂,狂修改,又引入新的bug,情绪很低落,真是恨铁不成钢啊。Windows 程序员习惯了gbk,压根儿没考虑到自己的代码会放在Linux/Mac 上,别的同事一看,擦,都是乱码!提醒下在eclipse把文件编码改为UTF-8,一个团队各有在Windows,Linux, Mac环境下工作很正常。

严谨,切记

讲个真实的故事,我们团队一工程师平时在代码注释里喜欢写shit, fuck之类的言语,程序员发泄嘛,可以理解。有次上线的版本,已经传到了国内各大电子市场,测试才发现打开应用有shit字样,老板暴跳如雷。赶紧fix掉,发布新版本,强制升级。这个字样在svn最新代码库里已经没有了,编译时没有及时更新代码到最新版本,导致悲剧发生。

代码参看: https://github.com/lytsing/weibo/blob/master/weibo/src/org/lytsing/android/weibo/ui/StatusDetailActivity.java

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ... 18 19 20 Next