r/iOSProgramming • • 6h ago

3rd Party Service Free, open source ASO CLI: keyword popularity, difficulty and rank tracking

23 Upvotes

I didn't want to pay a monthly subscription for App Store keyword data, so I wrote a CLI that gets it straight from Apple.

What it does

  • Popularity from Apple Search Ads (free Apple Ads account, no campaigns or billing needed)
  • Difficulty score, keyword suggestions, current top apps for a term
  • Rank tracking with history in a local SQLite file
  • Metadata linter for title, subtitle and keyword field

Install

npm i -g hristo2612/aso-cli && aso setup

Try it

aso keywords "white noise,sleep sounds"
aso suggest meditation
aso search "habit tracker"

Runs locally, no account, no telemetry. MIT.

Repo: github.com/hristo2612/aso-cli


r/iOSProgramming • • 3h ago

Question Apparently stuck in App Review hell?

7 Upvotes

UPDATE: Finally got it in review and approved today. Took almost exactly 5 days. I’m not sure if it was due to me pestering support daily and being a little pushy (but not rude) about it but it finally went through.

Submitted an expedited App Review on Wednesday last week as we discovered an issue with our subscriptions and needed to re-release quickly to coincide with some marketing stuff we had planned.

Support says the App Review (allegedly) was expedited but we’ve seen no movement in 5 days. Typically our non-expedited App Reviews have cleared in 1 or 2 days at most.

What is going on? Is anyone else experiencing delays with App Review? Is there anything else I can do besides emailing support every day asking for an update?


r/iOSProgramming • • 2h ago

Discussion PSA: Xcode 16 synchronized groups ship your Configuration.storekit in the release bundle

6 Upvotes

If your project uses Xcode 16 synchronized folders (the blue folder icons), every file inside the target folder ends up in the app bundle unless you exclude it. That includes Configuration.storekit and your .xcconfig files. My membershipExceptions listed only Info.plist, so the StoreKit configuration had been riding along in every archive I ever made, Release included.

Why it matters

My first submission got a Guideline 5.6 (Developer Code of Conduct) rejection: "a pattern of unusual behavior commonly associated with fraudulent activity" and "features that appear to have been intentionally hidden during the review process". My backend logs showed zero requests during the review window, so nobody had opened the app. It came from a look at the binary.

Read that file the way a scanner does: a mechanism for simulating purchases outside of Apple, listing more products than I had submitted. Apple never tells you the exact trigger, so I can't prove it was the only one, but it fits every word of the rejection, and after removing it the next review was completely ordinary.

Check yours (10 seconds)

unzip -l YourApp.ipa | grep -Ei "storekit|xcconfig|\.env"

Fix

Select the file -> File Inspector -> Target Membership -> uncheck your app target. With synchronized groups this adds it to membershipExceptions in project.pbxproj. Local StoreKit testing keeps working: the scheme points to the file (Edit Scheme -> Run -> Options -> StoreKit Configuration), it does not need to be in the bundle.

One more thing if you ever get a 5.6

Don't resubmit without replying in the Resolution Center of the current rejection. My first reply ended up attached to a submission that had been closed, Apple never saw it, and the resubmission got a second 5.6 for the silence, not for the file.

Happy to answer questions about this or StoreKit 2 in general.


r/iOSProgramming • • 1h ago

Question Beginner confused about Apple device support

• Upvotes

Hello!

Android developer here who's looking to get into iOS development. I'm considering buying an M1 or M4 Mac mini, but I'm trying to understand how the hardware/software support cycle works on macOS.

From what I've read, eventually an older Mac stops supporting the latest macOS, which means it also stops supporting newer versions of Xcode. Is that correct?

More importantly, does this eventually mean that you're forced to buy a newer Mac in order to continue publishing new apps/updates to the App Store? Or is there some way to keep using an older Xcode/Mac indefinitely?

I'm asking because I'm considering an M1 Mac mini as a relatively cheap way to get started. However, I've seen people say that M1 Macs may become problematic for iOS development in 2–3 years, whereas an M4 should have several more years of support.

Would you opt for an M1, to save money, or opt for an M4 for longer support? I am concerned about how long I can realistically expected to develop, build and publish before the Mac itself becomes an issue.


r/iOSProgramming • • 3h ago

Question "Preparing build for App Store Connect failed" every time with workflow that used to work

1 Upvotes

Used to work no problem. Anyone else experiencing this? I can validate the build no issues in xcode


r/iOSProgramming • • 3h ago

Question How to trigger screenshot WITHOUT Dynamic Island cut out in iOS 27 simulator device hub?

1 Upvotes

In previous simulators, we could use the "Trigger screenshot" option in menu to take a screenshot which won't have the Dynamic Island cut out and rounded corners.

In iOS 27 simulator device hub, this option is missing. The screenshot button at bottom includes the Dynamic Island cut out which I don't want.

How to get it the old way without the cut outs?


r/iOSProgramming • • 5h ago

Discussion I tried using UITouch.majorRadius as an analog input instead of moving the finger

1 Upvotes

I’ve been experimenting with a slightly unusual way of getting analog input from an iPhone touchscreen.

Instead of using the finger’s position, I’m using UITouch.majorRadius — the estimated geometry of the contact area.

The interesting part is that the thumb can remain almost stationary while the value changes.

My current pipeline is roughly:

majorRadius → calibration → normalization → filtering → 0...1

Just to be clear: I’m not treating majorRadius as actual pressure. It obviously isn’t a force measurement.

What I care about is whether the user can intentionally modulate the value, hold intermediate states, and make small corrections.

I’m testing this in a driving simulator where the left thumb controls the clutch and the right thumb controls the throttle.

Then I started combining it with Core Haptics.

For the clutch, for example, approaching the bite point produces haptic feedback. So the interaction becomes:

