iOS13 限制输入表情,emoji

项目有这个需求,网上找了很多,大部分表情都能限制,但是总有一些漏网之鱼,类似 ❤️这个.最后在github上找到了一个2016年作者写的,竟然能全部屏蔽掉,链接,这个里面好几个方法,我使用到的是判断字符串是否为emoji

注意:方法和百度来的很类似,但里面实际有一些不一样的,可以试一下

+ (BOOL)stringContainsEmoji:(NSString *)string
{
    // 过滤所有表情。returnValue为NO表示不含有表情,YES表示含有表情
    __block BOOL containsEmoji = NO;
    [string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        
        const unichar hs = [substring characterAtIndex:0];
        // surrogate pair
        
        if (0xd800 <= hs &&
            hs <= 0xdbff)
        {
            if (substring.length > 1)
            {
                const unichar ls = [substring characterAtIndex:1];
                const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                if (0x1d000 <= uc &&
                    uc <= 0x1f9c0)
                {
                    containsEmoji = YES;
                }
            }
        }
        else if (substring.length > 1)
        {
            const unichar ls = [substring characterAtIndex:1];
            if (ls == 0x20e3 ||
                ls == 0xfe0f ||
                ls == 0xd83c)
            {
                containsEmoji = YES;
            }
        }
        else
        {
            // non surrogate
            if (0x2100 <= hs &&
                hs <= 0x27ff)
            {
                containsEmoji = YES;
            }
            else if (0x2B05 <= hs &&
                     hs <= 0x2b07)
            {
                containsEmoji = YES;
            }
            else if (0x2934 <= hs &&
                     hs <= 0x2935)
            {
                containsEmoji = YES;
            }
            else if (0x3297 <= hs &&
                     hs <= 0x3299)
            {
                containsEmoji = YES;
            }
            else if (hs == 0xa9 ||
                     hs == 0xae ||
                     hs == 0x303d ||
                     hs == 0x3030 ||
                     hs == 0x2b55 ||
                     hs == 0x2b1c ||
                     hs == 0x2b1b ||
                     hs == 0x2b50)
            {
                containsEmoji = YES;
            }
        }
        
        if (containsEmoji)
        {
            *stop = YES;
        }
    }];
    return containsEmoji;
}

这个判断下有个问题是九宫格输入法直接是不能输入内容的,所以还需要再判断一下是否为九宫格输入法,判断方法:

+(BOOL)isNineKeyBoard:(NSString *)string
{
    NSString *other = @"➋➌➍➎➏➐➑➒";
    int len = (int)string.length;
    for(int i=0;i<len;i++)
    {
        if(!([other rangeOfString:string].location != NSNotFound))
            return NO;
    }
    return YES;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图...
    万忍阅读 1,532评论 0 6
  • Emoji 实战问题:iOS,Android,Server 2016-05-27 11:34编辑:lansekua...
    IceWall_Rin阅读 2,190评论 0 6
  • 莫名惊诧言语诛,意欲何为自坑儒? 不见秦家只二世,刘项从未用简书。 2019年04月18日
    蔚海山庄三六子阅读 275评论 1 6
  • 小雨淅淅沥沥的下了一天,本来是想写点关于雨的但是无奈文笔太差,实在描绘不出雨的美景,那就索性写点因为下雨反思轻信...
    五方阅读 251评论 0 1
  • 前言 我们对便利店的认知是什么?有特色,生活周边,连锁等等,然后我们做便利店往往只仿其形而不能学得其神!便利店背后...
    Robin_lian阅读 533评论 0 3