Growing up as a girl, I have found myself in countless situations where I felt uncomfortable, in danger, or taken advantage of because I was alone. And now, as a rising high school senior, with the college process in full swing, I have been forced to face the reality of the danger young women face on college campuses in the United States. 1 in 5 women are sexually assaulted in college, and more than 90% of victims on college campuses do not report the sexual assault. Sitting through college information sessions and following tour guides around campuses, I listened as college representatives skirted around the question of sexual assault when brought up by concerned parents. Since college administrations can not be relied on to protect and stand up for girls facing this danger, and girls and women outside of the college setting frequently have nothing to rely on when alone, I decided to make a personal safety app to check-in with users and streamline communication with their friends and family.
What it does
Eyes allows users to avoid and escape dangerous situations. By stream-lining the process of alerting friends and family, Eyes lets its users bypass the tedious navigation through various apps to send texts, share location, or call their moms, and instead compiles these features into a single quick, easy, and efficient app.
Users can utilize Eyes to:
- Send an "Alert" to all of their pre-determined contacts (friends and family they select when first downloading Eyes) with a single button press.
- Select and send pre-determined or custom texts with just a few taps.
- Contact their friends/family and then immediately share their location with a single tap.
- Check-in on them at a customizable time interval and, if they fail to respond, remind them to alert/share their location with their contacts if they should find themselves in a potentially dangerous situation.
How I built it
After planning out the various features I wanted to include in my app, I started by adding all of the view controllers I would need for my most integral features. Once I had the basis for the app, I figured out how to ask for multiple of the user's contacts and parse their names and main phone numbers into table views for calling and texting. I then moved on to texting and calling from my app, adding pre-determined texts the user could choose from. After I finished the communication features, I moved to sharing the location. I started by displaying the user's location with a map view and sharing it with the display share sheet (I later added an option to "Share with Contacts" which takes the user to a table view of their selected contacts). At this point, I began to add animations to buttons and work on making the user interface more intuitive and comprehensive. I then moved to the last core feature of my app: notifications. This was one of the greatest struggles that I had with my app, and I moved through many different versions of my check-in notification feature, and finally ended up with check-in notifications sent at a customizable time interval asking the user to open the app and check in with their fingerprint. I edited the "activated" screen to include a display of the last time the user checked in. After these main features had been finished, although the notification feature did not entirely resemble my plan, I did final tests, fixed bugs, and edited the user interface.
Challenges I ran into
I ran into two major challenges over the course of creating this app, along with many smaller ones. The first challenge came when I tried to implement my initial idea for my notification feature: to have the app send regular notifications, and if the user didn't respond to several of these in a row, have the app alert the user's contacts. I quickly realized that if the app is running in the background and the user simply ignores the notification, the app can not tell that the user hasn't responded to the notification. I tried to address this by having a timer start when the notification is scheduled, but as soon as an app is sent to the background, all processes are suspended (including the timer), unless the app is constantly updating location data or something similar. I finally solved this problem with a background fetch, which wakes up the app at an interval decided by the operating system (the only control I have is to tell it to use the minimum background fetch interval) and check if the current date is more than the time interval since the last check in, and send a follow up notification. Although this does solve the problem, the exact interval that this follow up notification is sent after is variable. The second major challenge I faced was with alerting the user's contacts if they didn't respond to several notifications. Initially, when the background fetch told the app that the user had not checked in within the time interval, I wanted the app to automatically send a text to the user's contacts. The problem with this is that Apple does not allow an app to send texts from a user's phone unless the user presses "Send", which defeats the purpose of the automatic text. The two possibly feasible solutions that I came up with for this problem were to use push notifications and have every contact of every user download the app, or use an API like Twilio, and send texts from a different number. The problem with using an API would be that I would be paying for every text sent, which, as an independent developer with no investors, isn't really an option. The main problem with using push notifications would be that every contact would have to download the app, but I would have attempted this if I hadn't run out of time for this version.
Accomplishments that I'm proud of
I'm most proud of the fact that despite the honestly quite crippling struggles and setbacks I faced while creating this app, I was able to ship a product that is still useful. Hopefully users of my app will also find the features that I was able to implement useful and worthwhile, but whether or not they do, I am proud of the fact that I was able to move past the setbacks and know when to let go of a feature in order to ship the app early and get feedback from my user base. I am also proud of the fact that I went through the entire process of planning, coding, designing, and shipping an app to the App Store on my own.
What I learned
Looking back on the past four and half weeks, and remembering how convinced I was in my inability to program an app on my own, I realize just how much I learned while working on Eyes. From the importance of having a detailed timeline to the only efficient way to formulate Core Data entities, the methods, strategies, and information I learned while creating Eyes will stay with me as I continue coding in other programming languages as well as in my future iOS projects. Beyond the technical knowledge I gained, I learned how to efficiently find reliable solutions by browsing through similar coding problems on Stack Overflow, reading through Apple Developer Documentation, and searching for applicable tutorials. For the times when all else failed, when I had twenty breakpoints in my code and still couldn't figure out what was crashing my app, I learned how to productively ask for help. Identifying and explaining a problem to my peers and instructors allowed me to effectively get help from those around me. Most of all, I learned when to refuse to give up and when to let go. Faced with a deadline, I was forced to make hard decisions about my app, and I learned to separate the integral features from the non-essential.
What's next for Eyes
With my future updates of Eyes, I would like to add more functionality, specifically within the notification check-in feature. Ideally, I would like the create the system I imagined when first planning my app, that when a user does not respond to check-ins, their contacts are alerted through a text from a different number. Additionally, I would like to add further features using the hardware of the phone (ex: having an alert be sent if the power button is pressed three times), and the detection of the phone's motion (ex: if the phone/person falls, having a notification asking if they are ok). On the user interface side, I would like to add more animations and further customize the appearance of the app.