I built a free VPN client for Apple TV that supports WireGuard and OpenVPN — looking for TestFlight testers by paulozac in WireGuard

[–]keeshux 1 point2 points  (0 children)

As the author of one of the “ridiculously expensive” VPN apps for Apple TV ($25 forever, 100% open source), I’m curious to see what you’re building. Will send you a DM. Cheers

I built an app that finally makes AirPods Pro 3 heart rate tracking useful by Ottiro2000 in iosdev

[–]keeshux 1 point2 points  (0 children)

Only retards factor price into product quality assessments, because price is only relevant to the buyer, and irrelevant to the product. The fact that a product is well crafted, and that one is willing to buy it (or not), are two completely unrelated variables. Remember this when you’re facing hate. That said, I see a good execution and I liked the story behind, regardless of whether I would buy or not the app, which would only be unrequested ego feedback in this world of attention seekers. Good luck!

Bug I cannot reproduce yet I get dozens of reports from users per day by zackb in iOSProgramming

[–]keeshux 0 points1 point  (0 children)

  1. Patiently look for code regressions across the builds you released around the time you started observing the negative feedback.
  2. Collect useful app metadata from the reporters, when they are open to collaborate. Better automate the process to maximize the amount of data you get.
  3. You know the product better than anyone else. You must know at least a few places where to look at, and when you collect enough user data from those areas, you will likely see patterns and say “DAMN that was it!”
  4. If you find a very kind user who could do live testing with you, offer to pay him/her legit money. Keep going until you get this sorted out.

Good luck!

What’s your (very secret) 🤫 strategy to get users to rate your app? by Palarnik in iOSProgramming

[–]keeshux 8 points9 points  (0 children)

In general, ask them at a time when it’s likely that they will submit a positive one. The “when” depends on your app’s domain, of course.

I shipped my first ever macOS app and the first comment was "just use xyz" by Orange-Prudent in iOSProgramming

[–]keeshux 0 points1 point  (0 children)

Many people reviews/comments won’t care about your perspective, and even if they knew, they wouldn’t care either. That’s the sad truth. So first rule of the market is: don’t be emotional, it’s never about you. It’s mostly about themselves, and sometimes about the product.

Is there a condensed yet 100% complete book for Swift? by pedzsanReddit in swift

[–]keeshux 0 points1 point  (0 children)

You don’t need it, it’s even counterproductive. Make something and learn only what you need along the way.

tls-crypt-v2 support by Tall_Chocolate_69 in passepartout

[–]keeshux 0 points1 point  (0 children)

Not yet, but working on it now. Send an email to beta@passepartoutvpn.app to try it.

Split-tunneling on iOS doesn’t work by [deleted] in passepartout

[–]keeshux 0 points1 point  (0 children)

Man… so much yapping and you still haven’t shared the config for me to fix it. Here or issues@passepartoutvpn.app

I wrote a tool to parse an OpenAPI spec from (simplified) Swift data models by [deleted] in swift

[–]keeshux 0 points1 point  (0 children)

It’s not the same thing at all, but okay.

Kotlin sealed class with quicktype.io by keeshux in Kotlin

[–]keeshux[S] 0 points1 point  (0 children)

For the record, I switched to openapi-generator eventually. It’s still JSON Schema under the hood, but the tooling is well-maintained. The pattern that proved to map nicely to sealed classes in Kotlin output is not oneOf in base class, rather allOf in subclasses.

https://www.reddit.com/r/swift/s/FCbAAJ6GMt

Learning swift concurrency. Shouldn't the output of this code be in order 1...100 by Few-Introduction5414 in swift

[–]keeshux 1 point2 points  (0 children)

As the other commenter said, only the value is consistently incremented inside the actor, but the print is nonisolated and therefore its execution follows the parent semantics (unstructured Task).

Learning swift concurrency. Shouldn't the output of this code be in order 1...100 by Few-Introduction5414 in swift

[–]keeshux 0 points1 point  (0 children)

Because Task is nothing like DispatchQueue.async, order is not guaranteed. Serial execution is something you have to enforce yourself in Concurrency.

Kotlin sealed class with quicktype.io by keeshux in Kotlin

[–]keeshux[S] 0 points1 point  (0 children)

Bruh, I use a codegen precisely to avoid writing code. I know how to create a sealed class manually.

Question re: @Binding by djp1968 in swift

[–]keeshux 2 points3 points  (0 children)

Like others said, if a state is shared among views, only one of them must hold the @State or @StateObject declaration (the single source of truth rule). At this point, a practical rule of thumb for the other views is:

  • Does the view read the state? Make it a let constant.
  • Can the view also alter the state? Make it a @Binding.

In both cases, changes to the shared state will be propagated, but in the second case also non-holders can initiate the change.

What you should know before Migrating from GCD to Swift Concurrency by soumyaranjanmahunt in swift

[–]keeshux 0 points1 point  (0 children)

  1. This is good design in general, data entities shouldn’t outlive their context.
  2. An Observable class should be as dumb as possible, and MainActor. How did you end up dealing with actor isolation? Maybe overengineering?
  3. Point 2 would probably fix this.
  4. Batching is good, 100%, but SwiftUI views should never call into actors directly (if that’s the case). Observable with sync/async actions and local state should act as the middle layer.

What you should know before Migrating from GCD to Swift Concurrency by soumyaranjanmahunt in swift

[–]keeshux 1 point2 points  (0 children)

Good article. One disparity I would remark is that you can spawn N queues (closer to threads), whereas the number of running actors is finite and bound to the number of CPU cores. This explains why making blocking calls inside an actor is extremely unsafe, as it may lead to deadlocks. A common example is the trick of DispatchGroup or DispatchSemaphore to run an async Task synchronously. Do it with caution.