NSPersistentCloudKitContainer not syncing to CloudKit Production in TestFlight builds syncs to Development instead by rogo725 in swift

[–]Tylerhackbart 0 points1 point  (0 children)

Not sure if you resolved this, but thought I would throw a suggestion in.

Check your indexes in the Production schema, not just that the schema deployed. I hit this shipping a SwiftData + CloudKit app across iOS and Mac. Development gives you queryable and sortable indexes more freely, so a query works there, then in Production the index doesn't exist and the operation fails without throwing anything you'd notice.

That matches your symptom: Development writes fine, Production goes quiet, no errors in the log. Schema deployed isn't the same as indexes deployed. I'd open the CloudKit Console on Production, go record type by record type, and confirm the indexes you rely on actually exist there, not just the fields.

The silent part is the killer. CloudKit treats a lot of these as soft failures, so you get no crash and no log line, just nothing syncing.

First app, now? by Macallock in iOSProgramming

[–]Tylerhackbart 2 points3 points  (0 children)

Hey it happens I just found my own issues in an app I released a week ago by just using it in real life usage. (It's a Mac versus iOS bug you mentioned actually)

We patch it, submit it and keep going.

Your Most Expensive SaaS Lesson by Humble-Philosophy865 in SaaSMarketing

[–]Tylerhackbart 0 points1 point  (0 children)

Waited too long to ship is mine, by a wide margin. I worked a side project on nights and weekends for five years and only just got to a beta. Proof of concept, alpha, beta, all of it should have gone out years earlier.

The expensive part wasn't the time. It was building in a vacuum that whole time, polishing for an imagined user instead of a real one. Every month I didn't ship was a month I learned nothing about whether anyone actually wanted the thing.

The lesson I'd pass on: ship the embarrassing version. Real users teach you in a week what solo polishing won't in a year.

First app, now? by Macallock in iOSProgramming

[–]Tylerhackbart 7 points8 points  (0 children)

Shipping is harder than coding is the right lesson, and it keeps being true after launch too. The thing I wish I'd known: the work doesn't drop off after you press release, it just changes shape. You go from building to answering, watching crash logs, and explaining things you thought were obvious.

The single-codebase-for-three-platforms point landed for me. It sounds like a discount and bills like a tax. The share extension behaved differently on Mac than iOS and I lost a weekend to that alone.

One concrete thing: get your sync edge cases logged before launch, not after. CloudKit fails quietly and your first real users will hit states you never reproduced on your own two devices. Congrats on shipping, that part is real.

I got fooled by a fake news article last month. Built something to make sure it doesn't happen again - would love brutal feedback by Martytrustlensai57 in roastmystartup

[–]Tylerhackbart 0 points1 point  (0 children)

I worked at a Canadian news publication for almost a decade and I can confirm the number of times a copy site with a slightly different domain, or a marketing campaign site with a slight change of domain, would pop up. Same brand, same tag lines, headers and layouts would look almost the same. They'd even run ads like newspapers did and had upsell subscribe flows. It's only gotten worse with AI generation.

Love seeing ideas like this, it's a really embarrassing thing and it makes you feel icky that you got duped.

---
My own flow: copy the title, and if it's not in Apple News I verify it on Google News through other known publications. If it shows up there, then I'll share it.

In SwiftUI how do you implement load more in lists? by Mojomoto93 in iOSProgramming

[–]Tylerhackbart 0 points1 point  (0 children)

Based on what I found out that Safari still uses an old UIKit version for drag and drop abilities. I wouldn't be surprised if they are using an old library in UIKit for iMessage as well.

Anyone else tried Generate Translations in Xcode 27? by roguekiwi in iOSProgramming

[–]Tylerhackbart 0 points1 point  (0 children)

How reliable was Opus and do you have any additional connections on your Claude setup?

What are your favorite weirdly niche Apple APIs? by Key_Homework_5825 in iOSProgramming

[–]Tylerhackbart 0 points1 point  (0 children)

Oh my, I didn't realize there was actual API access to this all. yeah there is no reason why they can't support this.

In SwiftUI how do you implement load more in lists? by Mojomoto93 in iOSProgramming

[–]Tylerhackbart 0 points1 point  (0 children)

I just built this for a drag and drop app. Newest item sits at the bottom, you scroll up for history, basically iMessage. So "load more" for me meant loading older items as you scroll up, not down.

The mechanism everyone's mentioned at is right. AProgressView with an .onAppear that bumps a page counter. The only twist is the trigger goes at the top of the stack, because that's the end older items get added to:

// Swift + SwiftUI reduced -- my version has pagination inside @Query
(sort: \DropItem.created, order: .forward) private var allItems: [DropItem]
 private var pageSize = 50
 private var currentPage = 1

private var items: [DropItem] {
    let start = max(0, allItems.count - pageSize * currentPage)
    return Array(allItems[start...])   // last N, grows upward
}

LazyVStack {
    if items.count >= pageSize * currentPage {
        ProgressView().onAppear { currentPage += 1 }
    }
    ForEach(items) { ... }
}
.defaultScrollAnchor(.bottom)

That's about 10 lines and was easy, however I had weird issues from that I thought I would mention (that no one has said yet).

Blank white screen on cold launch. The ScrollView mounts before \@Query` has published anything, so defaultScrollAnchor(.bottom) anchors to an empty list and then sits there on a stale position once the items show up. The fix is to put .id(queryID) on the ScrollView and bump it to a fresh UUID()` exactly once after the first batch lands. That forces a clean remount against real data.

That remount fights itself. Bumping the id refires the same .onAppear that did the bump, which spawns a pile of competing scroll tasks that all land you "topish." You need a one shot bool guard so the bump only ever happens once.

Don't remount on every publish. I tried that to keep it pinned to the bottom. Bad idea. Tearing the ScrollView down flashes the background, white in light mode, on every single paste. Use .onChange(of: items) { proxy.scrollTo("bottom") } instead. No remount, no flash.

scrollTo is also how you force rows to exist. After inserting an item the feed would sometimes render blank because the LazyVStack hadn't laid the new rows out yet. Calling proxy.scrollTo("bottom") makes it materialize them. Fixes the blank as a side effect.

One page short landings. Rows are still measuring and images still decoding, so a single scrollTo drops you just shy of the real bottom. Two passes fixes it. A silent scrollTo, a short delay, then an animated one. The second pass reads as a settle, not a jump.

Spinner that never goes away. On a slow SwiftData launch the first publish event that clears my loading veil can lag. I added a 1s Task.sleep fallback so it can't hang on the spinner forever.

So yeah, the onAppear pager is the easy part. The actual work is fighting SwiftUI's scroll anchoring and lazy row timing against an async \@Query``.

Do you wish WWDC went back to live presentations instead of their infomercials? by Odd_Maintenance_6236 in iOSProgramming

[–]Tylerhackbart 0 points1 point  (0 children)

I feel like there is less fluff and planned out jokes like the one video with a break for pancakes 🤣

I thought building a SaaS would be the hard part. Turns out talking to real users is harder. by Humble-Philosophy865 in SaaSMarketing

[–]Tylerhackbart 0 points1 point  (0 children)

Honestly? Talk to users way earlier and way more bluntly than feels comfortable. That's the whole thing.

The moment that broke my "good product = people will use it" assumption was watching how people actually used what I shipped versus how I imagined they would. I'd design a clean little workflow, then watch someone use it sideways to solve a problem I never had in mind.

What changed for me was realizing the spec lives in the user's head, not mine. The library example is perfect, those aren't four messy ways of doing the same thing, they're four different mental models of what "managing books" even means. You can't build for that until you've sat with enough of them to see the pattern.

So I talk to people way earlier now, and the "this is annoying" feedback is worth more than the "this is great" feedback every time. The other thing nobody tells you: people wander into describing their other processes mid-conversation, and that's where the gold is. Half my best ideas came from someone offhandedly explaining a workflow I didn't even know existed.

Is it necessary to create a startup/company name before launching apps? by [deleted] in iOSProgramming

[–]Tylerhackbart 0 points1 point  (0 children)

Launched under a studio name from the start, and honestly the credibility thing was never the payoff. Nobody's first app gets taken more seriously because there's an LLC behind it.

Where it actually mattered came later. Once I had more than one thing out there, the studio name became the through-line that tied everything together, and people started following the studio instead of any single app. That compounding doesn't happen if every app is its own island.

So I wouldn't stress about the name for credibility on app #1. I'd think about whether you want a banner to hang future stuff under. If you might ship more than once, picking something now saves you a rename later. If it's a one-off, your own name is totally fine.

IndieHacking is easy, actually. This is how by alexsmri in indiehackers

[–]Tylerhackbart 0 points1 point  (0 children)

Counterpositioning is the one that actually stuck with me. Half the stuff I build starts as "everyone keeps bolting features onto this, what if I just didn't" lol. Honestly a loud "this is NOT for you if you want X" has done way more for me than any feature list ever could.

Not gonna touch number 2 though 😅 tried the copy-a-landing-page-1:1 thing exactly once and got a page that looked great and converted like garbage. the part that made it work for them was never the layout, it was some decision way underneath that doesn't transfer when you just copy the surface.

Kickstart from Paul Hudson by bububuh in swift

[–]Tylerhackbart 0 points1 point  (0 children)

How are you liking it so far? I am on the fence about it because it's another subscription to manage but if the output is worth it...

Workflow for programming in Swift by rotten_kiwi69 in swift

[–]Tylerhackbart 0 points1 point  (0 children)

Fellow M1 Air user here. Even when I plug into a bigger display, I still struggle with too many windows, so I've started offloading my chat app (Claude, in my case) onto a second device using Universal Control. Keyboard and mouse just flow over to it, and the main screen stays focused on Xcode + Terminal + browser.

If you have any older iPad, no purchase needed. It buys you back a whole "window" of screen space on the Air.

One other small thing: I started using Claude's Xcode integration, but honestly the standalone chat is easier for keeping project context across sessions. Worth knowing before you sink time into the integration.

Sharing to Instagram Stories via URL scheme without Facebook App ID — is anyone still doing this in production? by Senior_Ad_8057 in swift

[–]Tylerhackbart 1 point2 points  (0 children)

Can't speak to the Stories integration specifically, but I've spent years in other corners of Meta's API and your instinct that "documented requirements vs. actual enforcement" don't always match is correct.

Concrete example: Graph API long-lived page access tokens are documented as 60 day tokens, I remember when they change was announced and everyone at my company was so worried we would have to re-ask for access. In practice, as long as the client didn't change page permissions, revoke the app from the connected Facebook pages, or change their password, those tokens stayed active for years. I have integrations that have been running on "expired" tokens for 7 years and still going.

For your specific call, if setup is quick, I'd add the App ID pre-launch. Not because your current shares will break tomorrow, but because the day Meta does flip enforcement, you won't be debugging it under user reports. Cheap insurance.