Is it possible to build an alarm clock such as the built in app from Apple? - ios

A lot of todo-list apps such as Wunderlist offer some kind of reminder feature which usually just fires off a notification.
But I have never encountered an app that offer a similar notification view as the built in preinstalled alarm clock. You know, that locks the phone and offers a snooze option.
This makes me wonder if the alarm clock functionality that is built into the preinstalled iOs app from Apple including setting time or add a snooze button etc is only available for that particular app?
Since I'm a designer without any coding skills I only want to know if it possible or not.

Unfortunately this is unavailable for developers. You can check all of alarm clock apps in AppStore, all of them are using the standard local notifications. Which will fire once and that's all. You can of course set your custom sound and change couple of options, but it will never work like one build in Clock app inside iPhone.
You can read more about local notifications in Apple documentation: https://developer.apple.com/reference/usernotifications/unnotificationrequest

I figured Alarmy is constantly playing (when there is an alarm set up) a silent sound in the background. Like Spotify, but silent. This keeps the app active all the time. I came to this conclusion by logging the result AVAudioSession.sharedInstance().isOtherAudioPlaying (Swift 4) in my own application. Whenever Alarmy is terminated it returns false, whenever Alarmy is running in the background it returns true. Same thing happens for the app linked by Ernesto Elsäßer.
I used the same technique and I also used this pod to trigger a function when the time comes and start the real music.
I did this for testing and am not going to make an app out of it because playing silent sounds in the background is against Apple's rules. I don't know how Alarmy (or other apps that use this same method) got away with it.
Some related questions:
How do you constantly run in background?
App “Alarmy” is able to play iTunes song from background state… How?
Wake up application in background using AudioSession like Alarmy iOS app
Also you can check this article out.

This app seems to do exactly this, but I have no clue how ...
I tested it, and it managed to start playing music on a locked device at an arbitrarily chosen time, and for way longer than the 30s timeframe allowed for notification sounds. Further, the music is streamed from an online radio station, meaning they found a way to ...
wake up the app from a scheduled notification without user interaction
create a socket connection to a radio station in the background
start playing sound in the background for an indefinite amount of time
I also tried out the alarm in Airplane Mode, and it still played a locally stored backup song, so it probably doesn't abuse the VoiP background mode or push notifications, but really is triggered by a local notification ...
So although I can't tell how, it looks like there is an App Store Review-proof way to create a real alarm app.
(I am not affiliated with the developers of this app, just did some research on what's possible.)

Related

Playing a sound periodically in the background on iOS

I'd like to play a sound periodically while the app is in the background but after doing some research it's not certain if this is possible. Before I give up or waste too much time trying I want to double check with the community if this is really possible or not.
I figured out how to enable playing sounds while the app is in the background but the app is still eventually killed and the timer stops firing (there's a 10 minute period it runs in suspended mode if I use beginBackgroundTask: but that's not enough). Other ideas I had:
1) There appears to be a "background fetch" mode which could maybe be used like a timer but this is a hack and may be rejected by Apple.
2) Loop blank audio in the background or some other looping part of audio API's to keep the app alive? Again Apple may reject that even it's possible.
3) Enable the location API to keep the app alive and play audio. Hack again, bad for battery and Apple 99% will reject this.
4) I read somewhere that push notifications could work for this but that requires a complicated server backend and if it's possible that last resort.
Are any of those methods viable or are there others?
You can use scheduled Local Notifications with sounds.

Start playing audio when app is force killed

I have seen many links that the app will play audio when the app is in background. Using AVAudioSessionCategoryPlayback it is possible.
My question is, lets say the app is killed. but I want to play audio at a particular set time.Even though the app is not in background but force killed. Is it possible?
The app cannot play sound, or do anything for that matter, if it isn't running. You cannot launch the app if it isn't running, because of the bootstrap problem: "you" are the app, and ex hypothesi, you are not running and therefore (wait for it) cannot do anything.
The best you can do is attempt to induce the user to launch the app for you. For example, you could ask the system to present to the user a notification on your behalf at the set time. The system is running (unless the user has turned off the device), so this stands a good chance of working. The user can respond to the notification by launching your app; it isn't certain that the user will do this, but it's a reasonable hope.

IOS (Swift) Background speech

