工作过程中遇到一些Bug, 解决方案往往是在网上找的, 或者自己的一些灵感迸发, 常常会在下次再遇到这类问题的时候忘掉解决方案, 所以这个集锦就是专门收集此类问题的.
目录
<h2 id='1'>1. WKWebView网页里面的音频没声音</h2>
用公司的App扫推广二维码之后跳转的H5页面有内嵌的音频, 但是始终没有声音.
问题是: 初始化WebView的时候没有进行配置
-
先初始化配置对象:
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
-
然后设置
allowsInlineMediaPlayback
属性为YES
:
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.
-
然后设置属性
mediaPlaybackRequiresUserAction
为NO
:
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
的时候, 表示音视频的播放不需要用户手势触发, 即为自动播放
-
最后初始化网页的时候, 把config作为参数进行初始化:
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里:
手动添加资源文件
网友评论