Capstone - Ayyyyyye

haiii :wave:t4:

My name is Jade and I’ve been lucky enough to spend this time exploring things I find interesting, and aim my compass towards the things in life that feel fulfilling and good. Turns out iOS development is one of those interesting and fun things, I’ve really enjoyed my time learning for the past 2-ish months.

I was a software engineer for about 6 years but before that I was a seasonal human. I ran summer camps in the summer - was a snowboard bum in the winter - dabbled in Martial arts in the off-seasons.

Anyhow, I hope to continue learning and ship something mildy interesting with minimal bugs :bug:. Keyboard cheers to that clink

Wish me luck!

1 Like

Week one is a wrap and I think next week I’m going to try and get this up into testflight to test it out IRL.

Progress over the past week - MVP pretty much done.
I was able to spend the week diving in a little deeper and it’s been a lot of fun.

Wins
I used Mapkit and honestly really struggled for a little while. I was having a rough time pinning down what triggers what. Once I understood that I was able to refactor and remove a lot of the logic from the views and pull it into the model. Which feels way better. These are some features I added with MapKit.

  • Search bar that auto populates cities using MKLocalSearchCompletion
  • Center on your location from pressing a button.
  • A sortable list of locations that updates when your location is updated
  • The mapview updates when your location or the search location updates

Tough Lessons

  • Holy moly, I spent so many hours refactoring. My data is closely related and things just kept getting messy. I really should have spent more time laying that out but sometimes I think you gotta dig yourself in, then out again to learn a lesson. That is, unfortunately how I learn sometimes.
  • I used a singleton instance for my DB (thanks chatGPT) which was great but I didn’t like that all the models has a bunch of singletons. It weirded me out that the relationships between them wasn’t explicit, so I created an AppCoordinator to track all the instances and injected from there.
  • Lastly, I didn’t realize the view needed to be present in order for the onChange to take affect. I had an onAppear attached to the mapView and it was overriding what I wanted to happen in the onChange. That was a super confusing bug to pin down :lady_beetle:

Alrighty internet friends. I hope ya’ll have a great weekend and good luck on your projects!

Back at it with the journal entry for the testing section: Capstone Project - Task 5
TLDR; I found bugs! :beetle:

I used loom to go through the app and screen record a little, here it is if you’re interested. The video is about 3min

Overall, testing went well. I haven’t worked with mobile before, so there were some things to consider for me. Here are the bugs and how I plan to fix them/did fix them.

  1. The first bug I ran into was thinking there would always be internet connectivity. After authentication, I grab the user object from the database and set the user to nil in case of an error, and was originally going to retry but if there is no connection thats silly, it left me with the infinite wait spinner . :skull_and_crossbones:
  • To fix this, I plan to store the user object locally so that after authenticating with firebase, assuming they have offline support for a user whose logged into the app previously, I can pull the user with the auth ID out of local storage. If anyone has a better option, please let me know! This is my first auth rodeo considering an offline option.
  1. I am using Kingfisher for downloading and caching images. I wrote a script in python to fetch images from pexels depending on the location and name. (For example, a photo for Crane Cove in San Francisco, CA.) I stored the image URL in the DB and when I opened the page the initial load took a long time then a photo would jump in out of nowhere. I didn’t have a wait spinner and it felt unresponsive so I added one.

  2. The last issue I found was with the targets for favoriting and going back were small. I added a double tap gesture on the ZStack (I tried to add a clear tapable rectangle over the screen but that wasn’t working so I attached it on the ZStack. I didn’t see any issues but if there is something I’m missing please lmk.)

Overall, testing went well. I’m sure they’ll be more bugs along the way. Cheers all!

Looks great. Well done.

With regard to your images that take time to load, when you save them are you making use of JPG compression to reduce the file size when stored in the DB?

Thank you for the compression tip! I’m pulling the photos directly from pexels at this point (it’s a personal project) but if I do decide to go further I’ll definitely take a look at how to handle that! If there’s a course that covers it let me know, I really like Chris’ teaching style.

Thanks again!

Ok I’m back at it. I’ve been testing out working with Cursor, it’s pretty banana’s but it brought back excitement for the project. I’ve been a little distracted.

I was able to…

  • Added images to the whatever blob storage firebase has and pulled from there.

  • Implemented role-based access control (RBAC) and locked privileged actions to admin / super-admin roles only.

  • Added a review workflow: new spots and edits are now stored as pending suggestions until a moderator approves them.

  • For funsies, added a rando generated display name

I’ll be on it again nights after the kiddos are asleep. I’m aiming for a deadline of submitting it to the app store by June 18th

Alrighty, I didn’t make the original deadline (I started a new job) but I am done with v1! Super excited about it. I set it up in testflight and I’m waiting for the review for external testers. Once I have the link I’ll add it here!

Alrighty, It’s in testflight! A little late to the party (I started a new job and I’m juggling 2 babies) but I made it to this step at least!

If anyone wants to test it out, here’s the link.

Key Features:

  • Map and list views of eFoil spots globally
  • User-generated content with moderation system
  • Favorites and personal spot collections
  • Detailed spot information (photos, skill levels, parking, warnings)
  • Community annotations for launch points and hazards

What I’d Loooooove Feedback On:

  • App performance and loading times
  • User interface and navigation
  • Location accuracy and search functionality
  • Photo upload and moderation workflow
  • Overall user experience and any bugs

If anyone see’s this and pokes around, thank you sooooo much in advance

No one ever does lol don’t worry!

One suggestion is to not have the login screen as the first thing, is there a reason to have an account from the very beginning? (This is also App Store Guideline 5.1.1(v) which is to try to delay the sign in as long as possible, or have some functionality without sign in)

And more guideline 4.8, cause you have sign in with google, you must also have Sign in with Apple

Testing notes

  • use the email address modifier for the email on the login / register screen
  • contact us, if they don’t have email set up (like I don’t) another good way is to copy the support email to the user’s clipboard so they can open their preferred email
  • I tap on one pin, close the view and then can’t tap on the same pin again
  • For navigation you should use NavigationStack or NavigationView to get the proper default navigation behavior, as opposed to a drag gesture
  • long pressing on the map to add an annotation feels kinda awkward, do you want to be able to add an annotation at a specific point on the map or is it more about adding an annotation for that location in general, because if it’s more general I’d have a plus button somewhere instead

Overall great work!!

Incredible! Thanks so much! I really appreciate you taking your time

  • That was such a solid suggestion to move the auth, I need to think about what it would look like, but the user only needs to be signed in if they don’t want ads or they want a favor something. Thank you! This is awesome!

  • contact us: That’s good feedback, I forgot that some people don’t configure the their mail. Honestly, I don’t even know if I do :joy: then again, I’m an Android user shhhhh

  • When you tap the pin and close it… I know what’s happening. I didn’t even think of that. Thanks!

  • I vaguely remember having an issue where the navigation stack captured, one motion and not the other. I can’t remember it but I’ll take a look. Thanks!

  • yeah, it’s not super intuitive to long press, but the exact pin matters because each spot can have many different launch points.

Thanks so much for going through that! I really appreciate all the feedback

1 Like

Oooohhhh :scream::scream::scream:

This, it doesn’t appear to be using NavigationStack as I’d expect, but whenever you update it, I can take a look or if you find it in your codebase ask a question and I can try to answer it

Ahhh okay I get it! I think long press is fine, I didn’t want to add anything yet, cause I also wasn’t sure if I could delete it lol