Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Graniteman
Nov 16, 2002

haveblue posted:

It's 90% likely you're doing something hosed up, the Xcode test harness generally does not eat itself for no reason. Have you tried catching the exact moment of corruption with a watchpoint?

I didn't know watchpoints were a thing. I'll definitely try that the next time it happens. The thing that confuses me is that even if I clean the build folder and rebuild, it will still error in the same spot. But if I restart Xcode it will rebuild and run just fine. I'm not an expert developer at all, so I definitely don't know what I don't know about what could go wrong, but that doesn't seem possible to me.

Also, it's never the same problem twice. It's not like it's the same variable getting overwritten. Still, a watchpoint is a great idea, since once it starts happening it's reproducibly in the same spot.

Plorkyeran posted:

Do you have SIP disabled and/or are you downloading Xcode from a sketchy third-party?

SIP is enabled / default. I used the App Store to download Xcode, then had some second thoughts and tried to delete it and all library folders, and then downloaded from apple (linked from https://xcodereleases.com)

Adbot
ADBOT LOVES YOU

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Graniteman posted:

I didn't know watchpoints were a thing. I'll definitely try that the next time it happens. The thing that confuses me is that even if I clean the build folder and rebuild, it will still error in the same spot. But if I restart Xcode it will rebuild and run just fine. I'm not an expert developer at all, so I definitely don't know what I don't know about what could go wrong, but that doesn't seem possible to me.

Also, it's never the same problem twice. It's not like it's the same variable getting overwritten. Still, a watchpoint is a great idea, since once it starts happening it's reproducibly in the same spot.

Try running the test with the various sanitizers enabled. If you edit your scheme and look for the Diagnostics tab (I think), there should be some checkboxes for "address sanitizer", "thread sanitizer", "undefined behavior sanitizer". Just check 'em off and re-run your test.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed
Well I guess build tool plugins being seemingly abandoned is a complaint I can scratch off the list.

KidDynamite
Feb 11, 2005

Plorkyeran posted:

Well I guess build tool plugins being seemingly abandoned is a complaint I can scratch off the list.

What makes you say that?

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

KidDynamite posted:

What makes you say that?

They started shipping in Xcode 13.3 beta 1 I think.

Pulcinella
Feb 15, 2019
Is there an easy way to determine the the origin of a CALayer is top left (e.g. UIKit) or bottom left (e.g. AppKit)? I’m doing some custom CAShapeLayers and custom corner clipping and I just realized that For a CACornerMask, .minXMinY is top left on iOS and bottom left on macOS (unless it’s a catalyst app). I’d like to avoid compiler statements and not have to:
code:
#if canImport(AppKit) && !targetEnvironment(macCatalyst)
static let topLeft = .minXMaxY
#else
static let topLeft = .minXMinY
#endif
I know you can also flip the geometry of a CALayer and that would probably be easier because that way I could just have the iOS drawing routine and just flip the origin for macOS, but again I don’t know if there is a way of doing that other than #if AppKit layer.isGeometryFlipped = true.

Edit: Actually UIKit and CA are both upper left origins, but CG and AppKit is lower left. So if I create a CGpath and apply that to a shape layer then where is the origin?

Pulcinella fucked around with this message at 04:53 on Feb 7, 2022

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Pulcinella posted:

Is there an easy way to determine the the origin of a CALayer is top left (e.g. UIKit) or bottom left (e.g. AppKit)? I’m doing some custom CAShapeLayers and custom corner clipping and I just realized that For a CACornerMask, .minXMinY is top left on iOS and bottom left on macOS (unless it’s a catalyst app). I’d like to avoid compiler statements and not have to:
code:
#if canImport(AppKit) && !targetEnvironment(macCatalyst)
static let topLeft = .minXMaxY
#else
static let topLeft = .minXMinY
#endif
I know you can also flip the geometry of a CALayer and that would probably be easier because that way I could just have the iOS drawing routine and just flip the origin for macOS, but again I don’t know if there is a way of doing that other than #if AppKit layer.isGeometryFlipped = true.

Aside from flipping the layer on Mac (which is probably what I'd do (and I don't know a better way than setting that property, you could maybe define your own factory method on each layer type and set the property as appropriate?)), you could move the #if into an extension property on CACornerMask. e.g.
Swift code:
extension CACornerMask {
  static var topLeft: CACornerMask {
    #if canImport(AppKit) && !targetEnvironment(macCatalyst)
      return .minXMaxY
    #else
      return .minXMinY
    #endif
  }
}

