iOS11 限制輸入表情(emoji)

在提交數(shù)據(jù)發(fā)送網(wǎng)絡(luò)請求,由于用戶輸入了emoji表情曙搬,服務(wù)端返回系統(tǒng)異常好港,體驗(yàn)感很差。為了解決服務(wù)器不能驗(yàn)證emoji編碼的問題骨宠,需要在本地進(jìn)行emoji的輸入控制(一般情況應(yīng)該由服務(wù)器在數(shù)據(jù)庫中添加emoji對應(yīng)的轉(zhuǎn)碼表以支持客戶端發(fā)送emoji表情)浮定。

所以就有了這個(gè)需求:在TextField或者TextView中,限制輸入任何表情符號层亿,(包括系統(tǒng)自帶的表情桦卒,第三方鍵盤帶的表情,還有某些漢字類型的表情)匿又。

利用下面這個(gè)方法stringContainsEmoji可以限制系統(tǒng)鍵盤自帶的表情

/**

?*? 判斷字符串中是否存在emoji

?* @param string 字符串

?* @return YES(含有表情)

?*/

+ (BOOL)stringContainsEmoji:(NSString*)string {


? ? __blockBOOLreturnValue =NO;


? ? [stringenumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:

?? ? ^(NSString*substring,NSRangesubstringRange,NSRangeenclosingRange,BOOL*stop) {


?? ? ? ? constunicharhs = [substringcharacterAtIndex:0];

?? ? ? ? // surrogate pair

?? ? ? ? if(0xd800<= hs && hs <=0xdbff) {

?? ? ? ? ? ? if(substring.length>1) {

?? ? ? ? ? ? ? ? constunicharls = [substringcharacterAtIndex:1];

?? ? ? ? ? ? ? ? constintuc = ((hs -0xd800) *0x400) + (ls -0xdc00) +0x10000;

?? ? ? ? ? ? ? ? if(0x1d000<= uc && uc <=0x1f77f) {

?? ? ? ? ? ? ? ? ? ? returnValue =YES;

?? ? ? ? ? ? ? ? }

?? ? ? ? ? ? }

?? ? ? ? }elseif(substring.length>1) {

?? ? ? ? ? ? constunicharls = [substringcharacterAtIndex:1];

?? ? ? ? ? ? if(ls ==0x20e3) {

?? ? ? ? ? ? ? ? returnValue =YES;

?? ? ? ? ? ? }


?? ? ? ? }else{

?? ? ? ? ? ? // non surrogate

?? ? ? ? ? ? if(0x2100<= hs && hs <=0x27ff) {

?? ? ? ? ? ? ? ? returnValue =YES;

?? ? ? ? ? ? }elseif(0x2B05<= hs && hs <=0x2b07) {

?? ? ? ? ? ? ? ? returnValue =YES;

?? ? ? ? ? ? }elseif(0x2934<= hs && hs <=0x2935) {

?? ? ? ? ? ? ? ? returnValue =YES;

?? ? ? ? ? ? }elseif(0x3297<= hs && hs <=0x3299) {

?? ? ? ? ? ? ? ? returnValue =YES;

?? ? ? ? ? ? }elseif(hs ==0xa9|| hs ==0xae|| hs ==0x303d|| hs ==0x3030|| hs ==0x2b55|| hs ==0x2b1c|| hs ==0x2b1b|| hs ==0x2b50) {

?? ? ? ? ? ? ? ? returnValue =YES;

?? ? ? ? ? ? }

?? ? ? ? }

?? ? }];


? ? returnreturnValue;

}

/**

?*? 判斷字符串中是否存在emoji

?* @param string 字符串

?* @return YES(含有表情)

?*/

+ (BOOL)hasEmoji:(NSString*)string

{

? ? NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]";

? ? NSPredicate*pred = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];

? ? BOOLisMatch = [predevaluateWithObject:string];

? ? returnisMatch;

}


/**

?判斷是不是九宮格

?@param string? 輸入的字符

?@return YES(是九宮格拼音鍵盤)

?*/

+(BOOL)isNineKeyBoard:(NSString*)string

