Turn off audio playing? The Next CEO of Stack OverflowTurn off iPhone/Safari input element roundingCreating new AVPlayer while in background does not work?Record audio file and save locally on iPhoneHow to play audio from live streaming in backgroung iOS SwiftAVPlayer loading AVAsset from file that is appended simultaneously by external source (for macOS and iOS)iPhone stops playing audio in the backgroundNo audio from AVCaptureSession after changing AVAudioSessionSwift: AVPlayer release memory / resourcesAVPlayer Not Loading Media In BackgroundAVPlayer won't play new AVPlayerItem after failure occurs
Won the lottery - how do I keep the money?
What connection does MS Office have to Netscape Navigator?
Can I calculate next year's exemptions based on this year's refund/amount owed?
Would a grinding machine be a simple and workable propulsion system for an interplanetary spacecraft?
Towers in the ocean; How deep can they be built?
What flight has the highest ratio of timezone difference to flight time?
Can you teleport closer to a creature you are Frightened of?
Is there a way to save my career from absolute disaster?
Physiological effects of huge anime eyes
What day is it again?
Are the names of these months realistic?
TikZ: How to fill area with a special pattern?
Expressing the idea of having a very busy time
Is there a reasonable and studied concept of reduction between regular languages?
Is French Guiana a (hard) EU border?
Help understanding this unsettling image of Titan, Epimetheus, and Saturn's rings?
Graph of the history of databases
Is a distribution that is normal, but highly skewed, considered Gaussian?
How to avoid supervisors with prejudiced views?
Does Germany produce more waste than the US?
Defamation due to breach of confidentiality
IC has pull-down resistors on SMBus lines?
How to explain the utility of binomial logistic regression when the predictors are purely categorical
Decide between Polyglossia and Babel for LuaLaTeX in 2019
Turn off audio playing?
The Next CEO of Stack OverflowTurn off iPhone/Safari input element roundingCreating new AVPlayer while in background does not work?Record audio file and save locally on iPhoneHow to play audio from live streaming in backgroung iOS SwiftAVPlayer loading AVAsset from file that is appended simultaneously by external source (for macOS and iOS)iPhone stops playing audio in the backgroundNo audio from AVCaptureSession after changing AVAudioSessionSwift: AVPlayer release memory / resourcesAVPlayer Not Loading Media In BackgroundAVPlayer won't play new AVPlayerItem after failure occurs
I'm using AVPlayer to play audio from a URL. Everything works fine, but I don't know how to stop current Audio playing when I am in a different ViewController I don't want to call player.pause() in viewWillDisappear() because i want to stop it in specific cases, but I want still to play the audio in the background when the app is inactive.
I have this turned on in Xcode app settings for background playback when the app is inactive
2nd question: Can I improve this class or is everything ok?
protocol AVPlayerServiceDelegate
func playerDidUpdateCurrentPlayingTime(_ time: CMTime)
class AVPlayerService
static let instance = AVPlayerService()
private var audioPlayer: AVPlayer!
public weak var delegate: AVPlayerServiceDelegate?
func setupPlayer(forURL url: URL)
let playerItem: AVPlayerItem = AVPlayerItem(url: url)
audioPlayer = AVPlayer(playerItem: playerItem)
audioPlayer.play()
audioPlayer.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: DispatchQueue.main) (CMTime) -> Void in
if self.audioPlayer.currentItem?.status == .readyToPlay
self.delegate?.playerDidUpdateCurrentPlayingTime(self.audioPlayer.currentTime())
var isPlaying: Bool
return audioPlayer.isPlaying
var isPaused: Bool
return audioPlayer.isPaused
var rate: Float
return audioPlayer.rate
func seek(to time: CMTime)
audioPlayer.seek(to: time)
func seekToBeginning()
audioPlayer.seek(to: CMTimeMake(value: 0, timescale: 1))
func replay()
audioPlayer.seek(to: CMTimeMake(value: 0, timescale: 1))
audioPlayer.play()
func pause()
if let audioPlayer = audioPlayer
audioPlayer.pause()
func play()
audioPlayer.play()
func freshInstance()
audioPlayer = AVPlayer()
var assetDuration: CMTime
get
return audioPlayer.currentItem!.asset.duration
ios iphone xcode avfoundation swift4.2
add a comment |
I'm using AVPlayer to play audio from a URL. Everything works fine, but I don't know how to stop current Audio playing when I am in a different ViewController I don't want to call player.pause() in viewWillDisappear() because i want to stop it in specific cases, but I want still to play the audio in the background when the app is inactive.
I have this turned on in Xcode app settings for background playback when the app is inactive
2nd question: Can I improve this class or is everything ok?
protocol AVPlayerServiceDelegate
func playerDidUpdateCurrentPlayingTime(_ time: CMTime)
class AVPlayerService
static let instance = AVPlayerService()
private var audioPlayer: AVPlayer!
public weak var delegate: AVPlayerServiceDelegate?
func setupPlayer(forURL url: URL)
let playerItem: AVPlayerItem = AVPlayerItem(url: url)
audioPlayer = AVPlayer(playerItem: playerItem)
audioPlayer.play()
audioPlayer.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: DispatchQueue.main) (CMTime) -> Void in
if self.audioPlayer.currentItem?.status == .readyToPlay
self.delegate?.playerDidUpdateCurrentPlayingTime(self.audioPlayer.currentTime())
var isPlaying: Bool
return audioPlayer.isPlaying
var isPaused: Bool
return audioPlayer.isPaused
var rate: Float
return audioPlayer.rate
func seek(to time: CMTime)
audioPlayer.seek(to: time)
func seekToBeginning()
audioPlayer.seek(to: CMTimeMake(value: 0, timescale: 1))
func replay()
audioPlayer.seek(to: CMTimeMake(value: 0, timescale: 1))
audioPlayer.play()
func pause()
if let audioPlayer = audioPlayer
audioPlayer.pause()
func play()
audioPlayer.play()
func freshInstance()
audioPlayer = AVPlayer()
var assetDuration: CMTime
get
return audioPlayer.currentItem!.asset.duration
ios iphone xcode avfoundation swift4.2
add a comment |
I'm using AVPlayer to play audio from a URL. Everything works fine, but I don't know how to stop current Audio playing when I am in a different ViewController I don't want to call player.pause() in viewWillDisappear() because i want to stop it in specific cases, but I want still to play the audio in the background when the app is inactive.
I have this turned on in Xcode app settings for background playback when the app is inactive
2nd question: Can I improve this class or is everything ok?
protocol AVPlayerServiceDelegate
func playerDidUpdateCurrentPlayingTime(_ time: CMTime)
class AVPlayerService
static let instance = AVPlayerService()
private var audioPlayer: AVPlayer!
public weak var delegate: AVPlayerServiceDelegate?
func setupPlayer(forURL url: URL)
let playerItem: AVPlayerItem = AVPlayerItem(url: url)
audioPlayer = AVPlayer(playerItem: playerItem)
audioPlayer.play()
audioPlayer.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: DispatchQueue.main) (CMTime) -> Void in
if self.audioPlayer.currentItem?.status == .readyToPlay
self.delegate?.playerDidUpdateCurrentPlayingTime(self.audioPlayer.currentTime())
var isPlaying: Bool
return audioPlayer.isPlaying
var isPaused: Bool
return audioPlayer.isPaused
var rate: Float
return audioPlayer.rate
func seek(to time: CMTime)
audioPlayer.seek(to: time)
func seekToBeginning()
audioPlayer.seek(to: CMTimeMake(value: 0, timescale: 1))
func replay()
audioPlayer.seek(to: CMTimeMake(value: 0, timescale: 1))
audioPlayer.play()
func pause()
if let audioPlayer = audioPlayer
audioPlayer.pause()
func play()
audioPlayer.play()
func freshInstance()
audioPlayer = AVPlayer()
var assetDuration: CMTime
get
return audioPlayer.currentItem!.asset.duration
ios iphone xcode avfoundation swift4.2
I'm using AVPlayer to play audio from a URL. Everything works fine, but I don't know how to stop current Audio playing when I am in a different ViewController I don't want to call player.pause() in viewWillDisappear() because i want to stop it in specific cases, but I want still to play the audio in the background when the app is inactive.
I have this turned on in Xcode app settings for background playback when the app is inactive
2nd question: Can I improve this class or is everything ok?
protocol AVPlayerServiceDelegate
func playerDidUpdateCurrentPlayingTime(_ time: CMTime)
class AVPlayerService
static let instance = AVPlayerService()
private var audioPlayer: AVPlayer!
public weak var delegate: AVPlayerServiceDelegate?
func setupPlayer(forURL url: URL)
let playerItem: AVPlayerItem = AVPlayerItem(url: url)
audioPlayer = AVPlayer(playerItem: playerItem)
audioPlayer.play()
audioPlayer.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: DispatchQueue.main) (CMTime) -> Void in
if self.audioPlayer.currentItem?.status == .readyToPlay
self.delegate?.playerDidUpdateCurrentPlayingTime(self.audioPlayer.currentTime())
var isPlaying: Bool
return audioPlayer.isPlaying
var isPaused: Bool
return audioPlayer.isPaused
var rate: Float
return audioPlayer.rate
func seek(to time: CMTime)
audioPlayer.seek(to: time)
func seekToBeginning()
audioPlayer.seek(to: CMTimeMake(value: 0, timescale: 1))
func replay()
audioPlayer.seek(to: CMTimeMake(value: 0, timescale: 1))
audioPlayer.play()
func pause()
if let audioPlayer = audioPlayer
audioPlayer.pause()
func play()
audioPlayer.play()
func freshInstance()
audioPlayer = AVPlayer()
var assetDuration: CMTime
get
return audioPlayer.currentItem!.asset.duration
ios iphone xcode avfoundation swift4.2
ios iphone xcode avfoundation swift4.2
edited Mar 8 at 22:56
SwiftNewling
asked Mar 7 at 18:00
SwiftNewlingSwiftNewling
30315
30315
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You need a mechanism to talk to the player object in order to perform actions on it.
There are many ways to go about it.
Personally, I would create a dedicated class for the player that deals with instantiating it, loading the audio resource, playing, pausing, etc.
Then I would either have this class be a singleton so I can access it from anywhere, or inject it and pass it onto other classes where it will be used.
Basic Example:
class MyAudioPlayer
static let shared = MyAudioPlayer()
private var player: AVAudioPlayer?
func load(_ url: URL)
player = try? AVAudioPlayer(contentsOf: url)
func play(url: URL)
load(url: url)
player?.play()
func pause()
player?.pause()
func stop()
player?.stop()
Send actions from anywhere within app:
MyAudioPlayer.shared.play(someURL)
MyAudioPlayer.shared.pause()
As for playing in background even when app is not active will require (maybe in AppDelegate)
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback,
with: .duckOthers)
try? AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()
Thank you, why i can't make the avplayer public to change properties instead of making a function?
– SwiftNewling
Mar 7 at 18:58
@SwiftNewling You can if you want, no issues. I have used functions to enable finer control over the actions.
– staticVoidMan
Mar 7 at 19:14
accessing the player from a viewController directly isn't good as i've tested now. It doesn't get proper valid information like if its playing. It tells me it's false but it plays really. If i write that func in my service it works fine
– SwiftNewling
Mar 7 at 19:14
@SwiftNewling I changed my comments to be in context with my answer as I thought I may have misunderstood you
– staticVoidMan
Mar 7 at 19:16
1
@SwiftNewling I suggested auto-remove for multicast delegates because you would need an array of delegates for it. What you have right now doesn't need auto-remove, in a sense, it already is because ofweak. All is well, happy coding :)
– staticVoidMan
Mar 11 at 6:30
|
show 10 more comments
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55050148%2fturn-off-audio-playing%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You need a mechanism to talk to the player object in order to perform actions on it.
There are many ways to go about it.
Personally, I would create a dedicated class for the player that deals with instantiating it, loading the audio resource, playing, pausing, etc.
Then I would either have this class be a singleton so I can access it from anywhere, or inject it and pass it onto other classes where it will be used.
Basic Example:
class MyAudioPlayer
static let shared = MyAudioPlayer()
private var player: AVAudioPlayer?
func load(_ url: URL)
player = try? AVAudioPlayer(contentsOf: url)
func play(url: URL)
load(url: url)
player?.play()
func pause()
player?.pause()
func stop()
player?.stop()
Send actions from anywhere within app:
MyAudioPlayer.shared.play(someURL)
MyAudioPlayer.shared.pause()
As for playing in background even when app is not active will require (maybe in AppDelegate)
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback,
with: .duckOthers)
try? AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()
Thank you, why i can't make the avplayer public to change properties instead of making a function?
– SwiftNewling
Mar 7 at 18:58
@SwiftNewling You can if you want, no issues. I have used functions to enable finer control over the actions.
– staticVoidMan
Mar 7 at 19:14
accessing the player from a viewController directly isn't good as i've tested now. It doesn't get proper valid information like if its playing. It tells me it's false but it plays really. If i write that func in my service it works fine
– SwiftNewling
Mar 7 at 19:14
@SwiftNewling I changed my comments to be in context with my answer as I thought I may have misunderstood you
– staticVoidMan
Mar 7 at 19:16
1
@SwiftNewling I suggested auto-remove for multicast delegates because you would need an array of delegates for it. What you have right now doesn't need auto-remove, in a sense, it already is because ofweak. All is well, happy coding :)
– staticVoidMan
Mar 11 at 6:30
|
show 10 more comments
You need a mechanism to talk to the player object in order to perform actions on it.
There are many ways to go about it.
Personally, I would create a dedicated class for the player that deals with instantiating it, loading the audio resource, playing, pausing, etc.
Then I would either have this class be a singleton so I can access it from anywhere, or inject it and pass it onto other classes where it will be used.
Basic Example:
class MyAudioPlayer
static let shared = MyAudioPlayer()
private var player: AVAudioPlayer?
func load(_ url: URL)
player = try? AVAudioPlayer(contentsOf: url)
func play(url: URL)
load(url: url)
player?.play()
func pause()
player?.pause()
func stop()
player?.stop()
Send actions from anywhere within app:
MyAudioPlayer.shared.play(someURL)
MyAudioPlayer.shared.pause()
As for playing in background even when app is not active will require (maybe in AppDelegate)
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback,
with: .duckOthers)
try? AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()
Thank you, why i can't make the avplayer public to change properties instead of making a function?
– SwiftNewling
Mar 7 at 18:58
@SwiftNewling You can if you want, no issues. I have used functions to enable finer control over the actions.
– staticVoidMan
Mar 7 at 19:14
accessing the player from a viewController directly isn't good as i've tested now. It doesn't get proper valid information like if its playing. It tells me it's false but it plays really. If i write that func in my service it works fine
– SwiftNewling
Mar 7 at 19:14
@SwiftNewling I changed my comments to be in context with my answer as I thought I may have misunderstood you
– staticVoidMan
Mar 7 at 19:16
1
@SwiftNewling I suggested auto-remove for multicast delegates because you would need an array of delegates for it. What you have right now doesn't need auto-remove, in a sense, it already is because ofweak. All is well, happy coding :)
– staticVoidMan
Mar 11 at 6:30
|
show 10 more comments
You need a mechanism to talk to the player object in order to perform actions on it.
There are many ways to go about it.
Personally, I would create a dedicated class for the player that deals with instantiating it, loading the audio resource, playing, pausing, etc.
Then I would either have this class be a singleton so I can access it from anywhere, or inject it and pass it onto other classes where it will be used.
Basic Example:
class MyAudioPlayer
static let shared = MyAudioPlayer()
private var player: AVAudioPlayer?
func load(_ url: URL)
player = try? AVAudioPlayer(contentsOf: url)
func play(url: URL)
load(url: url)
player?.play()
func pause()
player?.pause()
func stop()
player?.stop()
Send actions from anywhere within app:
MyAudioPlayer.shared.play(someURL)
MyAudioPlayer.shared.pause()
As for playing in background even when app is not active will require (maybe in AppDelegate)
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback,
with: .duckOthers)
try? AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()
You need a mechanism to talk to the player object in order to perform actions on it.
There are many ways to go about it.
Personally, I would create a dedicated class for the player that deals with instantiating it, loading the audio resource, playing, pausing, etc.
Then I would either have this class be a singleton so I can access it from anywhere, or inject it and pass it onto other classes where it will be used.
Basic Example:
class MyAudioPlayer
static let shared = MyAudioPlayer()
private var player: AVAudioPlayer?
func load(_ url: URL)
player = try? AVAudioPlayer(contentsOf: url)
func play(url: URL)
load(url: url)
player?.play()
func pause()
player?.pause()
func stop()
player?.stop()
Send actions from anywhere within app:
MyAudioPlayer.shared.play(someURL)
MyAudioPlayer.shared.pause()
As for playing in background even when app is not active will require (maybe in AppDelegate)
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback,
with: .duckOthers)
try? AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()
edited Mar 7 at 18:31
answered Mar 7 at 18:14
staticVoidManstaticVoidMan
11k43875
11k43875
Thank you, why i can't make the avplayer public to change properties instead of making a function?
– SwiftNewling
Mar 7 at 18:58
@SwiftNewling You can if you want, no issues. I have used functions to enable finer control over the actions.
– staticVoidMan
Mar 7 at 19:14
accessing the player from a viewController directly isn't good as i've tested now. It doesn't get proper valid information like if its playing. It tells me it's false but it plays really. If i write that func in my service it works fine
– SwiftNewling
Mar 7 at 19:14
@SwiftNewling I changed my comments to be in context with my answer as I thought I may have misunderstood you
– staticVoidMan
Mar 7 at 19:16
1
@SwiftNewling I suggested auto-remove for multicast delegates because you would need an array of delegates for it. What you have right now doesn't need auto-remove, in a sense, it already is because ofweak. All is well, happy coding :)
– staticVoidMan
Mar 11 at 6:30
|
show 10 more comments
Thank you, why i can't make the avplayer public to change properties instead of making a function?
– SwiftNewling
Mar 7 at 18:58
@SwiftNewling You can if you want, no issues. I have used functions to enable finer control over the actions.
– staticVoidMan
Mar 7 at 19:14
accessing the player from a viewController directly isn't good as i've tested now. It doesn't get proper valid information like if its playing. It tells me it's false but it plays really. If i write that func in my service it works fine
– SwiftNewling
Mar 7 at 19:14
@SwiftNewling I changed my comments to be in context with my answer as I thought I may have misunderstood you
– staticVoidMan
Mar 7 at 19:16
1
@SwiftNewling I suggested auto-remove for multicast delegates because you would need an array of delegates for it. What you have right now doesn't need auto-remove, in a sense, it already is because ofweak. All is well, happy coding :)
– staticVoidMan
Mar 11 at 6:30
Thank you, why i can't make the avplayer public to change properties instead of making a function?
– SwiftNewling
Mar 7 at 18:58
Thank you, why i can't make the avplayer public to change properties instead of making a function?
– SwiftNewling
Mar 7 at 18:58
@SwiftNewling You can if you want, no issues. I have used functions to enable finer control over the actions.
– staticVoidMan
Mar 7 at 19:14
@SwiftNewling You can if you want, no issues. I have used functions to enable finer control over the actions.
– staticVoidMan
Mar 7 at 19:14
accessing the player from a viewController directly isn't good as i've tested now. It doesn't get proper valid information like if its playing. It tells me it's false but it plays really. If i write that func in my service it works fine
– SwiftNewling
Mar 7 at 19:14
accessing the player from a viewController directly isn't good as i've tested now. It doesn't get proper valid information like if its playing. It tells me it's false but it plays really. If i write that func in my service it works fine
– SwiftNewling
Mar 7 at 19:14
@SwiftNewling I changed my comments to be in context with my answer as I thought I may have misunderstood you
– staticVoidMan
Mar 7 at 19:16
@SwiftNewling I changed my comments to be in context with my answer as I thought I may have misunderstood you
– staticVoidMan
Mar 7 at 19:16
1
1
@SwiftNewling I suggested auto-remove for multicast delegates because you would need an array of delegates for it. What you have right now doesn't need auto-remove, in a sense, it already is because of
weak. All is well, happy coding :)– staticVoidMan
Mar 11 at 6:30
@SwiftNewling I suggested auto-remove for multicast delegates because you would need an array of delegates for it. What you have right now doesn't need auto-remove, in a sense, it already is because of
weak. All is well, happy coding :)– staticVoidMan
Mar 11 at 6:30
|
show 10 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55050148%2fturn-off-audio-playing%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