KidDynamite
Feb 11, 2005

managed to secure another on-site with apple. I’m studying the concurrency stuff, but system design is impossible to find resources on. Help me secure the bag goons.

KidDynamite
Feb 11, 2005

https://twitter.com/johnsundell/status/1492896330003492865

i'm loving slackin.

Fate Accomplice
Nov 30, 2006




KidDynamite posted:

managed to secure another on-site with apple. I’m studying the concurrency stuff, but system design is impossible to find resources on. Help me secure the bag goons.

can you share the concurrency resources you're using?

Radia
Jul 14, 2021

And someday, together.. We'll shine.
My experience with SwiftUI was completely dreadful, but also I suppose a year old, so maybe they've significantly improved it

Pulcinella
Feb 15, 2019

Lady Radia posted:

My experience with SwiftUI was completely dreadful, but also I suppose a year old, so maybe they've significantly improved it

From listening to the Stacktrace podcast where John Sundell talks about his SwiftUI work, a lot of the time he is using UIKit and UIViewRepresentable to get good performance out of SwiftUI. In my own experience, while it has gotten better, SwiftUI has still has terrible performance for anything even remotely complicated. Also weird performance issues like how dragging scroll causes stuttering but then programmatic scrolling or scrolling with the crown in the watch will be completely smooth. Also it at least used to be possible to desync your app’s model and navigation state from the view’s state. Then you were just completely screwed.

I don’t think mixing SwiftUI and UIKit is some kind of failure or dilutes the purity of the app or anything. I’ve just found the time and complexity cost of mixing them to be more than just doing it in UIKit.

KidDynamite
Feb 11, 2005

Fate Accomplice posted:

can you share the concurrency resources you're using?

It's this(which is obv old but the concepts still apply) and the official docs unfortunately. I think I asked you for resources last time haha.

Also just reading the async docs and thinking about how the issues async solves were dealt with when it wasn't available. Stuff about writing daemons does not seem available at all.

former glory
Jul 11, 2011


I'm dipping my toe in SwiftUI for the first time right now and it's definitely taking some effort. Glad to see an example of what it does at the limit. It seems like a massive departure from other GUI frameworks I've worked with and then all the functional aspects and basically throwing OOP out the window add up to a very different way of coding (for an old Java/C# OOP guy). I'm going to see it through because I like the push and it's pretty fun so far.

One thing, though: it does seem to throw a lot of the nice principles of Clean Code out the window. It feels like I'm sometimes regressing back to Perl in how it encourages a two-liner with closures, implied variable names, and tons of omitted syntax for brevity. Sometimes I'll look at some lines and wonder if it'll be completely incomprehensible 6 months from now.

Graniteman
Nov 16, 2002

former glory posted:

One thing, though: it does seem to throw a lot of the nice principles of Clean Code out the window.

I’m a coding hobbyist, and working on building my first iOS app, and using SwiftUI for it. The thing I’m frustrated by is that the language feels like it wants you to use protocol driven solutions for creating clean code. However, I feel like protocols just aren’t up to the job the way superclasses and inheritance are. I did a ton of work going down a path of using protocols to get my dependency inversion, only to discover that you can’t use existential types in the same ways that you can use classes.

There’s an accepted swift evolution to try to at least emphasize the risk of using existentials
https://github.com/apple/swift-evolution/blob/main/proposals/0335-existential-any.md
And another accepted proposal to reduce some of those limitations
https://github.com/apple/swift-evolution/blob/main/proposals/0309-unlock-existential-types-for-all-protocols.md

But I’m not a good enough programmer to see how to work around the constraints of protocols to still implement the Clean Code goals I have in my mind. I keep thinking about it as I work, and not seeing a path forward. If I were using classes I feel like I have enough of a personal experience to find solutions, but with structure and protocols I’m just not seeing it.

