求一个没iOS 12锁定屏幕的iOS日区号!

处理i18n国际电话区号的代码实践
招聘信息:
作者: 授权本站转载。前言上周在忙产品的国际化(i18n)的问题,其中一个很重要的地方就是电话号码的国际化(我们以电话号码为主账号)。电话号码有个很重要的部分就是区号。上图是我们产品的登录界面,除了常规的电话号码之外,前面还有一个区号,代表这个电话号码所属的是哪个国家和地区。关于区号的概念,可以看一下。看到这里 可能有人奇怪 这有什么难的? 不就是按照列表来展示吗? 这样有几个问题由于是支持多语言 那么不同的语言环境的系统 显示出来的国家名称是不一样的 比如“中国” 简体中文是“中国” 英文是“China” 韩文是“???????” 其在各个语言中的显示排序都是不一样的如果根据不同国家和语言来维护一张这样的表 工作量太大 一般的公司估计做不来所以这个工作我们就会放到本地来做 不过iOS已经帮我们做了一部分工作了 我们可以根据来获取某个国家或在当前区域中的本地化名称//获取当前locale
NSLocale&*locale&=&[NSLocale&currentLocale];
//获取所有国家的代码
NSArray&*countryArray&=&[NSLocale&ISOCountryCodes];
for&(NSString&*countryCode&in&countryArray)&
&&&&//根据当前locale和国家短码&获取指定国家的本地化名称
&&&&NSString&*localName&=&[locale&displayNameForKey:NSLocaleCountryCode&value:countryCode];
}我们简单测试一下NSArray&*countryArray&&=&[NSLocale&ISOCountryCodes];
NSArray&*languageArray&=&@[@"zh_CN",@"en_US",@"ja_JP"];
for&(&NSString&*languege&in&languageArray)
&&&&NSLocale&*locale&=&[[NSLocale&alloc]&initWithLocaleIdentifier:languege];
&&&&for&(&int&i&=&0&;&i&<&5&;&++i&)
&&&&&&&&NSString&*countryCode&=&countryArray[i];
&&&&&&&&NSString&*displayName&=&[locale&displayNameForKey:NSLocaleCountryCode&value:countryCode];
&&&&&&&&NSLog(@"%@\t%@\t%@",languege,countryCode,displayName);
}结果h_CN AD 安道尔
zh_CN AE 阿拉伯联合酋长国
zh_CN AF 阿富汗
zh_CN AG 安提瓜和巴布达
zh_CN AI 安圭拉
en_US AD Andorra
en_US AE United&Arab&Emirates
en_US AF Afghanistan
en_US AG Antigua&and&Barbuda
en_US AI Anguilla
ja_JP AD アンドラ
ja_JP AE アラブ首長国連邦
ja_JP AF アフガニスタン
ja_JP AG アンティグア?バーブーダ
ja_JP AI アンギラ已经介绍完iOS帮我们做的一部分工作了 那么另一部分就得我们自己来了我们需要有一张 地区->区号 的列表 不过这个也简单 网上一抓一大把 我也是网上找的 文件内容如下(diallingcode.json)[
&&&&&&&&"name":&"Afghanistan",
&&&&&&&&"dial_code":&"+93",
&&&&&&&&"code":&"AF"
&&&&&&&&"name":&"Albania",
&&&&&&&&"dial_code":&"+355",
&&&&&&&&"code":&"AL"
&&&&//中间省略
&&&&&&&&"name":&"Virgin&Islands,&British",
&&&&&&&&"dial_code":&"+1&284",
&&&&&&&&"code":&"VG"
&&&&&&&&"name":&"Virgin&Islands,&U.S.",
&&&&&&&&"dial_code":&"+1&340",
&&&&&&&&"code":&"VI"
]维护这样一张表就很简单了我们可以存在本地 也可以放在服务器(“name”字段其实是不必须的 只是为了好看)研究我们暂时先把代码放一放 来看一看其他产品是怎么做的这个是微信的微信的问题还是挺多的左边是中文环境 按拼音分组是分对了 但是文字排序却粗错了 “阿”开头的国家并没有排列在一起右边是法语环境 这些 并没有正确的归类这个是Twitter的Twitter在中文环境下还是挺奇怪的 但是却没有犯微信第二个错误Facebook的呢? 人家的工程师比较聪明(懒) 压根就不支持索引接下来我们会解决出现的这几个问题代码先简历一个Modal 用来表示国家相关的信息@interface&MMCountry&:&NSObject
@property&(nonatomic,&strong)&NSString&*&&&//国家名(本地化后的版本)
@property&(nonatomic,&strong)&NSString&*&&&//国家代号
@property&(nonatomic,&strong)&NSString&*&&//国家名的拉丁文(只包含基本拉丁字母)
@property&(nonatomic,&strong)&NSString&*dial_&&//区号
@end然后我们要把区号从配置文件中读取出来 并以区号为key 建立索引NSData&*data&=&[NSData&dataWithContentsOfFile:[[NSBundle&mainBundle]&pathForResource:@"diallingcode"&ofType:@"json"]];
NSError&*error&=&
NSArray&*arrayCode&=&[NSJSONSerialization&JSONObjectWithData:data&options:0&error:&error];
if&(&error&)&{
//读取文件
NSMutableDictionary&*dicCode&=&[@{}&mutableCopy];
for&(&NSDictionary&*item&in&arrayCode&)
&&&&MMCountry&*c&=&[MMCountry&new];
&&&&c.code&&&&&&=&item[@"code"];
&&&&c.dial_code&=&item[@"dial_code"];
&&&&[dicCode&setObject:c&forKey:c.code];
}接着获取这些国家的本地话名称NSLocale&*locale&=&[NSLocale&currentLocale];
NSArray&*countryArray&=&[NSLocale&ISOCountryCodes];
NSMutableDictionary&*dicCountry&=&[@{}&mutableCopy];
for&(NSString&*countryCode&in&countryArray)&{
&&&&if&(&dicCode[countryCode]&)
&&&&&&&&MMCountry&*c&=&dicCode[countryCode];
&&&&&&&&//这里&你懂的
&&&&&&&&c.name&=&[locale&displayNameForKey:NSLocaleCountryCode&value:countryCode];
&&&&&&&&if&(&[c.name&isEqualToString:@"台湾"]&)
&&&&&&&&&&&&c.name&=&@"中国台湾";
&&&&&&&&//把名称拉丁字母化
&&&&&&&&c.latin&=&[self&latinize:c.name];
&&&&&&&&[dicCountry&setObject:c&forKey:c.code];
&&&&&&&&//找不到则说明配置文件不全&可以补全
&&&&&&&&NSLog(@"missed&%@&%@",[locale&displayNameForKey:NSLocaleCountryCode&value:countryCode],countryCode);
}这里要注意的是 把字母拉丁文化 解决了微信的第二个问题 使非基本拉丁字母也可以按照基本拉丁字母来排序 其函数如下-&(NSString*)latinize:(NSString*)str
&&&&NSMutableString&*source&=&[str&mutableCopy];
&&&&CFStringTransform((__bridge&CFMutableStringRef)source,&NULL,&kCFStringTransformToLatin,&NO);
&&&&//微信是这样做的
&&&&//CFStringTransform((__bridge&CFMutableStringRef)source,&NULL,&kCFStringTransformMandarinLatin,&NO);
&&&&CFStringTransform((__bridge&CFMutableStringRef)source,&NULL,&kCFStringTransformStripDiacritics,&NO);
&&&&return&
}这里有两步先将文字 转成拉丁字母(kCFStringTransformToLatin)再将拉丁字母去掉变音符(kCFStringTransformStripDiacritics)这里是微信犯的第一个错误 也就是没有正确归类的错误 因为微信在第一步的时候只针对汉字进行了处理 其他字符则没有处理 导致第二步没有得到正确的基本拉丁字符(kCFStringTransformMandarinLatin 参见注释掉的代码)我们来测试一下这两步会造成得到效果 还是之前的例子NSArray&*countryArray&&=&[NSLocale&ISOCountryCodes];
NSArray&*languageArray&=&@[@"zh_CN",@"en_US",@"ja_JP"];
for&(&NSString&*languege&in&languageArray)
&&&&NSLocale&*locale&=&[[NSLocale&alloc]&initWithLocaleIdentifier:languege];
&&&&for&(&int&i&=&0&;&i&<&5&;&++i&)
&&&&&&&&NSString&*countryCode&=&countryArray[i];
&&&&&&&&NSString&*displayName&=&[locale&displayNameForKey:NSLocaleCountryCode&value:countryCode];
&&&&&&&&NSLog(@"%@\t%@\t%@\t@",languege,countryCode,displayName,[self&latinize:displayName]);
}结果zh_CN AD 安道尔 | an&dao&er
zh_CN AE 阿拉伯联合酋长国 | a&la&bo&lian&he&qiu&zhang&guo
zh_CN AF 阿富汗 | a&fu&han
zh_CN AG 安提瓜和巴布达 | an&ti&gua&he&ba&bu&da
zh_CN AI 安圭拉 | an&gui&la
en_US AD Andorra | Andorra
en_US AE United&Arab&Emirates | United&Arab&Emirates
en_US AF Afghanistan | Afghanistan
en_US AG Antigua&&&Barbuda | Antigua&&&Barbuda
en_US AI Anguilla | Anguilla
ja_JP AD アンドラ | andora
ja_JP AE アラブ首長国連邦 | arabu&shou&zhang&guo&lian&ban
ja_JP AF アフガニスタン | afuganisutan
ja_JP AG アンティグア?バーブーダ | antigua?babuda
ja_JP AI アンギラ | angira可以到看 系统会根据不同国家和不同语言的特点 将同一个国家的不同表达形式转化成不同的拉丁字母接下来 我们把获取过的数据根据’A’-‘Z’进行归类NSMutableDictionary&*dicSort&=&[@{}&mutableCopy];
for&(&MMCountry&*c&in&dicCountry.allValues&)
&&&&NSString&*indexKey&=&@"";
&&&&if&(&c.latin.length&>&0&)
&&&&&&&&indexKey&=&[[c.latin&substringToIndex:1]&uppercaseString];
&&&&&&&&char&c&=&[indexKey&characterAtIndex:0];
&&&&&&&&if&(&(&c&&&#39;Z&#39;&)&)
&&&&&&&&&&&&
&&&&NSMutableArray&*array&=&dicSort[indexKey];
&&&&if&(&!array&)
&&&&&&&&array&=&[NSMutableArray&array];
&&&&&&&&dicSort[indexKey]&=&
&&&&[array&addObject:c];
}最后 将每个归类下面的数据 排序重新整理for&(&NSString&*key&in&dicSort.allKeys&)
&&&&NSArray&*array&=&dicSort[key];
&&&&array&=&[array&sortedArrayUsingComparator:^NSComparisonResult(MMCountry&*obj1,&MMCountry&*obj2)&{
&&&&&&&&return&[obj1.name&localizedStandardCompare:obj2.name];
&&&&//&&&&&&&&&&&&array&=&[array&sortedArrayUsingComparator:^NSComparisonResult(CSCountry&*obj1,&CSCountry&*obj2)&{
&&&&//&&&&&&&&&&&&&&&&return&obj1.latin&>&obj2.
&&&&//&&&&&&&&&&&&}];
&&&&dicSort[key]&=&
}这样dicSort就是我们最终得到的结果集这里是微信犯的第二个错误 微信的排序是按照latin来排序的(见注释掉的代码) 所以导致了相同汉字的国家排不到一起的情况 正确的方式是用localizedStandardCompare来排序 这也是iOS已为我们提供好了的本地化比较函数看看之前的图中 挑三个国家出来 比如:阿尔巴尼亚 爱尔兰 阿鲁巴 他们的拼音是 aerbabiya aierlan aluba 如果按照拼音排序的话 这样的排序就是正确的我们来看看最终的效果是不是比微信的更好?讨论虽然代码是写完了 但是问题并没有结果 有一个关键的问题就是 为什么我们要按照’A’-‘Z’来索引排序呢? 比如Twitter在日文和韩文环境下是这样的其实按照不同国家的语言特点来进行对应的索引 应该才是最优的解决办法(PS:看到Twitter在中文环境下的糟糕结果 我也不确定其在日文和韩文下的结果是否是正确的(ˉ﹃ˉ)当然 如果真要这样做 其实改动量也不大 只要在索引的那块稍微修改一下就行了小结文中的demo可以在找到正如讨论中说的一样 本文所讨论的方案 并不是最终的解决方案 如果需要更好的体验的话 还要深入研究各国的文化才行 所以 国际化并不单纯是个技术问题 更是个社会工程啊~~~~
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量3537点击量3393点击量3040点击量2731点击量2401点击量2365点击量2342点击量2154点击量1978
&2018 Chukong Technologies,Inc.
京公网安备89紧急情况手机怎么报警?iOS11这个功能可以救命!_网易新闻
紧急情况手机怎么报警?iOS11这个功能可以救命!
用微信扫码二维码
分享至好友和朋友圈
(原标题:紧急情况手机怎么报警?iOS11这个功能可以救命!)
近日,有日本网友发文讲述了自己被iOS 11中新追加的“SOS紧急联络”功能救了一命的经过,并强烈安利大家开启这一新功能!据该网友描述,当时他自己一个人在海边的礁上钓鱼,摔倒后失去意识前啥也没想,总之狂按iPhone的电源键,等醒来的时候,已经是在医院的病床上了。其实该功能不仅生病的时候有急救功能,在遭遇到突发事件时,也能通过只按电源键就不动声色地报警……网友亲测了这一功能并把设定方法写了下来,大家一定要看看。在没有设置打开紧急联络时,连按5次电源键会出现这样的画面
若要开启,可以进入“设置” SOS紧急联络 打开“自动呼叫”。打开自动呼叫后,按5次电源键就会自动倒计时3秒,然后出现紧急呼叫页面。在开启了“倒计时警示音”的情况下,手机会发出尖锐的声音。如果不需要这个声音,可以关掉。另外,如果你设置了紧急联络人,在紧急呼叫电话之后,还会给紧急联络人发送信息并告知你的大致位置……很多网友亲测之后表示非常有效:如果不是iOS用户,遇到紧急情况不能电话报警时,应该怎么办呢?除了打110,你还可以这样报警。这个方法一定要记好了!7月15日,微博网友&@镜Lea&爆出了一位朋友的报警经历,引发热议。微博中的报警内容大致是:我家住在武汉市……,好像有贼翻我家衣柜,我不敢吱声,家里就我和姐姐、妈妈还有7岁的侄子,楼道里一直有走动声,我很怕。警察回复:好的,知道了,警察马上到!【湖北省公安厅】网友们称,看到这短信好暖啊!并询问报警女孩是否安全?记者联系网友&@镜Lea&他表示:警察到达时小偷已经离开,朋友到警局做了笔录,所有人员都安全。但是,更多网友表示:还有这种操作?根本不知道还能用短信报警!那么,12110短信报警真的靠谱吗?经过确认和核实各官方平台,我们可以明确地告诉大家:有用!网友提问一网友&@沧家小月:是不是每个地方都可以用?蓝v&@德州运河公安分局&:12110报警平台于2012年开始在全国推广建设,目前各省份基本上都已投入使用。网友提问二保存过这个号码,但是好像不太一样?解答:12110+区号后三位如果不加后缀区号,直接把内容发送到12110,可能会造成全国不同地区的报警内容混淆,接警员对报警中涉及的地名等要素不熟悉,需要通过短信详细询问报警人,弄清情况后再分流移送到相应地市,导致接警时间延长。因此,警方提示:短信报警不像打电话报警,可以自动就近接入110报警服务台,请报警人务必根据报警内容在12110后加上电话区号后3位,这样短信就会及时发送到其选择的地级市公安局110报警服务台,报警人也能更快地得到警方救助和帮助。那么,接下来我们来科普:短信报警应注意哪些小细节?大家一定要记住!再次提醒:1、赶快动手保存号码:&12110+区号后三位!2、短信报警时:手机调静音!3、短信内容:尽可能准确地说明,出事地点、求助时间、报警求助事项。4、如无法确定方位的,可指出路边有明显特征的参照物,如隧道、出入口名称、路牌、标志性建筑物等。快!可以设置自动报警的设置起来,12110这五个数字也记住啦!转发给你的朋友吧~
综合自:央视新闻微博、成都商报微信公号、羊城晚报微信公号、中国青年网微信公号
【免责声明】上游新闻客户端未标有“来源:上游新闻-重庆晨报”或“上游新闻LOGO、水印的文字、图片、音频视频等稿件均为转载稿。如转载稿涉及版权等问题,请与上游新闻联系。
(原标题:紧急情况手机怎么报警?iOS11这个功能可以救命!)
本文来源:重庆晨报上游新闻
责任编辑:王晓易_NE0011
用微信扫码二维码
分享至好友和朋友圈
加载更多新闻
热门产品:   
:        
:         
热门影院:
阅读下一篇
用微信扫描二维码
分享至好友和朋友圈收iOS手q一区号,愿意出号的滴滴我。诚信交易【乱世王者交易吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,914贴子:
收iOS手q一区号,愿意出号的滴滴我。诚信交易
收iOS手q一区号,愿意出号的滴滴我。诚信交易
贴吧热议榜
使用签名档&&
保存至快速回贴ios 区v10霸区号!周稳定2100。找一个真心愿意一起玩的,一起杠魔导门的,游戏已经72级了完美超战士【决斗之城吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:63,889贴子:
ios 区v10霸区号!周稳定2100。找一个真心愿意一起玩
ios 区v10霸区号!周稳定2100。找一个真心愿意一起玩的,一起杠魔导门的,游戏已经72级了完美,完美帝王,(少遗迹),,高分元素, ,各种多样卡组齐全。真心一起玩的再来,别玩两天溜了!
兄dei,怎么加你哈
加上微信聊
你直接说找个帮你挂机帮你打经竞技之门 吃鸡的就行了
三张标准遗迹!
您好,官方是禁止玩家私下买卖交流账号的,防止上当受骗哦⊙?⊙!
不是为了找人冲钱或者代打什么鬼的,只是真的找个能一起手动升级的,打连胜杠导门而已,冲不冲洗净,无所谓了,也已经差不多了!关键是能够真心一起玩的!
不要挂机,我自己就可以挂机,我找人挂机干嘛?
我平时就周末上分,平时大多时间在挂机。
我基本上天天都有空
老铁,我们一起学尿尿
愿意一起打连胜的私我一下微信,最好能够当自己号一起玩,愿意投入一起完善最好。要真的会玩的,萌新还是不要
每天打你看怎么样
我时间很充足完全可以帮到你
这是我挂机后自己还手动打的
厉害了,遗迹要多少才能中啊,大佬?
看到上面帮忙分担费用就笑了
找到了吗,我iOS一区的
,很奇怪,总有一些人吃不到葡萄就说葡萄酸的人!我自己充钱到V10,号共享出,不给你拿一分钱,只想说两个人都当自己号来玩缸等级,那么分担一些瓶子原来有毛病,真可爱。
觉得有毛病不然你号共享给我用我帮你充瓶子?
做人真的不要总是有色眼镜那么重!
还有,大兄弟我找到了,号共享出去了谢谢各位。,挺无语的。楼主真需要找人来帮我充钱吗?V10了,我需要你来给我充14的吗?
太奇怪了这些人!
我万年的1400,也就上过1次1600
兄弟,我V8都能2100
贴吧热议榜
使用签名档&&
保存至快速回贴一个写着几行代码的理工科文学青年。
在iOS中读取通讯录中联系人电话号码时需要注意的版本区别
今天遇到一个问题,发现同一个联系人的电话号码有时候读取得到,有时候读取不到。后来发现在iOS 8上是正常工作的,但是在iOS 7.1上获取到的值为空(也可能是iOS 8之前的所有版本,没有全部验证过)。123456789101112ABAddressBookRef abRef = ABAddressBookCreateWithOptions(NULL, NULL);CFArrayRef cfPersons = ABAddressBookCopyArrayOfAllPeople(abRef);NSArray *persons = CFBridgingRelease(cfPersons);CFRelease(abRef); ABRecordRef person = (__bridge ABRecordRef)(persons[0]);ABMultiValueRef phoneNumbers = (ABMultiValueRef)ABRecordCopyValue(person, kABPersonPhoneProperty);if (phoneNumbers) {
CFIndex count = ABMultiValueGetCount(phoneNumbers);
NSString *number = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
CFRelease(phoneNumbers);}如上代码,如果先释放abRef再读取person的属性值,在iOS 7.1上,单字段的属性如FirstName、LastName等是可以获取得到的,但多字段的属性如PhoneNumber、Address、Email是获取不到的。在iOS 8上都是可以获取得到的。如果是在读取完多字段属性后再释放abRef,那么在iOS 7.1上也可以正常工作。
iOS通讯录复制的手机号码字符串多了奇怪的unicode码\u0000202d-\u0000202c
IOS使用UIAlertController三种显示提示框代码
iphone 通讯录复制手机号码问题,网页无法使用正则匹配手机号 错误:Invalid or unexpected token
iOS开发中,通讯录去除空格的方法
iOS中通讯录电话号码空格问题
没有更多推荐了,}

我要回帖

更多关于 iOS锁定相机有什么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信