美文网首页
iOS11 限制表情输入

iOS11 限制表情输入

作者: keyuan0214 | 来源:发表于2018-01-30 14:22 被阅读0次

    在提交数据发送网络请求,由于用户输入了emoji表情,服务端返回系统异常,体验感很差。为了解决服务器不能验证emoji编码的问题,需要在本地进行emoji的输入控制(一般情况应该由服务器在数据库中添加emoji对应的转码表以支持客户端发送emoji表情)。

    所以就有了这个需求:在TextField或者TextView中,限制输入任何表情符号,(包括系统自带的表情,第三方键盘带的表情,还有某些汉字类型的表情)。

    利用下面这个方法stringContainsEmoji可以限制系统键盘自带的表情

    /**
    
     *  判断字符串中是否存在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个方法就可以完全限制住键盘输入所有的表情。但是今天突然发现系统自带的键盘九宫格输入汉字不能使用了。

    最终发现当使用九宫格输入汉字时候,九宫格输入的本身就是表情,九宫格对应的是下面➋➌➍➎➏➐➑➒的字符。所有用上面2个方法就把这些表情限制了,导致不能输入汉字。

    既然找到了问题所在,那么开始撸代码:

    利用下面这个方法isNineKeyBoard可以判断当前是不是在使用九宫格输入

    /**
    
    判断是不是九宫格
    
    @param string  输入的字符
    
    @return YES(是九宫格拼音键盘)
    
    */-(BOOL)isNineKeyBoard:(NSString*)string{NSString*other =@"➋➌➍➎➏➐➑➒";intlen = (int)string.length;for(inti=0;i
    
    下面就是现在UITextView禁止输入表情的重要代码,记得遵守代理~
    
    #pragma mark -------UITextViewDelegate-(BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{}
    
    UITextField在下面这个方法中写就行
    
    - (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;
    
    }
    
    另外附上几个有用的方法:
    
    //-----过滤字符串中的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;
    
    }
    
    /**
    
     * 判断 字母、数字、中文
    
     */
    
    - (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;
    
    }
    

    注意:上面这种方法可以限制键盘输入任何表情符号,但是如果需求是必须要输入表情,而且要下次服务器把这个表情返回,还要回显到页面上,就要看下面这篇文章

    彻底解决iOS输入表情,报系统异常问题

    相关文章

      网友评论

          本文标题:iOS11 限制表情输入

          本文链接:https://www.haomeiwen.com/subject/dzhczxtx.html