take boat
Jul 8, 2006
boat: TAKEN

Graniteman posted:

I’m a coding hobbyist, and working on building my first iOS app, and using SwiftUI for it. The thing I’m frustrated by is that the language feels like it wants you to use protocol driven solutions for creating clean code. However, I feel like protocols just aren’t up to the job the way superclasses and inheritance are. I did a ton of work going down a path of using protocols to get my dependency inversion, only to discover that you can’t use existential types in the same ways that you can use classes.
do you have a sample protocol or use-case you could post? I'm curious what problems you're running into, are you using a lot of protocols with associated types, or designing a deep protocol hierarchy?

you can often solve protocol+associated type issues by making your own type-erasing Any wrappers, which is annoying but straightforward. if I follow the second proposal you linked, looks like this won't be as necessary in the future

rjmccall
Sep 7, 2007

no worries friend
Fun Shoe
Programmers who are used to working within traditional OO systems with complex object graphs often over-use mocking as their primary testing strategy. In a library-oriented design, where you’re thinking about how your program breaks down into independent components with abstract interfaces between them, you should be able to do complete unit-testing of your “leaf” components. If so, you can build the system from the bottom up, and the testing follows: once you’ve established through testing that a component works, you can simply use that component as a trusted dependency of other components instead of mocking it out. You then can do reasonably complete unit-testing of that level of component, and so on. It means you’re not testing every bit of code in complete isolation, but that’s less valuable than you might think.

rjmccall fucked around with this message at 22:04 on Feb 16, 2022

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed
Testing every bit of code in complete isolation is IMO typically anti-valuable. Sometimes you need mocks because testing against the real thing is impractical, but using them just for the sake of isolated testing and not for a functional requirement is going out of your way to reduce the chance of your tests exposing bugs.

Graniteman
Nov 16, 2002

take boat posted:

do you have a sample protocol or use-case you could post?

Two main problems for me were persistence and not knowing about type erased wrappers.

I’m setting up a simulation where the initial conditions were captured in a struct that has dependencies that get composed at runtime based on user decisions.

struct InitialConditions: Codable {
var firstConfig: Protocol1
var secondConfig: Protocol2
var strategyPerformer: Protocol3
etc
}

At run time the user selects an option for each config from the available options (e.g. firstConfig is set to one of the Protocol1 conformant concrete types, and then the concrete type is configured with it’s own concrete-type-specific UI). The final set of chosen and configured options are composed into an InitialConditions that are passed to a simulator.

I was attempting to use Codable to persist InitialConditions, but found out that you just can’t do it. Codable won’t load firstConfig above from a JSON because it can’t tell which concrete type it should instantiate.

And yeah, I was hitting a bunch of issues with self associated types. I have since learned the type-erased wrapper approach, but at the time I was making my own concrete-typed wrappers to solve it with an enum to determine which concrete type was being stored, and optional vars to store each specific concrete type. Since it’s all concrete types, it’s Codable conformant. I didn’t like it, but I couldn’t (and still can’t) see another way to use composition and strategy pattern that wouldn’t throw a fit about self-associated types and that would be all concrete types so that Codable would let me save/load.

Then I started thinking about schema changes after launching the app, and all of my goofy concrete-typed wrappers that would each need their own schema migrations and I said gently caress it and decided to switch everything over to Core Data. So I spent a couple weeks (free time coding guy here) learning about Core Data and migrating to it for persistence.

Maybe there was a better way to get Codable to work, but I still don’t know what it is. In my app, the concrete config instances are meaningless outside of the context of an InitialConditions, so if I did create stores+persistence for each, I’d also have to make sure when an InitialConditions was deleted, I’d delete all associated configs from their stores. Core Data does all that for you, at the cost complexity in other places. The object graph features of Core Data are coming in handy and letting me do some nice stuff I hadn’t originally planned on, but it’s definitely got it’s own problems with writing code that Uncle Bob wouldn’t throw in the trash.

Also, I’m still doing a Core Data version of concrete-typed wrappers.
InitialConditions {
strategyPerformer: StrategyHavers
}
In the Core Data data model, StrategyHavers is my wrapper Entity containing
selectedStrategyType: Int16 (with an enum partner)
One-to-one relationships to Entities that define my old concrete types. E.g.
And a non-CD computed var that returns the right strategy entity for the selectedStrategyType.

