Sort of a big day. I decided to be not patient and soft launched ScreenCred! Don’t tell anyone yet 🤫.
I wanted to make sure things like the App Clip work in the wild. I also wanted to make sure the website was all up to date with App Store badge links and whatnot.
Going to test things and sit with it for a couple days. Then I will announce it to the 4 people that care. Might email some blogs. We’ll see. I’m not big on that stuff. But I suppose I should be if this is what I want to do for my living one day.
I submitted ScreenCred for review on Sunday. On Monday, it was rejected. I was expecting some sort of rejection. What I was not expecting was a rejection saying ScreenCred did not have enough features…
We found that the usefulness of your app is limited by the minimal amount of content or features it includes.
I was pretty disappointed. I’ve been working on ScreenCred for nearly 7 months, and it’s what I want it to be. I responded that I respectfully disagreed, included a couple screenshots of messages/posts of people saying they wanted an app like this, and asked for additional details. They cryptically responded with the same rejection message, but added “We look forward to reviewing your resubmitted app.” So I resubmitted, with no changes.
The next day, Tuesday, it was rejected again. This time, they couldn’t find the in-app purchases. That seems like progress? I responded with a screen recording of how to access the in-app purchases.
This morning, Wednesday, I woke up to a notification saying ScreenCred was approved and is now pending developer release!
For about a day, I was questioning everything. Should I just abandon this? Rewrite it as a web app? Give up on iOS development? Even with the approval, I still have those questions. I can’t really explain it, but I love writing iOS apps. There’s just something about it that sparks joy. But, Apple as a gatekeeper to the App Store is a risk. At any moment, they can decide your app no longer meets some guideline. The web is open, which is big advantage. I also really like making things for the web too. The web is not without its risks and challenges either. Even though web and iOS are not mutually exclusive, I have limited time, and I feel like I need to focus on one or the other for my sanity. It’s on my mind a lot, and it’s not an easy question to answer.
I submitted ScreenCred for review yesterday. After listening to the latest ATP today, I’m expecting some rejections around my use of movie and show posters in the screenshots, and potentially in the app. If it get’s rejected, I’m not sure how much effort I’m going to put into resolving issues. While I’ve spent a lot of time on the app (3–5 hours a week for the last 7 months or so…) I know it’s a niche app that would not likely be wildly successful. Probably not even mildly successful. But I would still like it to be on the App Store, for myself.
I have another app I want to work on with my wife for our kids. That one might have a better chance. So part of submitting ScreenCred was to help clear the decks before starting on that in earnest.
So we’ll see what happens! Perfect world, it sails through app review and makes enough to pay for it’s own server costs and more!
Needed some easy wins today. So I worked on adding some simple pages to screencred.app for support, press kit, and terms. Press kit still needs screenshots and stuff.
I also found some issues with the App Clip—wrong colors and a placeholder view. I will get those fixed tomorrow.
I knew I had seen. Feature in Swift strings that could automatically pluralize words depending on a value. Took me a while to find the actual thing I wanted. Turns out it’s called morphology. Jordan Morgan has a great post about it.
It works nicely when using Text in SwiftUI:
Text("Last compared \(timestamp.formatted()) and seen ^[\(historyItems.count) time](inflect: true)")
It’s not the nicest syntax, but better than doing it all myself.
As part of my efforts to improve accessibility in ScreenCred, I’ve been working at improving layouts for large Dynamic Type sizes. To help with this, I’m trying to use ViewThatFits. It works as I’d expect in most places. However, I had a lot of issues when trying to use it within a ScrollView for repeating items. I’m sure that a lot of my issues are from not really knowing how ViewThatFits chooses which view to use. What is “fits”? I’m not 100% sure.
In ScreenCreds, I have a couple places with lists and I want every item in that list to either be a horizontal layout or a vertical layout, but not a mix of both.
On an individual view, ViewThatFits works real well:
If the text gets too long, it will switch to use the VStack View. But, if I put that in a ForEach, which view that fits is dependent on the content, so some items may use HStack and others will VStack. Not what I want.
Unfortunately, this did not work. No matter what I tried, it always picked the second View. The only way I found to fix this is to switch between ScrollViews:
The way my views are constructed, it wasn’t as simple as this. It would’ve been tricky to refactor things to work like this. So I came up with a solution to use an Environment value.
enumLayout{
case horizontal, vertical
}
privatestructLayoutKey: EnvironmentKey{
staticlet defaultValue = Layout.horizontal
}
extensionEnvironmentValues{
var layout: Layout {
get { self[LayoutKey.self] }
set { self[LayoutKey.self] = newValue }
}
}
ViewThatFits {
Main()
.environment(\.layout, .horizontal)
Main()
.environment(\.layout, .vertical)
}
In this case, the ScrollView is a few views deep in Main. Each repeated item is a few views deeper. But, at the point I need to decide which layout to use, I can grab my layout Environment value.
So far, this seems to work the way I want! I’m not totally sure if this is performant or not.
Screen recording of ScreenCred showing the layout changing when using large Dynamic Type
I was really glad I was able to get ViewThatFits to work. The only other alternative was changing layouts at some arbitrary sizeCategory. That would be gross because it would depend on screen size and all that.
SO hopefully this will continue to work well. I should probably rewatch the WWDC video about ViewThatFits.
P.S. In places I couldn’t use the Xcode Previews, I’ve been using Sim Genie to easily change Dynamic Type in the simulator. Fantastic app.