I'm writing an exercise app that runs a series of timers back to back that are determined by the users exercises and the times they have entered for them e.g. push UPS for 30 seconds, squats 20 seconds...
When the timer reaches zero, the app speaks the next exercise, and starts the next timer.
The app also allows the user to play music from playlists whilst they exercise, so I have set the Audio background mode in capabilities in swift.
When in the foreground, everything works as expected, and the times, and speech fire when they are meant to, however, when the app is backgrounded, only the music continues and everything else stops.
I understand that Apple have strict rules on background processes and multitasking, but I have downloaded a number of apps that seem to work fine in the background and continue to speak the intervals as they become due (Seconds Pro, Onyx Timer etc.)
I have researched this for days, but cannot come up with an answer, background fetching doesn't seem to be reliable enough for a time based app, as you can't guarantee when it will fire, I've also looked into local notifications, but they don't allow speech when they trigger, just a short sound, they also have a limit of 64 notifications, which limits the amount of intervals the user can set
I have set the app to keep the screen awake whilst the timer screen is running, but this means you have to keep the screen on whilst you train, which in turn will add an unnecessary drain on the battery, which seems to go against everything Apple is trying to accomplish with the limited background activity
Push notifications seemed like one solution, but this would mean I have to setup some sort of external server and surely this would be interrupted if the user didn't have an Internet connection.
I have read multiple threads about people running a silent audio stream in the background to keep their app alive in the background (not approved by Apple), but my app already plays audio in the background and has no effect on the rest of the app being suspended?
How would I go about achieving this?
I have thought of a workaround, but I don't know if it's good practice, or if it will get the app kicked if I try to upload it to the app store
My solution was to queue my speech based on the time set in each timer
for timer in 0...timersArray.count{
let sentence = timer.speech
let speechUtterance = AVSpeechUtterance(string: "\(sentence)")
speechUtterance.postUtteranceDelay = timer.time
synth.speakUtterance(speechUtterance)
}
Then the speech would just trigger at the appropriate times, even though the timer wasn't running in the background
When I ran this code, it worked as expected and the speech triggered when the timer would have finished (just as if it was running)
When running this code though, I noticed that not only did it trigger the speech at the correct time, it also kept my app running in the background, which is exactly what I wanted in the first place.
Is this allowed practice, or will it get booted from the store?
As my app plays music in the background and has the audio capability set, is there a way I can use a similar approach, but with the music in the background, rather than the queued utterance approach.
I tried with MPMediaPlayer, AVPlayer, and AVQueuePlayer, but nothing worked, the music played in the background, but the rest of the app stopped
If I set "Does not run in background" to "Yes" in the Plist.info, the app will now run when the screen is locked, it still won't run in the background though?
There are so many apps in the App Store that seem to run happily in the background, I can't believe it's this hard to get it to work?
A number of the ones I have tried, are not listed under notifications, so I know it's not a local notification, they also work in airplane mode, so it can't be remote push notifications

Running IOS App with Screen Locked

I am working on a sports app that uses GPS and OpenEars text-to-speech. The app delivers speed and other GPS info to the user audibly (via earphones) so the user (skier, cyclist, etc) can get the GPS info without looking at the screen. In order to save battery life, I would like the app to run in the background with the screen off. Is this possible with IOS? I tried setting "Required backgrund modes" for both GPS and audio, but my app quits working when the screen is off.
thanks..
One one to get around it is to have a silent audio file playing, when there is no audio, it might get your app rejected in the app store though... here is a question that talks about the silent audio file playing to keep in the background... It might get through app store approval in your situation since it is an app that relays on audio as one of its main functionalities..
You can subscribe to GPS info change notifications and your app will run when something needs to be updated. Check this.
Please note this sentence:
"If you leave this service running and your application is subsequently suspended or terminated, the service automatically wakes up your application when new location data arrives. At wake-up time, your application is put into the background and given a small amount of time to process the location data. Because your application is in the background, it should do minimal work and avoid any tasks (such as querying the network) that might prevent it from returning before the allocated time expires. If it does not, your application may be terminated."
There's no way to do it as service except some special cases provided by ios. But you can simulate it. This post answer how to:
https://stackoverflow.com/a/19121250/2835520
I hope it's gonna help!

Equivalent of Android's services on iOS

I'm trying to implement an Alarm clock application for iOS. I have the basics down, like scheduling alarms and the like, but where I'm stuck is to start executing code in the background as soon as the alarm goes for ~ 1 minute / till the user turns it off manually.
Is this possible at all in iOS without the user explicitly swiping their finger to disable the notification and launch the app?
Thanks,
Teja
There's no real way to achieve this on iOS. The only types of apps that are allowed to execute code while not being the frontmost app are GPS/Navigation apps, apps that play audio, and VOIP apps. There's an exception that an app can ask the system for time to finish some long running task but this is probably not useful for your needs.

Resources