Post

Replies

Boosts

Views

Activity

Reply to Errors running with ASAN when targeting iOS Devices
Still happening in 2024: iPhone Xr iOS 17.4.1 Xcode 15.2 ==1907==Unable to find a memory range for dynamic shadow. ==1907==space_size = 0x00006b003fff, largest_gap_found = 0x000066a00000, max_occupied_addr = 0x007000000000, new_max_vm = 0x000335000000 AddressSanitizer: CHECK failed: sanitizer_mac.cpp:1279 "((0 && "cannot place shadow")) != (0)" (0x0, 0x0) (tid=589858) <empty stack> AddressSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report. (lldb) thread info -s thread #1: tid = 0x90022, 0x0000000104ee91dc libclang_rt.asan_ios_dynamic.dylib`__asan::AsanDie()
May ’24
Reply to What's wrong in my PrivacyInfo file in iOS App? I still recieve a mail with TMS-91053: Missing API declaration when upload an upadte
It could be that your privacy manifest is in the wrong place. It must be in the root folder of your app bundle. You can check to see whether Xcode is finding the manifest by generating your own privacy report. I originally had mine nested one folder down, and the generated report was empty. When I moved it to the root, the report had the privacy data.
Apr ’24
Reply to Pitfalls of manual dependency management in Xcode?
I wrote a simple post-checkout git hook to capture the currently checked out tag: #!/bin/sh # Get the repository name repo_name=$(basename `git rev-parse --show-toplevel`) # Get the current tag current_tag=$(git describe --tags --exact-match 2> /dev/null) # If there is a current tag if [ $? -eq 0 ]; then echo "$repo_name: $current_tag" >> ../PackageDependencies.history else echo "WARNING: Ignoring post-checkout hook, no tag found" fi
Feb ’24
Reply to Pitfalls of manual dependency management in Xcode?
After more experimentation (including a stab at using Carthage), I hit upon a wonderful solution to this problem. My steps for adding dependencies are now: Clone the repo into local package_dependencies folder Check out the specific release (tag) Under Xcode's Package Dependencies tab, hit the + sign and select "Add local". Select the folder containing the repo In the confirmation dialog, select the appropriate target This works great, fetching and verifying takes only a few seconds (and doesn't re-verify every single package every time!), and I have yet to encounter flaky errors. (Fingers crossed!) The only downside is that Package.resolved doesn't record specific versions anymore. That's unfortunate but the benefits completely outweigh the loss.
Feb ’24
Reply to Compiler thinks non-async property is async?
I had a breakthrough after reading @Scott's comment. It sure was behaving as if the compiler thought it was an actor. As a test, I removed the private restriction on the singleton's initializer and tried to initialize it. I got a very revealing error: func testAsync() async -> String { let app = App() // ERROR: Calls to initializer 'init()' from outside of its actor context are implicitly asynchronous ... async stuff here ... return result } Well, it turns out that App is a UISplitViewControllerDelegate and that protocol is a @MainActor! If I remove the protocol from its definition the errors go away. Is this correct behavior? I tried, but haven't been able to re-create the issue in a simple test case. In any case, thanks @eskimo and @Scott for helping me clear this up!
May ’22
Reply to Unusual configuration problem for subscriptions
I had an exchange with an Apple StoreKit evangelist, and he confirmed that the best approach is a generic "single course" subscription. Here's what he had to say: We refer to this as a generic sku configuration. creating a sku per course after a dozen+ is just a mess to manage, so generic is the way to go now and with your future plans. So with the generic “single course” sub, you’ll manage this single “slot” to fill it with 1 course at time. Up to your business policy on how you manage swapping new courses in/out. Ie: 1 swap per week/month, etc. The course to sub assignment is 100% with the developer, so this “course swap/manage” experience and policy will be managed by your app and off platform if applicable. The mapping of the customers purchase is using the original transaction ID to the assigned course. And change that mapping per their business policy. If product ID changes to unlimited then the course mapping won’t apply. Tougher part is when downgrading from unlimited to single, what is that experience. Automatically choose whatever they access next or does it prompt the customer?
May ’22