Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.6k kez görüntülendi
ios development kategorisinde tarafından
Şimdi tuhaf bir sorunla karşılaştım. Cihazın sessize alma tuşunu kullanarak cihazı sessize alıyorum. Sonra uygulamayı başlatıyorum. Uygulamada bir ses çalıyor ViewController içerisinde. Ama cihaz slient modda olmasına rağmen çalıyor. Bunun için nasıl bir kontrol sağlamalıyım?

İstiyorum ki, cihaz slient moddaysa uygulama içerisindeki sesler hiç çalmasın. Umarım anlatabilmişimdir.

1 cevap

+1 oy
tarafından

uygulama içerisinde çalan ses dosyalarının interruption'larda (arama gelmesi gibi mesela) veya cihazın sessize alınması veyahut arka planda çalışan ve ses dosyalarını oynatan başka uygulamalarla koordineli bir şekilde çalışabilmesini sağlamak için (müzik veya radyo uygulamaları gibi) uygulamanızın appdelegate dosyası içerisinde AVAudioSession handle etmeniz gerekiyor.

tarafından
:) Teşekkür ederim. Eksik olma üstadım.
tarafından
hmm problemi şimdi daha iyi anladım. evet yapmak istediğiniz şu sanırım yanlış anladıysam düzeltin;

uygulama içerisinde bazı seslerin, cihaz sessize alındığında oynatılmasını istemiyorsunuz fakat aynı zamanda yine uygulama içerisinde çalınan bir müzik dosyasının uygulama arka plana gittiğinde dahi çalınabilir olmasını istiyorsunuz.
evet, bu başlıbaşına bir sorun. :)

çünkü AVAudioSession için category set ederken sizinde fark ettiğiniz üzere müziğin arkaplanda çalınabilmesi için AVAudioSessionCategoryPlayback opsiyonunu seçmek zorundayız.

ama bu durumda diğer ses dosyaları cihaz sessize alınsa dahi hala çalınabilir olacaklar.

bu durumda category opsiyonunu AVAudioSessionCategoryAmbient yapmak lazım fakat bu defa da uygulama background'a gittiğinde arkaplanda çalınmasını istediğiniz dosya çalınmayacak.

iş bir kısır döngüye giriyor. :)
çünkü sizinde farketmiş olabileceğiniz gibi AVAudioSession category'si bir sharedInstance. yani tüm audio işlemleri için sadece bir seçim yapılabilir.

bu durumda category seçimini AVAudioSessionCategoryPlayback olarak bırakıp,
uygulama içerisindeki bazı seslerin çalınmaması opsiyonunu cihazın sessize alma switch'i yerine kullanıcıya uygulama arayüzünde özel bir sessize alma butonu seçeneğiyle sunmak tek akılcı çözüm.

kullanıcı bu butona tıkladığında çalınmasını istemediğiniz seslere ait aksiyonları pasifize etmek ve halihazırda çalınmakta olan sesleri de stop() ile durduracak bir çözüm tek akıl karı yol gibi duruyor.

tabi kullanıcı sessize alma opsiyonunu kapattığında, opsiyonu açarken çalınmakta olan sesler varsa bunların kendiliğinden yeniden başlatılması gibi bir nüansı da kuracağınız yapıda atlamamalısınız.

Aksi takdirde sessize alma butonu aslında bir tür tüm sesleri durdurma butonu gibi bir işlev kazanacaktır ki , bu da kullanıcı deneyimi açısından olumsuz bir durum oluşmasına neden olabilir.
tarafından
Teşekkür ederim üstadım.

Uygulama içerisinde bir müzik oynatıcı var.  Uygulama arkaplana düşüyor. Müzik çalıyor. Kullanıcı müziğini dinliyor. Sonra kullanıcı aniden cihazını sessize alıyor. İstiyor ve umuyor ki her ne varsa  çalan bu slient tuşuna teslim olup saygı göstersin :) Ama olmuyor. Uygulamaya dönüp müzik playeri pause etmesi lazım.

Sizin de söylediğiniz gibi biraz kısır döngü oldu benim için. Herhalde  henüz iOS ortamında bulunmayan bir Slient mode beklentisine girmişim ben :))
tarafından
ios'un default müzik oynatıcısına bakın.
müzik arka planda çalınırken cihaz sessize alınsa dahi, müzik çalmaya devam eder.
kullanıcının ya kilit ekranından yahut müzik oynatıcısı içerisinden pause butonuna basması gerekir.
:)
tarafından
:) Doğru. Ama keşke benim hayal ettiğim gibi özellik olsaymış ne güzel olurdu.
Ben nasıl bu noktaya gelmişim, nasıl böyle bir beklentim oluşmuş :)  herhalde uykusuzluktan oldu.

Ama üstadım  çok faydalı oldu bir yandan. AVAudioSession olayını AppDelegate içerisinde handle etmek. Ben müzik oynatacağım  her  bir VC içinde ayrı ayrı yapıyordum bunları. En azından bundan faydalanmak bile güzel :)
...