Skip to content

Commit 9b50b2e

Browse files
committed
[ios] fix observer and audio activate problems
1 parent 735eaf9 commit 9b50b2e

File tree

1 file changed

+11
-15
lines changed

1 file changed

+11
-15
lines changed

ios/RNInCallManager/RNInCallManager.swift

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
2929
var isProximitySupported: Bool = false
3030
var isProximityRegistered: Bool = false
3131
var proximityIsNear: Bool = false
32+
var proximityObserver: NSObjectProtocol?
3233
var defaultAudioMode: String = AVAudioSessionModeVoiceChat
3334
var defaultAudioCategory: String = AVAudioSessionCategoryPlayAndRecord
3435
var origAudioCategory: String!
@@ -62,7 +63,6 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
6263
}
6364
print("start() InCallManager")
6465
self.storeOriginalAudioSetup()
65-
_ = try? self.audioSession.setActive(false)
6666
//self.audioSession.setCategory(defaultAudioCategory, options: [.DefaultToSpeaker, .AllowBluetooth])
6767
_ = try? self.audioSession.setCategory(self.defaultAudioCategory)
6868
_ = try? self.audioSession.setMode(self.defaultAudioMode)
@@ -155,8 +155,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
155155
print("startProximitySensor()")
156156
self.currentDevice.proximityMonitoringEnabled = true
157157

158-
//self.stopObserve(self, name: UIDeviceProximityStateDidChangeNotification, object: self.currentDevice)
159-
self.startObserve(UIDeviceProximityStateDidChangeNotification, object: self.currentDevice, queue: nil) { notification in
158+
self.stopObserve(self.proximityObserver, name: UIDeviceProximityStateDidChangeNotification, object: nil) // --- in case it didn't deallocate when ViewDidUnload
159+
self.proximityObserver = self.startObserve(UIDeviceProximityStateDidChangeNotification, object: self.currentDevice, queue: nil) { notification in
160160
let state: Bool = self.currentDevice.proximityState
161161
if state != self.proximityIsNear {
162162
print("Proximity Changed. isNear: \(state)")
@@ -173,16 +173,18 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
173173

174174
print("stopProximitySensor()")
175175
self.currentDevice.proximityMonitoringEnabled = false
176-
self.stopObserve(self, name: UIDeviceProximityStateDidChangeNotification, object: self.currentDevice)
176+
self.stopObserve(self.proximityObserver, name: UIDeviceProximityStateDidChangeNotification, object: nil) // --- remove all no matter what object
177177
self.isProximityRegistered = false
178178
}
179179

180-
func startObserve(name: String, object: AnyObject?, queue: NSOperationQueue?, block: (NSNotification) -> ()) {
181-
NSNotificationCenter.defaultCenter().addObserverForName(name, object: object, queue: queue, usingBlock: block)
180+
func startObserve(name: String, object: AnyObject?, queue: NSOperationQueue?, block: (NSNotification) -> ()) -> NSObjectProtocol {
181+
return NSNotificationCenter.defaultCenter().addObserverForName(name, object: object, queue: queue, usingBlock: block)
182182
}
183183

184-
func stopObserve(observer: AnyObject, name: String?, object: AnyObject?) {
185-
NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object)
184+
func stopObserve(_observer: AnyObject?, name: String?, object: AnyObject?) -> Void {
185+
if let observer = _observer {
186+
NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object)
187+
}
186188
}
187189

188190
// --- _ringbackUriType: never go here with be empty string.
@@ -212,10 +214,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
212214
self.mRingback.prepareToPlay()
213215
//self.audioSession.setCategory(defaultAudioCategory, options: [.DefaultToSpeaker, .AllowBluetooth])
214216

215-
_ = try? self.audioSession.setActive(false)
216217
_ = try? self.audioSession.setCategory(self.defaultAudioCategory)
217218
_ = try? self.audioSession.setMode(self.defaultAudioMode)
218-
_ = try? self.audioSession.setActive(true)
219219
self.mRingback.play()
220220
} catch {
221221
print("startRingtone() failed")
@@ -260,10 +260,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
260260
self.mBusytone.prepareToPlay()
261261
//self.audioSession.setCategory(defaultAudioCategory, options: [.DefaultToSpeaker, .AllowBluetooth])
262262

263-
_ = try? self.audioSession.setActive(false)
264263
_ = try? self.audioSession.setCategory(self.defaultAudioCategory)
265264
_ = try? self.audioSession.setMode(self.defaultAudioMode)
266-
_ = try? self.audioSession.setActive(true)
267265
self.mBusytone.play()
268266
} catch {
269267
print("startRingtone() failed")
@@ -309,10 +307,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
309307
self.mRingtone.prepareToPlay()
310308
//self.audioSession.setCategory(defaultAudioCategory, options: [.DefaultToSpeaker, .AllowBluetooth])
311309

312-
_ = try? self.audioSession.setActive(false)
313310
_ = try? self.audioSession.setCategory(AVAudioSessionCategorySoloAmbient)
314311
_ = try? self.audioSession.setMode(AVAudioSessionModeDefault)
315-
_ = try? self.audioSession.setActive(true)
316312
self.mRingtone.play()
317313
} catch {
318314
print("startRingtone() failed")
@@ -401,13 +397,13 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
401397
// --- this only called when all loop played. it means, an infinite (numberOfLoops = -1) loop will never into here.
402398
//if player.url!.isFileReferenceURL() {
403399
let filename = player.url?.URLByDeletingPathExtension?.lastPathComponent
400+
print("finished playing: \(filename)")
404401
if filename == self.bundleBusytoneUri?.URLByDeletingPathExtension?.lastPathComponent
405402
|| filename == self.defaultBusytoneUri?.URLByDeletingPathExtension?.lastPathComponent {
406403
//self.stopBusytone()
407404
print("busytone finished, invoke stop()")
408405
self.stop("")
409406
}
410-
print("finished playing: \(filename)")
411407
}
412408

413409
func audioPlayerDecodeErrorDidOccur(player: AVAudioPlayer!, error: NSError!) {

0 commit comments

Comments
 (0)