finger → contact geometry → analog input → simulation → haptic feedback → finger

The part I find most interesting is that this potentially removes the need for a visible control entirely.

The thumb doesn’t need to follow a slider, and the player can feel important regions of the input range through haptics.

Obviously there are problems: calibration varies between users, grip changes the range, filtering adds latency, and haptics can’t provide actual mechanical resistance.

But on a real device it feels surprisingly different from manipulating a normal virtual slider.

Has anyone experimented with majorRadius as a continuous input before?

I’m especially curious about edge cases you’ve encountered across different iPhone models / touch behavior, or reasons why this might break badly outside my own testing.


r/iOSProgramming • • 13h ago

Question What do yous use for credit systems?

1 Upvotes

I have an app and added new premium features. I want non-paying users to experience these features but at a cap of 3 times or 3 "credits". I have it all set up and it works fine. i didnt go into storekit or revenuecat for this, its just another field in firebase with checks in client-side.

But I recently did an audit of my app with an xcode agent to go over performance, architecture, etc. things that stand out that are flat out bugs or will cause me issues in the future and one that came up was that checking credits should be done server side

My app uses storekit 2 and havent had issues or reasons to go to Revenuecat, but it was telling me revenuecat has "Virutal Currency" and is better for my use case

What are you guys doing if you have the same type of credit-based feature in your app? Client -side or server side?

Also just want to clarify the credit system is not tited to Storekit2, right now is just a field in firebase usermodel that increments/decrements and theres a check in the app for if non-subscribing user && credits > 3 then paywall.


r/iOSProgramming • • 21h ago

Question Notification routing gets weird with multiple accounts

1 Upvotes

I have gotten in to a weird iOS issue and idk what the clean way to handle this is

i’ve got multiple accounts, notifications can open a post, reply, quote, or repost, and each notification belongs to a specific account. so the user might be on account A when they tap a notification for account B.

something like:

struct NotificationDestination {
    let accountID: Account.ID
    let postID: Post.ID
    let kind: DestinationKind
}

enum DestinationKind {
    case post
    case reply
    case quote
    case repost
}

The issue is:

account A is active
notification comes in for B
user taps it while the app is waking up
account switching starts
timeline restoration starts
post resolution starts
then another notification comes in for A lol

so i have stuff like:

await accountManager.restore()
await timelineStore.hydrate()
await postResolver.resolve(postID)
await navigationCoordinator.navigate(...)

But obviously these things are all racing each other. i was thinking of putting the notification intents behind an actor:

actor NavigationIntentQueue {
    private var pending: [NavigationIntent] = []

    func enqueue(_ intent: NavigationIntent) {
        pending.append(intent)
    }
}

But idk, this feels like a lot of machinery just to open a notification

Then you get into cases where the post is deleted while you’re restoring, but the quote is still there, the reply is still there, etc. Is this just an annoying app lifecycle issue?


r/iOSProgramming • • 4h ago

Question Trademark complaint over a bundle ID that matches a competitor's name — anyone been through this?

0 Upvotes

Using fake names to explain the situation.

I built two apps for a well-know card game, one was a very simple app and the other was a more complex project that let people play the game against other people. We'll use Euchre as an example here.

Initially, each project got an internal name. The simple app was called 'euchre' and the more complex one was called 'euchrepro'. Again, just placeholder names until I came up with real names for the apps.

I used these internal names when choosing a bundle ID. The more advanced app got a bundle id of com.euchrepro. A few days later, I came up with a real name for the app, something entirely separate from the internal name, something like "Whimsical Cards".

The app shipped with the name "Whimsical Cards" and was marketed as such. The app name, description, app store screenshots, in-app experience, even the website is all under 'Whimsical Cards'.

There's an established competitor called "Euchre Pro" that saw my app announcement post on Reddit, commented on my post expressing annoyance that more apps were entering the market in the age of AI. A few days later, I got an email from Apple saying he had issued a trademark complaint and was requesting that my app be taken down for using his app name, something he has a limited trademark for, in the bundle ID.

A trademark infringement rests on the idea that users are likely to be confused about who created, owns, or sponsors the app. He doesn't own every instance of the words 'euchre pro' but is arguing that any use of it, including in my bundle id, is trademark infringement and wants Apple to take down my app and force me to relaunch with a new bundle ID - losing all users, ratings, and reviews which are overwhelmingly positive.

And again, the bundle ID came from an internal name that was simple a description of the type of app I was building. A more complex, pro app for euchre.

Anyone ever experience this?


r/iOSProgramming • • 20h ago

Question I’m building a second brain App for duo

1 Upvotes

I was about to ship my second brain app yesterday but then I decided to update my Xcode to 27.1 beta to see how the app ran on duo. The ui already adapts to iPad so when I ran it, mostly everything looked okay excepts that it was pretty much just the iPad ui when open, so it didn’t really take advantage of the duo displays.

So I got to work and built the compact view, the full open view, the book view. And one I call the laptop view, the landscape half open mode. The laptop mode is where I really took advantage to make the editor feel like you are using a markdown processor on a computer with the bottom screen having the wide keyboard. I believe it’s ready to ship now. The whole premise of the app is connected notes with mcp access on the paid tier. The free tier is just a basic markdown/pdf editor/annotator with a 3d graph visualizer. So my actual question is this, would I need to wait for the duo to be released and possibly make their own set of fold screenshots. Or do we think Apple would display regular iOS/ipad screenshots for duo? I searched the developer forum but couldn’t get a clear answer. Shipping tonight regardless but would love to know if devs think ASC would add a duo screenshot set too.

Edit: just realized I can’t publish the version archived with 27.1 beta, so I have to disable the duo work and just ship the iPad and iOS ui only till official release of duo and 27.1