So finally at run time in the simulation I can get
var strategyPerformer: StrategyHavers
strategyPerform.currentPerformer returns a configured entity conforming to StrategyHavers.

I don’t have any idea if this is reasonable, but it’s working!

Glimm
Jul 27, 2005

Time is only gonna pass you by

Does C23 adding '@' to its source character set have any impact on Objective-C in the future? Is it mainly a compatibility thing - ie, someone could name a function `@` which ObjC would have difficulty working with?

https://twitter.com/__phantomderp/status/1494801823949103107

take boat
Jul 8, 2006
boat: TAKEN

Graniteman posted:

Two main problems for me were persistence and not knowing about type erased wrappers.

I’m setting up a simulation where the initial conditions were captured in a struct that has dependencies that get composed at runtime based on user decisions.

struct InitialConditions: Codable {
var firstConfig: Protocol1
var secondConfig: Protocol2
var strategyPerformer: Protocol3
etc
}

At run time the user selects an option for each config from the available options (e.g. firstConfig is set to one of the Protocol1 conformant concrete types, and then the concrete type is configured with it’s own concrete-type-specific UI). The final set of chosen and configured options are composed into an InitialConditions that are passed to a simulator.

I was attempting to use Codable to persist InitialConditions, but found out that you just can’t do it. Codable won’t load firstConfig above from a JSON because it can’t tell which concrete type it should instantiate.

And yeah, I was hitting a bunch of issues with self associated types. I have since learned the type-erased wrapper approach, but at the time I was making my own concrete-typed wrappers to solve it with an enum to determine which concrete type was being stored, and optional vars to store each specific concrete type. Since it’s all concrete types, it’s Codable conformant. I didn’t like it, but I couldn’t (and still can’t) see another way to use composition and strategy pattern that wouldn’t throw a fit about self-associated types and that would be all concrete types so that Codable would let me save/load.

