非标准h5字符串的WKWebView展示前的解析与插入属性或标题头与解决WKWebView无法加载视频首帧问题

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 非标准h5字符串的WKWebView展示前的解析与插入属性或标题头与解决WKWebView无法加载视频首帧问题

WKWebView加载h5中有视频链接,无法加载视频首帧,看到一片空白和一个播放按钮。那如何让它加载首帧图片呢?很简单在视频链接前加上controls=\"controls\" autoplay=\"autoplay\"。很不幸,当有这量个属性时,在电脑web浏览器上它直接自动播放了。而在iOS端它会自动加载视频数据,停留在首帧图片。由于列表中可能有很多视频,都一起播放,想一想就够乱的,而iOS端不加它却是空白。自动iOS端自己拿到h5字符加上这个属性了。当然在上传后台时加上controls=\"controls\"对web端也没有影响,iOS端就以它为视频识别吧!开始想的是用字符串替换简单搞定。不过理想很丰满,现实很骨感,替换不了。因为h5字符串中有双引号等控制字符。这也告诉我们字符串替换无法对含有特殊控制符的字符串进行替换。最后以双引号为间隔分割成数组,然后在数组中查找替换才搞定。

因为是含有非标准h5字符串,可能只返回一个字符串,由于没有设置字体WKWebView直接显示默认字体可能很小,完全达不到ui图的效果,只能增加头设置字体来搞定了。

-(void)updateBody
{
    if(isCommonUnitEmptyString(self.Body))
    {
        self.contentHeight = 0;
        return;
    }
    NSDictionary *attributes3 = @{NSFontAttributeName :BGFont(15)};     //字体属性,设置字体的font
    CGSize maxSize3 = CGSizeMake(FULL_WIDTH - COMMON_EDGE_DISTANCE*2, MAXFLOAT);     //设置字符串的宽高
    CGSize size3 = [getNotNilString(self.Body) boundingRectWithSize:maxSize3 options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes3 context:nil].size;
    self.contentHeight = size3.height+0.1;
    if([self.Body hasPrefix:@"<p>"] && [self.Body hasSuffix:@"</p>"])
    {
        self.Body = [NSString stringWithFormat:@"<head><style>p{font-size:30px}</style></head><body>%@</body>", self.Body];
    }
    else if(([self.Body hasPrefix:@"<img src"] && [self.Body hasSuffix:@"/>"]) || ([self.Body hasPrefix:@"<head><style>"] && [self.Body hasSuffix:@"</body>"]) || ([self.Body hasPrefix:@"<p><video src=\""] && [self.Body hasSuffix:@"\" controls=\"controls\" style=\"max-width:100%%\"></video></p>"]))
    {
    }
    else
    {
        self.Body = [NSString stringWithFormat:@"<head><style>p{font-size:30px}</style></head><body><p>%@</p></body>", self.Body];
    }
    self.Body = [self.Body stringByReplacingOccurrencesOfString:@"\" controls=\"controls\" autoplay=\"autoplay\" style=\"max-width:100%%\"></video></p>" withString:@"\" controls=\"controls\" style=\"max-width:100%%\"></video></p>"];
    NSArray *arr1 = [self.Body componentsSeparatedByString:@"\""];
    NSMutableArray *arr = [NSMutableArray array];
    for(NSInteger i = 1; !isCommonUnitEmptyArray(arr1) && (i<arr1.count); i++)
    {
        NSString *frontStr = arr1[i-1];
        NSString *afterStr = arr1[i];
        NSString *afterStr2 = [arr1 objectAtSafeIndex:(i+1)];
        [arr addObject:frontStr];
        if(!isCommonUnitEmptyString(frontStr) && !isCommonUnitEmptyString(afterStr))
        {
            if(!isCommonUnitEmptyString(afterStr2))
            {
                if([frontStr isEqualToString:@" controls="] && [afterStr isEqualToString:@"controls"] && [afterStr2 isEqualToString:@" style="])
                {
                    [arr addObject:afterStr];
                    i++;
                    [arr addObject:@" autoplay="];
                    [arr addObject:@"autoplay"];
                }
            }
            else if(!afterStr2)
            {
                [arr addObject:afterStr];
                break;
            }
        }
    }
    NSString *str = @"";
    if(!isCommonUnitEmptyArray(arr))
    {
        str = [NSString stringWithFormat:@"%@", arr[0]];
    }
    else
    {
        return;
    }
    for(NSInteger i = 1; !isCommonUnitEmptyArray(arr) && (i<arr.count); i++)
    {
        NSString *frontStr = arr[i-1];
        NSString *afterStr = arr[i];
        if(!isCommonUnitEmptyString(frontStr) && [frontStr hasSuffix:@"="])
        {
            str = [NSString stringWithFormat:@"%@\"%@\"", str,afterStr];
        }
        else
        {
            str = [NSString stringWithFormat:@"%@%@", str,afterStr];
        }
        
    }
    
    self.Body = str;
}
目录
相关文章
|
21天前
|
存储 算法 数据挖掘
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
|
4天前
|
JSON 算法 BI
技术经验解读:优酷真实视频地址解析
技术经验解读:优酷真实视频地址解析
|
11天前
|
Java 编译器
全面解析JVM加载中初始化的时机
全面解析JVM加载中初始化的时机
|
11天前
|
存储 算法 Java
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
|
12天前
|
数据采集 前端开发 JavaScript
Python爬虫技术:动态JavaScript加载音频的解析
Python爬虫技术:动态JavaScript加载音频的解析
|
2月前
|
SQL 存储 JSON
Hive 解析 JSON 字符串数据的实现方式
Hive 提供 `get_json_object` 函数解析 JSON 字符串,如 `{&quot;database&quot;:&quot;maxwell&quot;}`。`path` 参数使用 `$`、`.`、`[]` 和 `*` 来提取数据。示例中展示了如何解析复杂 JSON 并存储到表中。此外,Hive 3.0.0及以上版本内置 `JsonSerDe` 支持直接处理 JSON 文件,无需手动解析。创建表时指定 `JsonSerDe` 序列化器,并在 HDFS 上存放 JSON 文件,可以直接查询字段内容,方便快捷。
|
24天前
|
XML 数据采集 自然语言处理
掌握Python字符串:全面解析与实战指南
掌握Python字符串:全面解析与实战指南
|
2月前
|
SQL JSON 监控
实时计算 Flink版产品使用合集之直接将 JSON 字符串解析为数组的内置函数如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
10天前
|
机器学习/深度学习 缓存 算法
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk

推荐镜像

更多