美文网首页网页的东西iOS杂技
iOS编程错误集锦(一)

iOS编程错误集锦(一)

作者: 小冰山口 | 来源:发表于2017-06-15 11:26 被阅读254次

    工作过程中遇到一些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.

    • 然后设置属性mediaPlaybackRequiresUserActionNO:

    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里:

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

    相关文章

      网友评论

      本文标题:iOS编程错误集锦(一)

      本文链接:https://www.haomeiwen.com/subject/fomyqxtx.html