代码之家  ›  专栏  ›  技术社区  ›  Kornel

PLIST能否从不受信任的源安全读取?

  •  2
  • Kornel  · 技术社区  · 15 年前

    我需要与iPhone应用程序进行简单的客户机-服务器通信,XML属性列表似乎是一个非常简单的解决方案,它省去了我处理XML解析器委托和自己构建这些结构的麻烦。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jon Hess    15 年前

    例如,如果您希望字典中包含字符串键和NSNumbers作为值,则必须使用以下方法进行验证:

    NSString *errorDescription = nil;
    NSPropertyListFormat format = 0;
    id topObject = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&errorDescription];
    NSDictionary *validDictionary = nil;
    if ([topObject isKindOfClass:[NSDictionary class]]) {
        BOOL allNumbers = YES;
        for(id value in [topObject allValues]) {
            allNumbers = allNumbers && [value isKindOfClass:[NSNumber class]];
        }
        if (allNumbers) {
            validDictionary = topObject;
        }
    }
    return validDictionary;
    

        2
  •  0
  •   Kornel    15 年前

    NSDictionary 类别,以减少所需数量的 isKindOfClass

    @interface NSDictionary (TypedDictionary)
    
    -(NSArray *)arrayForKey:(NSString*)key;
    -(NSString *)stringForKey:(NSString*)key;
    -(NSDictionary *)dictionaryForKey:(NSString*)key;
    
    @end
    
    
    @implementation NSDictionary (TypedDictionary)
    
    -(NSArray *)arrayForKey:(NSString*)key {
        NSArray *obj = [self objectForKey:key];
        return [obj isKindOfClass:[NSArray class]] ? obj : nil;
    }
    -(NSString *)stringForKey:(NSString*)key {
        NSString *obj = [self objectForKey:key];
        return [obj isKindOfClass:[NSString class]] ? obj : nil;
    }
    -(NSDictionary *)dictionaryForKey:(NSString*)key {
        NSDictionary *obj = [self objectForKey:key];
        return [obj isKindOfClass:[NSDictionary class]] ? obj : nil;
    }
    @end