fwiw one idea for doing this with Codable (nothing wrong with Core Data but it's more complicated):

Swift code:
enum FirstConfig: Codable {
    case optionA
    // simple configs can be modeled directly
    case optionB(value1: String, value2: Int)
    // or complex configs can have their own payload struct
    case optionC(CPayload)
}

extension FirstConfig: FirstProtocol {
    func protocolMethod() {
        switch self { ... }
    }
}
probably more concrete than you had in mind, but it's simple and easy to work with

Graniteman
Nov 16, 2002

take boat posted:

Swift code:
extension FirstConfig: FirstProtocol {
    func protocolMethod() {
        switch self { ... }
    }
}

Thanks for this idea. I did look at using enum with associated values to store the selection, but it was going to be clunky to have to always access the values using if let or switch statements. Your approach seems like it would have worked. I’m not used to thinking about enums being as sophisticated as they are in Swift so it just didn’t occur to me to have the actual model logic in enum functions. I didn’t occur to me to have the enum itself conform to the protocols. It actually never occurred to me that enums even could conform to protocols.

What I’m doing is a core data version of the below

Swift code:
Struct FirstType1: FirstProtocol {
…
}

Struct selectedFirstConfig {
Enum configTypes {
Case type1
…
}

Var selectedConfig: configTypes
Var type1: FirstType1?
Var type2: FirstType2?

Func selectedConfig() -> FirstProtocol {
Switch selectedConfig {
Case type1: return self.type1
Case type2: return self.type2
}

Graniteman fucked around with this message at 23:44 on Feb 19, 2022

rjmccall
Sep 7, 2007

no worries friend
Fun Shoe

Glimm posted:

Does C23 adding '@' to its source character set have any impact on Objective-C in the future? Is it mainly a compatibility thing - ie, someone could name a function `@` which ObjC would have difficulty working with?

Since @, $, and ` weren’t used in the language anywhere, and since C makes an effort to be generic about what characters are available in the basic character set (mostly to allow EBCDIC), it was technically unportable to use those characters in a source file, even in comments or string literals. That has been changed, and conforming source character sets are required to support those characters. However, they’re still not legal in identifiers, so there’s danger of ambiguity with Objective-C. (Technically, they’re not required to be legal in identifiers; implementations have a high degree of flexibility to extend the set of identifiers. But implementations aren’t expected to change anything here.)

Glimm
Jul 27, 2005

Time is only gonna pass you by

Ah okay, thanks!

eschaton
Mar 7, 2007

Don't you just hate when you wind up in a store with people who are in a socioeconomic class that is pretty obviously about two levels lower than your own?
Yeah, $ in identifiers for namespacing is really familiar to any VMS developer, which has meant pretty much every other compiler has had to add support.

rjmccall
Sep 7, 2007

no worries friend
Fun Shoe
Yeah, it’s a common extension. The others I’ve never seen in identifiers.

holefoods
Jan 10, 2022

I've been going through this book lately and the second game adds a virtual controller that you build with code. I remember last year everyone was making a big deal about Apple adding its own virtual controller to the Game Controller framework last year. I managed to get it into a project to try it out and wow, it's embarrassingly half assed. It only supports a d-pad or a left stick, a right thumbstick, two shoulder buttons and four face buttons. The shoulder buttons get mapped to the left and right of the d-pad or left stick and you can't add a menu button. Compared to how much code goes into adding Apple's virtual controller vs. how simple and fast it was to build the example d-pad from the book I'm following, it's a shockingly crappy result.

Small White Dragon
Nov 23, 2007

No relation.
Oh man, I heard Russia has been banned from Swift.



In all seriousness, are Russian developers/purchasers cut off from the App Store now?

ultramiraculous
Nov 12, 2003

"No..."
Grimey Drawer

Pulcinella posted:

Is there an easy way to determine the the origin of a CALayer is top left (e.g. UIKit) or bottom left (e.g. AppKit)? I’m doing some custom CAShapeLayers and custom corner clipping and I just realized that For a CACornerMask, .minXMinY is top left on iOS and bottom left on macOS (unless it’s a catalyst app). I’d like to avoid compiler statements and not have to:
code:
#if canImport(AppKit) && !targetEnvironment(macCatalyst)
static let topLeft = .minXMaxY
#else
static let topLeft = .minXMinY
#endif
I know you can also flip the geometry of a CALayer and that would probably be easier because that way I could just have the iOS drawing routine and just flip the origin for macOS, but again I don’t know if there is a way of doing that other than #if AppKit layer.isGeometryFlipped = true.

Edit: Actually UIKit and CA are both upper left origins, but CG and AppKit is lower left. So if I create a CGpath and apply that to a shape layer then where is the origin?

Late to this, but FYI there's a property on NSView called isFlipped that you can override in a subclass that puts an AppKit view into the iOS-style coordinate system.

BONGHITZ
Jan 1, 1970

Hello, I am new to tvOS and the focus engine. This is my burp and fart project:

https://i.imgur.com/8pXazgE.mp4

What is the best way to get to the first cell each time I go down, if its the first time its been visited? These rows are collection views.

Thank you.

luchadornado
Oct 7, 2004

A boombox is not a toy!

Posting here since I couldn't figure a better place: I want to make a TUI (probably prototyping with Python's Rich library or similar). Making an iOS app is out of the question for the short time frame I've given myself.

Is there a proper terminal app for ipad yet (guessing no) or am I looking at an SSH client? What are the best options for either?

Graniteman
Nov 16, 2002

I'm getting close to launching my first app, and I'm realizing I may not want to use iCloud / CloudKit for cross-device sync. My understanding is that if I use any iCloud entitlements, I will not be able to sell the app to another company without selling my entire LLC with it. My app is using core data extensively, so cloudkit was the obvious choice for device sync. And it's iOS-only, for what that's worth.

What other mechanism should I look at for cross device sync? I don't want users to have to create any accounts to use the app, and I want something that is privacy-oriented.

take boat
Jul 8, 2006
boat: TAKEN
you can transfer an app on the app store to another organization, though I haven't done it personally

given that you don't want users to create accounts and that you're iOS-only , I suspect CloudKit will save you a bunch of work vs trying to achieve that yourself

Graniteman
Nov 16, 2002

take boat posted:

you can transfer an app on the app store to another organization, though I haven't done it personally

Unfortunately you can’t transfer an app to another developer if the app has, or has ever had, an iCloud entitlement. See this thread:

https://developer.apple.com/forums/thread/81028

Since this is going to be a problem for anybody looking to have a sale as an exit option for their app, I’m just wondering if folks can offer any thoughts for their short list of other solutions.

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

luchadornado posted:

Posting here since I couldn't figure a better place: I want to make a TUI (probably prototyping with Python's Rich library or similar). Making an iOS app is out of the question for the short time frame I've given myself.

Is there a proper terminal app for ipad yet (guessing no) or am I looking at an SSH client? What are the best options for either?

Pythonista is a Python environment that's been around forever and still seems updated. Blink, maybe, for ssh? I don’t have enough experience with either to give a proper recommendation.

take boat
Jul 8, 2006
boat: TAKEN

Graniteman posted:

Unfortunately you can’t transfer an app to another developer if the app has, or has ever had, an iCloud entitlement. See this thread:

https://developer.apple.com/forums/thread/81028

Since this is going to be a problem for anybody looking to have a sale as an exit option for their app, I’m just wondering if folks can offer any thoughts for their short list of other solutions.

oops sorry. well that's frustrating

there's always creating a one-off developer account for the app, which isn't a totally bad idea anyway if you're considering selling it down the road

Graniteman
Nov 16, 2002

take boat posted:

oops sorry. well that's frustrating

there's always creating a one-off developer account for the app, which isn't a totally bad idea anyway if you're considering selling it down the road

I had assumed that I could do the same thing, and was going down that path of creating a separate account. However, I've learned that because I've got an LLC, not an individual account, that is not an option. My understanding is that a business account is tied to your DUNS Number for your account, and in order to sell a business account, you must sell the entire business. Which is not an option since my wife and I do non-software-related consulting under the LLC. So people are saying the only feasible way to do it is to have one LLC for each iCloud-enabled app that you might someday sell. Which is obviously ridiculous.

I can't find it again right now but there's a blog post from some semi-popular indie dev about how when he went to sell his app (icloud enabled) he discovered all this, and ended up selling the entire business to the acquiring company for this reason. I'm new to iOS development, and don't know how common knowledge this iCloud poison pill stuff is.

Anyway, it's not totally essential for my business model that I have cross-device sync, but it's nice to have. Ideally I'd like something that can authenticate with an apple ID or sign-in-with-apple. I might fall back on something like letting them AirDrop data between devices, which would also let them share with family members (desirable for my app). There may just not be an account-creation-free way to do cross device sync base on an appleID. I don't know how it would work...

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed
I have heard of people structuring weird-rear end deals where you sell the entire LLC and then buy back the parts you wanted to keep, but that's a nightmare and doesn't help you if you have multiple icloud apps.

duck monster
Dec 15, 2004

Oh Apple. For such a gigantic company, they can be bizarely oblivious sometimes.

Reminder (A few of the old timers here will remember this story): Back when Steve Jobs was still alive, at the start of the iphone dev era I had a problem with the app store taking over a month to review and the client had started legal proceedings on me over it. I wrote an angry email to Steve jobs personally (His email wasnt hard to find and he had a reputation for personally reading all his email) and it turns out he fucken read the thing and I got a 2am (Im in australia)phonecall from his personal assistant who told me Jobs was furious about the delay and had tasked him with getting that thing through review. It was approved within hours. Jobs was a nut, but his customer focus was undeniable.

How the mighty have fallen. This iCloud stuff is nuts. I just cant imagine Jobs sitting there with hundreds of frusturated commercial developers raising hell and him being OK with that. This whole thing isnt because of a technical difficulty, its because Apple just doesnt have a procedure for it. Imagine someone in the iOS team telling Jobs that and not getting a chair thrown at their head lol

duck monster fucked around with this message at 03:17 on Mar 24, 2022

Adbot
ADBOT LOVES YOU

Radia
Jul 14, 2021

And someday, together.. We'll shine.
i dunno about all that, that's a nice story but steve jobs is also famous for "your holding it wrong", "your jeans are too tight", so

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply