网页的东西iOS杂技

iOS编程错误集锦(一)

2017-06-15  本文已影响254人  小冰山口

工作过程中遇到一些Bug, 解决方案往往是在网上找的, 或者自己的一些灵感迸发, 常常会在下次再遇到这类问题的时候忘掉解决方案, 所以这个集锦就是专门收集此类问题的.

目录

<h2 id='1'>1. WKWebView网页里面的音频没声音</h2>

用公司的App扫推广二维码之后跳转的H5页面有内嵌的音频, 但是始终没有声音.
问题是: 初始化WebView的时候没有进行配置

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.allowsInlineMediaPlayback = YES;
allowsInlineMediaPlayback这个属性苹果官方文档是这样描述的:

A Boolean value indicating whether HTML5 videos play inline or use the native full-screen controller.
You must set this property to play inline video. Set this property to true to play videos inline. Set this property to false to use the native full-screen controller. When adding a video element to a HTML document on the iPhone, you must also include the playsinline attribute.
The default value for iPhone is false and the default value for iPad is true.

意思就是:

如果你要就在网页内部播放视频的话, 就设置这个属性为YES, 如果你要使用原生的全屏控制器播放视频的话, 就设置这个属性为NO.

这个属性在iPhone上默认为NO, 在iPad上默认为YES

所以, 在手机上要可以播放, 发出声音的话, 必须将这个属性设置为YES.

config.mediaPlaybackRequiresUserAction = NO;

mediaPlaybackRequiresUserAction这个属性是替代requiresUserActionForMediaPlayback这个属性的
mediaPlaybackRequiresUserAction这个属性设置为NO的时候, 就是自动播放, 不需要用户采取任何手势开启播放.

但是以上两个API都过期了, 现在有另外一个属性:
mediaTypesRequiringUserActionForPlayback

/*! @enum WKAudiovisualMediaTypes
 @abstract The types of audiovisual media which will require a user gesture to begin playing.
 @constant WKAudiovisualMediaTypeNone No audiovisual media will require a user gesture to begin playing.
 @constant WKAudiovisualMediaTypeAudio Audiovisual media containing audio will require a user gesture to begin playing.
 @constant WKAudiovisualMediaTypeVideo Audiovisual media containing video will require a user gesture to begin playing.
 @constant WKAudiovisualMediaTypeAll All audiovisual media will require a user gesture to begin playing.
*/
typedef NS_OPTIONS(NSUInteger, WKAudiovisualMediaTypes) {
    WKAudiovisualMediaTypeNone = 0,
    WKAudiovisualMediaTypeAudio = 1 << 0,
    WKAudiovisualMediaTypeVideo = 1 << 1,
    WKAudiovisualMediaTypeAll = NSUIntegerMax
} API_AVAILABLE(macosx(10.12), ios(10.0));

这个属性是一个枚举值, 当选择WKAudiovisualMediaTypeNone的时候, 表示音视频的播放不需要用户手势触发, 即为自动播放

self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 64, kScreenWidth, kScreenHeight - 64) configuration:config];

这样, 问题就解决了

<h2 id='2'>2.本地解析json文件找不到路径的问题</h2>
今天在模仿YYWeibo项目的时候发现tableView的数据老是加载不下来, 开始以为是读取json失败, 后来才知道, 连资源路径都是nil, 检查了无数次路径, 发现就那么几个字母, 完全没有写错

NSData *data = [NSData dataNamed:[NSString stringWithFormat:@"weibo_%d.json", i]];

-dataName:是YY封装的一个方法, 具体实现如下:

+ (NSData *)dataNamed:(NSString *)name {
    NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@""];
    if (!path) return nil;
    NSData *data = [NSData dataWithContentsOfFile:path];
    return data;
}

可是, 为什么连路径都读不出来呢?

于是, 我截了一张图片, 拖到工程里面去, 发现找到路径完全没问题:

截图

但是json文件就解析不了


解析情况

该勾选的也都勾选了:

都勾选了

百思不得其解, 只好去看copy Bundle Resources

查看copy Bundle Resources
问题找到了, 原来那几个json文件根本没参与到编译, 而图片已经自动参与编译了, 具体原因不知道, 很奇葩.

后来我自己新建了一个json文件, 和一个plist文件, 都可以正确加载:

可以正确加载

不知道为什么从别处拖过来的就不可以.

只好手动把微博的那几个json文件添加到copy Bundle Resources里:

手动添加资源文件
于是, 本地的json文件终于可以加载出来了, 至于为什么不能自动添加到copy Bundle Resources, 我就不知道了, 还请知道的大神给讲解下. 谢谢!
上一篇 下一篇

猜你喜欢

热点阅读