Safari ios音频-拒绝播放错误

时间:2018-09-12 14:58:59

标签: javascript ios audio safari

javascript错误是:Unhandled Promise Rejection: NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.

我的设置可在其他浏览器,台式机和移动设备上使用。

它的工作方式是:

  • 具有标志first_audio_played = false;
  • 添加一个播放事件音频的触摸事件监听器,并设置first_audio_played = true;(然后删除触摸监听器)
  • 所有后续音频检查if(first_audio_played) some_other_audio.play();

这样,只有 first 播放的音频需要直接的用户输入。之后,所有音频都可以自由地由游戏内事件,计时等触发。

这似乎是大多数浏览器中音频的“规则”。是iOS“规则”,音频需要通过用户输入触发吗?还是我缺少其他步骤?

2 个答案:

答案 0 :(得分:0)

对于我的JavaScript游戏,声音最近在iOS上不再起作用。它们都具有readyState = 4,但是只有我在水龙头上播放的声音可以播放,其他声音则不会播放。也许您可以在第一次点击时播放所有声音。但是我发现目前对我有效的解决方案是从ajax arraybuffers加载所有声音并使用encodeAudioData()。然后,一旦您通过用户点击(不是在身体上)播放了1种声音,它们就会在任何时候播放。

这是我的工作代码,第二种方法在底部。当我点击以播放声音2时,声音1也开始工作。

const httpOptions = {
  headers: new HttpHeaders({'Content-Type': 'application/json'})
};

export class GalleryService {
    galleryUrl: string = 'http://localhost:5555/posts';
    Mycollection: Picture[] = myCollection;

    constructor(private http: HttpClient) {
    }

    getPictures(): Observable<Picture[]> {
        return this.http.get<Picture[]>(`${this.galleryUrl}`);
    }

    edit(id:number): Observable<Picture> {
        return this.http.get<Picture>(`${this.galleryUrl}/${id}`);
    }

    update(title: string, url: string, id: number): Observable<Picture> {
        const postEdObj = {
          title,
            url
        };
        return this.http.put<Picture>(`${this.galleryUrl}/${id}`, postEdObj, httpOptions);
    }
}

答案 1 :(得分:0)

您可以根据您的 WebView 类(或等效的Swift)使用[WKWebViewConfiguration setMediaTypesRequiringUserActionForPlayback:WKAudiovisualMediaTypeNone][UIWebView setMediaPlaybackRequiresUserAction:NO]