{

? ? NSString*other =@"????????";

? ? intlen = (int)string.length;

? ? for(inti=0;i

? ? {

? ? ? ? if(!([otherrangeOfString:string].location!=NSNotFound))

? ? ? ? ? ? returnNO;

? ? }

? ? return YES;

}

上面這2個(gè)方法就可以完全限制住鍵盤輸入所有的表情方灾。但是今天突然發(fā)現(xiàn)系統(tǒng)自帶的鍵盤九宮格輸入漢字不能使用了。

最終發(fā)現(xiàn)當(dāng)使用九宮格輸入漢字時(shí)候碌更,九宮格輸入的本身就是表情裕偿,九宮格對應(yīng)的是下面????????的字符洞慎。所有用上面2個(gè)方法就把這些表情限制了,導(dǎo)致不能輸入漢字嘿棘。

既然找到了問題所在拢蛋,那么開始擼代碼:

利用下面這個(gè)方法isNineKeyBoard可以判斷當(dāng)前是不是在使用九宮格輸入

/**

判斷是不是九宮格

@param string? 輸入的字符

@return YES(是九宮格拼音鍵盤)

*/-(BOOL)isNineKeyBoard:(NSString*)string{NSString*other =@"????????";intlen = (int)string.length;for(inti=0;i

下面就是現(xiàn)在UITextView禁止輸入表情的重要代碼,記得遵守代理~

#pragma mark -------UITextViewDelegate-(BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{}

UITextField在下面這個(gè)方法中寫就行

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string{


? ? if([textFieldisFirstResponder]) {


? ? ? ? if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage]) {

? ? ? ? ? ? returnNO;

? ? ? ? }


? ? ? ? //判斷鍵盤是不是九宮格鍵盤

? ? ? ? if([TKPublicisNineKeyBoard:string] ){

? ? ? ? ? ? returnYES;

? ? ? ? }else{

? ? ? ? ? ? if([TKPublichasEmoji:string] || [TKPublicstringContainsEmoji:string]){

? ? ? ? ? ? ? ? returnNO;

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? if(textField.text.length==20){


? ? ? ? ? ? if([stringisEqualToString:@""]) {


? ? ? ? ? ? ? ? returnYES;


? ? ? ? ? ? }else


? ? ? ? ? ? ? ? returnNO;


? ? ? ? }



? ? }

? ? return YES;



}

另外附上幾個(gè)有用的方法:

//-----過濾字符串中的emoji

- (NSString*)disable_emoji:(NSString*)text {

? ? NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]"options:NSRegularExpressionCaseInsensitive error:nil];

? ? NSString*modifiedString = [regexstringByReplacingMatchesInString:text

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? options:0

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? range:NSMakeRange(0, [textlength])

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? withTemplate:@""];

? ? returnmodifiedString;

}

/**

?* 判斷 字母蔫巩、數(shù)字谆棱、中文

?*/

- (BOOL)isInputRuleAndNumber:(NSString*)str

{

? ? NSString*other =@"????????";? ? //九宮格的輸入值

? ? unsignedlonglen=str.length;

? ? for(inti=0;i

? ? {

? ? ? ? unichara=[strcharacterAtIndex:i];

? ? ? ? if(!((isalpha(a))

?? ? ? ? ? ? ||(isalnum(a))

?? ? ? ? ? ? //? ? ? ? ? ? ||((a=='_') || (a == '-')) //判斷是否允許下劃線,昵稱可能會用上

?? ? ? ? ? ? ||((a==' '))? ? ? ? ? ? ? ? //判斷是否允許空格

?? ? ? ? ? ? ||((a >=0x4e00&& a <=0x9fa6))

?? ? ? ? ? ? ||([otherrangeOfString:str].location!=NSNotFound)

?? ? ? ? ? ? ))

? ? ? ? ? ? returnNO;

? ? }

? ? return YES;

}

注意:上面這種方法可以限制鍵盤輸入任何表情符號圆仔,但是如果需求是必須要輸入表情垃瞧,而且要下次服務(wù)器把這個(gè)表情返回,還要回顯到頁面上坪郭,就要看下面這篇文章

徹底解決iOS輸入表情个从,報(bào)系統(tǒng)異常問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歪沃,隨后出現(xiàn)的幾起案子嗦锐,更是在濱河造成了極大的恐慌,老刑警劉巖沪曙,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奕污,死亡現(xiàn)場離奇詭異,居然都是意外死亡液走,警方通過查閱死者的電腦和手機(jī)碳默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缘眶,“玉大人嘱根,你說我怎么就攤上這事∠镄福” “怎么了该抒?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顶燕。 經(jīng)常有香客問我凑保,道長割岛,這世上最難降的妖魔是什么愉适? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任癣漆,我火速辦了婚禮剂买,結(jié)果婚禮上惠爽,老公的妹妹穿的比我還像新娘癌蓖。我一直安慰自己,他們只是感情好婚肆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布租副。 她就那樣靜靜地躺著,像睡著了一般较性。 火紅的嫁衣襯著肌膚如雪用僧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天赞咙,我揣著相機(jī)與錄音责循,去河邊找鬼。 笑死攀操,一個(gè)胖子當(dāng)著我的面吹牛院仿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播速和,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼歹垫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颠放?” 一聲冷哼從身側(cè)響起排惨,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碰凶,沒想到半個(gè)月后若贮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痒留,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年谴麦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伸头。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匾效,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恤磷,到底是詐尸還是另有隱情面哼,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布扫步,位于F島的核電站魔策,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏河胎。R本人自食惡果不足惜闯袒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧政敢,春花似錦其徙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褪尝,卻和暖如春闹获,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背河哑。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工避诽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灾馒。 一個(gè)月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓茎用,卻偏偏與公主長得像,于是被迫代替她去往敵國和親睬罗。 傳聞我的和親對象是個(gè)殘疾皇子轨功,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容