Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
阿拉伯语字符(有效的电源错误)使我的swift iOS应用程序崩溃。如何正确清理输入以避免此问题和相关问题?_Ios_Swift_Input_Fonts_Arabic - Fatal编程技术网

阿拉伯语字符(有效的电源错误)使我的swift iOS应用程序崩溃。如何正确清理输入以避免此问题和相关问题?

阿拉伯语字符(有效的电源错误)使我的swift iOS应用程序崩溃。如何正确清理输入以避免此问题和相关问题?,ios,swift,input,fonts,arabic,Ios,Swift,Input,Fonts,Arabic,导致崩溃的文本如下所示: 错误发生在以下行: let size = CGSize(width: 250, height: DBL_MAX) let font = UIFont.systemFontOfSize(16.0) let attributes = [ NSFontAttributeName:font , NSParagraphStyleAttributeName: paraStyle ] var rect = text.boundingRectWithSize(size, o

导致崩溃的文本如下所示:

错误发生在以下行:

let size = CGSize(width: 250, height: DBL_MAX)
let font = UIFont.systemFontOfSize(16.0)
let attributes = [
  NSFontAttributeName:font , 
  NSParagraphStyleAttributeName: paraStyle
]
var rect = text.boundingRectWithSize(size, options:.UsesLineFragmentOrigin, attributes: attributes, context: nil)
其中文本变量包含输入的字符串 parastyle声明如下:

let paraStyle = NSMutableParagraphStyle()
paraStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping
我最初的想法是,系统字体无法处理这些字符,我需要做一个NSCharacterSet,但我不确定如何禁止会使我的应用程序崩溃的字符,或者使其成为我可以处理这些输入的字符(理想)。我也不想禁止表情符号


谢谢

过滤所有具有相同方向性的字符。不幸的是,我只知道中有这样的API。

不是答案,而是一些信息,这可能提供了一种避免这种情况的方法

更新信息来源:

问题不在于阿拉伯字符本身,而在于CoreText如何处理代表它们的unicode,CoreText是一个软件例程库,用于帮助应用程序在屏幕上显示文本

该漏洞导致CoreText访问无效内存,从而迫使操作系统关闭当前运行的程序:该程序可能是您的短信应用程序、终端,或者在通知屏幕的情况下,是操作系统的核心部分

来自Reddit,但这可能并不完全正确:

只有当消息必须缩写为“…”时,它才起作用。这通常位于Messages.app的锁屏和主菜单上

“有效”和“力量”这两个词可以是任何东西,只要它们在两行不同的文字上,这就迫使阿拉伯文本在信息的下方更远,其中一些字母将被替换为“…”


当第一个点替换其中一个阿拉伯字符的一部分(它们需要一个以上的字节来存储)时,就会发生崩溃。通常会进行安全检查以确保未存储一半字符,但无论出于何种原因,此替换都会绕过这些检查。

甚至不要尝试。这是操作系统中的一个bug,将被修复。这不是你的问题。如果你试图修复它,你只是在浪费时间。你很可能会引入bug——当你说你“净化”了输入,这意味着你无法处理一些完美的输入

我工作的公司开发了一个多平台的群组视频聊天。 在Crashlytics报告中,我们开始注意到一些用户正在使用这个著名的unicode序列“有效地”跟踪iOS用户。 我们不能坐等苹果解决这个问题

所以,我已经解决了这个问题,这是我得到的最短的崩溃序列:

// unichar representation
unichar crashChars[8] = {1585, 1611, 32, 2403, 32, 2403, 32, 2403}; 

// string representation
NSString *crashString = @"\u0631\u064b \u0963 \u0963 \u0963"
因此,我决定过滤掉所有包含两个
U+0963
”的文本消息ॣ' 符号之间只有一个符号(希望你能破译这个短语)

我的代码来自
NSString+Extensions
类别

static const unichar kDangerousSymbol = 2403;

- (BOOL)isDangerousUnicode {
    NSUInteger distance = 0;
    NSUInteger charactersFound = 0;

    for (NSUInteger i = 0; i < self.length; i++) {
        unichar character = [self characterAtIndex:i];
        if (charactersFound) {
            distance++;
        }

        if (distance > 2) {
            charactersFound = 0;
        }

        if (kDangerousSymbol == character) {
            charactersFound++;
        }

        if (charactersFound > 1 && distance > 0) {
            return YES;
        }
    }

    return NO;
}
我不确定是否可以用太多的“devanagari元音符号Vocal ll”来“区分”信息

我愿意接受纠正、建议和批评:)


我希望看到更好的解决方案。

我的解决方案是下一类:

static NSString *const CRASH_STRING = @"\u0963h \u0963 \u0963";

@implementation NSString (CONEffectivePower)

- (BOOL)isDangerousStringForCurrentOS
{
    if (IS_IOS_7_OR_LESS || IS_IOS_8_4_OR_HIGHER) {
        return NO;
    }

    return [self containsEffectivePowerText];
}

- (BOOL)containsEffectivePowerText
{
     return [self containsString:CRASH_STRING];
}

@end

苹果公司表示,他们正在解决这个问题。这并不像对任何角色进行消毒那么简单,这是一个复杂的渲染问题。好吧,但就目前而言,我无能为力?我可以,比如说,禁止任何输入字符“冗" 或"ॣ“?另外,很抱歉没有放图片,我假设堆栈溢出的人足够聪明,可以自己找到它…(在其他网站上很容易找到)编辑:显然,你需要10个信誉点来发布图像,所以不能,但这是过分的。但是在我的应用程序中,没有缩写。它必须是因为单词中断而发生的。可能是单词中断将中间的阿拉伯语字符拆分。这也可能发生在许多字符中,需要两个UTF16代码单元来表示。现在是2021年,看起来他们并没有“有效地”修复它。权力ॣ ॣHॣ ॣ 冗"
static NSString *const CRASH_STRING = @"\u0963h \u0963 \u0963";

@implementation NSString (CONEffectivePower)

- (BOOL)isDangerousStringForCurrentOS
{
    if (IS_IOS_7_OR_LESS || IS_IOS_8_4_OR_HIGHER) {
        return NO;
    }

    return [self containsEffectivePowerText];
}

- (BOOL)containsEffectivePowerText
{
     return [self containsString:CRASH_STRING];
}

@end