問題タブ [mpmediaplayercontroller]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift3 - メタデータからキー値を文字列として取得できません
次のように MPMediaItem からメタデータを取得しています。
ただし、印刷されたメタデータのブロックを取得すると、印刷出力に示すように、「キー」が「pcst」ではなく数値として印刷されます。
-----metadata:<AVMetadataItem: 0x1740153f0, identifier=itsk/pcst, keySpace=itsk, key class = __NSCFNumber, key=pcst, commonKey=(null), extendedLanguageTag=(null), dataType=com.apple.metadata.datatype.int8, time={INVALID}, duration={INVALID}, startDate=(null), extras={
dataLength = 1;
dataType = 21;
dataTypeNamespace = "com.apple.itunes";
}, value=1>
-----metadata.key:Optional(1885565812)
これは、すべてのメタデータ/キーで発生しています (この特定のメディア アイテムには 29 個あります)。
また、次のコード行にも注意してください。
このエラーが発生します:
Could not cast value of type '__NSCFNumber' (0x1b80dcdf0) to 'NSString' (0x1b80edae8).
キー ("pcst") の文字列値を取得するにはどうすればよいですか?
ios - タイマー使用時の UI の遅延
現在再生中の を更新するために毎秒繰り返すタイマーを使用しているcurrentPlaybackTime
ため、現在の曲の進行状況で毎秒ラベルを更新しています。NSTimer
以前は Swift で orを使用してTimer
1 秒ごとに繰り返していましたが、曲を変更したり、曲を開始および停止したりするときに問題が発生しました。再生してから、正しい時間に更新されます)。その後、GCD を使用し続けましたが、バックグラウンド キューでも同じ問題が発生しました。そして、DispatchSourceTimer を使用して、次のログを取得しました。
「Fired」と表示されているのは実際の偶数ハンドラーですがDispatchSourceTimer
、「Timer Fired」はラベルなどを更新するハンドラー関数内にあります。明らかに、タイマーは正常に動作していることがわかりますが、メイン スレッドが頻繁に使用されているようです。
これが私のコードです:
そして、通知オブザーバーは次のとおりです。
タイマー起動の通知を受け取るオブジェクトのオブザーバー配列を維持しています。
テストを行って for ループを削除し、リストの最初のオブザーバーに通知しただけで、速度が少し向上しましたが、それでも問題は解決しませんでした。
曲を再生するだけで、数秒後にメインスレッドが実際にそれを処理できるようになり、時間を完全に表示できますが、MPMediaPlayer
フレームワークを使用して曲を変更したり、呼び出したりするとplay()
、pause()
遅れMPMusicPlayerController
が始まります。
どんな助けでも大歓迎です。ありがとうございました。
ios - Command Center には音楽情報が表示されるが、ロック画面には表示されない
Swift 4 以降、iOS 11 以降、Xcode 10 以降の使用
MPMediaPlayer を使用して音楽プレーヤーを作成しました。コマンド センターから操作できますが、ロック画面でも表示できるようにしたいと考えています。
正直なところ、これを行うためのコードを書いていないので、コマンド センターで表示/動作する理由について少し混乱しています。それにもかかわらず、ロック画面にも表示したいと思います。
これは私がこれまでに行ったことです:
1) 私は applicationMusicPlayer を使用しており、テスト中に何かが再生されていることを確認しました:
2) オーディオ、フェッチ、およびリモート通知を含めるように BackgroundModes を設定します。
3)AVAudioSessionコードを追加しました(試してみて、コメントアウトしてみましたが、違いは見られなかったので、何もしないようです):
4) この基本的なコードを使用して、基本的なハードコードされたコンテンツだけでロック画面に表示できるかどうかを確認しました。
5) この時点でロック画面に何かを表示しようとしているだけなので、積極的に情報を更新したり、コマンドに応答したりするための実装は何もしていません。
何もしていないのに、現在再生中の情報がコマンド センターに表示されるのはなぜですか?
コマンドセンターと同じように、ロック画面に情報を表示するにはどうすればよいですか?
編集: GitLab で同じ問題がある単純なプロジェクトへのリンク: https://gitlab.com/whoit/lockscreentest
編集: これをバグとして Apple に提出しましたが、まだ確認も解決もされていません。