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

你可能感兴趣的:(iOS13 限制输入表情,emoji)