userAgent和stringByEvaluatingJava
用户代理userAgent##
[来自百度百科]用户代理 User Agent,是指浏览器,它的信息包括硬件平台、系统软件、应用软件和用户个人偏好。在X.400电子系统中,用户代理是一种对数据打包、创造分组头,以及编址、传递消息的部件。用户代理并不是仅指浏览器,还包括搜索引擎。
1、用户代理是指浏览器,它的信息包括硬件平台、系统软件、应用软件和用户个人偏好。用户代理的能力和偏好可以认为是元数据或用户代理的硬件和软件的特性和描述;
2、SIP终端系统称为用户代理,即UA(UserAgent),含用户代理客户机UAC(UserAgentClient)和用户代理服务器UAS(UserAgentserver)两部分;
3、SIP将终端用户称为用户代理,请求方称为用户代理客户,被请求方称为用户代理服务器。UAC负责发起SIP呼叫请求,UAS接收UAC的请求并负责对其做出响应(接受、拒绝或重定向)。
为什么所有浏览器的userAgent都带Mozilla
Mozilla是Netscape的吉祥物,也是Netscape Navigator浏览器使用的内部开发代号。由于Netscape早期的影响力,直到今天,所有浏览器包括IE,向Web服务器报告自己的浏览器标识的 时候,都以 “Mozilla”开头,表明自己是Mozilla兼容的。
iOS相关###
Apple开发了Safari,使用了KHTML,同时也增加了很多新特性,后来干脆一锅煮,另起炉灶叫了WebKit,但是它有希望能够得到那些为KHTML编写的网页,于是Safari标称自己为Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5,这个世界更混乱了。
关于stringByEvaluatingJavaScriptFromString##
用户使用我的浏览器浏览网页,服务器可以得到我的浏览器名称和版本号,站长工具能查看到客户端来源。解决思路就是修改系统默认的用户代理UserAgent。
// 获取 iOS 默认的 UserAgent,可以很巧妙地创建一个空的UIWebView来获取:
NSString *userAgent = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
// 获取App名称,我的App有本地化支持,所以是如下的写法
NSString *appName = NSLocalizedStringFromTable(@"CFBundleDisplayName", @"InfoPlist", nil);
NSString *version = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"];
NSString *customUserAgent = [userAgent stringByAppendingFormat:@" %@/%@", appName, version];
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent":customUserAgent}];
registerDefault特性##
[http://www.cnblogs.com/letmefly/archive/2012/07/14/2591735.html][转至]
NSUserDefaults用于存储一些app setting。当你关闭app之后再打开后,之前存储的setting依然可以从NSUserDefaults里读取。注意:密码最好不要存储在NSUserDefaults里,要存储也必须用AES/DES加密存储,更安全的方法是 https://github.com/ldandersen/scifihifi-iphone
把密码存储在NSUserDefault or plist里的后果: http://www.shushao.com/news/info/item/203510-ios
example 1: 读取NSUserDefaults里的"color" setting
[[NSUserDefaults standardUserDefaults] stringForKey:@"color"];
example 2: 写入NSUserDefaults里的"color" setting为"red"
[[NSUserDefaults standardUserDefaults] setObject:@"red" forKey:@"color"];
//另外NSUserDefaults还提供了一个**registerDefaults**方法,通常在appDelegate的
didFinishLaunchingWithOptions里调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"blue", @"color",nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
return YES;
}
registerDefaults方法调用时会check NSUserDefaults里是否已经存在了相同的key,如果有则不会把其覆盖。举个例子:
1 当第一次run上面的app时,"color"="blue"会写入NSUserDefaults里
2 然后你的app调用了
[[NSUserDefaults standardUserDefaults] setObject:@"red" forKey:@"color"];
这时NSUserDefaults里"color"="red"
- exit app and restart it,registerDefaults方法还是会被调用,但它check到"color" key已经存在,就不会把它写入NSUserDefaults中
这时NSUserDefaults里"color"="red"
- 修改registerDefaults方法变成
NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"black", @"color",nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
然后重新run app,之后NSUserDefaults里依然"color"="red"
- 修改registerDefaults方法变成
NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"black", @"color",@"tomson", @"username",nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
然后重新run app,之后NSUserDefaults里依然"color"="red",不过多了a pair of key-value: username=tomson
注意:
- If you terminate your app by pressing "Stop" in Xcode (in the Simulator or on the device), your User Defaults might get saved
- 我没试过NSUserDefaults在exit app之后被保存,有人说碰到,并给出代码调用""的解决方案
ref links:
http://stackoverflow.com/questions/6033385/nsuserdefaults-not-being-saved-in-simulator
http://stackoverflow.com/questions/2622754/why-is-nsuserdefaults-not-saving-my-values