applicationDidEnterBackground, playSoundFileNamed Crash - ios

When I tap Home Button the app calls AppDelegate function applicationDidEnterBackground, and applicationWillEnterForeground after I get back to it.
I use the following code:
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
mainScene.view?.paused = true
}
func applicationWillEnterForeground(application: UIApplication) {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
mainScene.view?.paused = false
}
and it works fine. I'm able to pause the app and resume it when needed. But if I tap Home Button at the moment when there is a sound (like "gun Fire", or "Coin fall Down" etc.) currently playing in my app with SKAction.playSoundFileNamed and then try to resume the app, it crashes. The only way I can resume it normally it is if there aren't any active sounds when I tap Home Button.
Any workaround?

Related

Swift, pause app with applicationWillResignActive

Swift 2.3, SpriteKit
I know about AppDelegate Functions:
applicationWillResignActive and applicationDidEnterBackground
I have the following code:
func applicationWillResignActive(application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
mainScene.view?.paused = true
}
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
mainScene.view?.paused = true
}
With applicationDidEnterBackground it works fine. I'm able to pause the scene by tapping Home Button and resume it after.
But with applicationWillResignActive it doesn't work. When I run my game and receive Phone Call, the game doesn't pause. It keeps running in the background, so when I'm done with call and go back, I can see all my nodes in a completely mess.
before willResignActive
After
I used print statement to check if applicationWillResignActive works when I receive a phone Call and it shows me that it is executing, but the app just doesn't pause.
Also I've noticed that when I tap Home Button the app call applicationWillResignActive and then applicationDidEnterBackground functions. When I receive a phone call only applicationWillResignActive function is called.
So my question is - how can I deal with phone calls and pause my App with applicationWillResignActive function. I don't understand why I can pause it when I tap Home Button and can't when I get a Phone Call.

When app switcher appears execute a command Xcode swift

I was wondering if anyone knew how to execute a command when the user double presses the home button and/or when the just press it to go to the home screen. Snapchat does this as it blurs out the background when double tapped or dismisses a view controller if you go out and back in.
Using Xcode 7.3.1 and if possible could the code be Swift 2.2 or 2.3
Thanks
Regards,
In your Appdelegate.swift file you will find two methods that allow you to execute code when your app changes from the foreground state to the background - like pressing the home button.
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state.
//This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
plz use your AppDelegate methods
func applicationWillResignActive(application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

I Wanted To Get Notified By Local Notification When My App Is In Background Or Else In Foreground

I have a PrayerButton in my drawer menu, On tapping it goes to
PrayerViewController, and in PrayerViewController
i have 5 Prayer Timings where i created a UI local notification method and fired those timings in firedate and sound too. now my query is.
where should i call my notification method.
“All i want is my local notification method should call when my app is in Background, foreground and it should continuously running like a service, so that whenever those 5 Prayer time will come on firedate then it should alert me by UI Local Notification banner (when in foreground) and if app is in background it should notify me".
i am a beginner in Stackoverflow might be my way of asking question will not be right but i tried asking Question.
sorry for the mistakes
and welcome to any reply
thanks in advance..
Use these app delegate methods
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

Restart app from background at its beginning state

I am trying to achieve this func. When user press home button the application will go to background (it will still run) and when he open it again the app will not start in the last view but from the start.
How to detect app went to background and reset it to start view. I think it should be something in app delegate
Thank you for all the comments but thats just the 1/2 of answer. How to poptorootvc from app delegate?
I think this is what you're looking for
func applicationDidBecomeActive(application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
Put this in your AppDelegate and just switch to whatever view you want in this function.
Alternatively, you could use one of these other AppDelegate functions that detects change of app state
func applicationWillResignActive(application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
}
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
You can put you code at
func applicationWillEnterForeground(application: UIApplication) {
}

Call a function when home button tapped in swift

I have been working on a game in swift and when the home button is tapped accidentally I would like to run a function that restarts the game. Does anyone know what code needs to be implemented to call a function when the home button is tapped and the app is closed. (by home button I mean the actual hardware button)
You can use one of the following methods in your AppDelegate
// Taken straight from the AppDelegate template
func applicationWillResignActive(application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillTerminate(application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
// Saves changes in the application's managed object context before the application terminates.
self.saveContext()
}

Resources