Dive into the vast array of tools and services available to developers.

Posts under General subtopic

Post

Replies

Boosts

Views

Created

An Apple Developers Rant.... (So upset...)
Hello Everyone, (and I hope folks at Apple are listening) So around a year ago, I decided to take on the challenge of creating my own Iphone App from scratch. I am an engineer by trade, and thought it would be a fun interesting experience, and maybe make some money on the side. So I bought a macbook, and focused on learning Swift for the next few months. Lots of really great developer folks helped me along the way. And I could not have been successful without so much help. It is very much appreciated. So I finished the app, created my own company. And deployed it to the Istore. Unfortunately, just no interest, I think I sold like 4 copies. No problem, still got to learn a lot along the way. So when it came time to renew my developer licence, I let it expire. Just did not make any sense to drop another $100 into it, since only 4 copies had sold in a year. And then..... this happened!!!! I attempted to use the App that was installed on my own Iphone.... and got the message "My Apps Name" is no longer Available. and it stops... The code is on my phone. I am fully aware that I can no longer use xcode to put anything else on my iphone without a developer licence. But for Apple to reach into my own Iphone, and deny my access to something that I already created, (and in theory already paid for) is just infuriating!!! I checked, and even though it no longer exists in the IStore, purchased copies still seem to function. (one person that bought a copy was a friend of mine). So do I really need to drop another $100, puchase an actual copy of MY OWN APP from the app store, just to have it on my own phone again???!!! So much money and time went into this, that I am considering just smashing every apple product I own, and go with Android instead. I am a single person developer. Almost no one does this sort of thing anymore. Apple used to be the place where innovators could come to try to make something cool and fun to use. I guess not any more. Dan
2
0
320
Feb ’25
Adding XCFramework creates swift support folder missing error.
Hello, In my IOS app, I have been working on implementing a third-party library's xcframework into my app. (They don't provide spm or cocoapods). However, whenever I import the XCFramework into my app, the build is successful, but when uploading to App Store Connect, I receive an email with an error stating the Swift Support folder is missing. This app was made using SwiftUI. I have a sample project linked below. Other apps also use this framework, so I'm not sure where I'm going wrong. Project
1
0
431
Feb ’25
Add static c library to xcode/swift
Hi, I want to build an ios app that uses static c libraries. For reference, i did the following as a test: Compiled a simple c date and time program with clang -c -arch arm64 -sysroot <iPhoneOSSDK_path> date.c -o date_arm64.o Created the static lib ar rcs libdatetime_arm64.a date_arm64.o Added the lib in my Xcode project. Added the (.a) file in Build Rules -> Link Binary With Libraries Included the (.a) and (.h) file path in Build Settings -> Search Paths -> Header and Library Search Path Created a Bridging-Header.h file where I added #import "date.h" In my App.swift file, I called the function for getting the date and time let dateTimeStr = String(cString: get_current_datetime()) print("Current Date and Time: \(dateTimeStr)") After doing all the steps above, I am met with the error - Cannot find 'get_current_datetime' in scope Is there any other method to use static c libraries in xcode?
1
1
327
Mar ’25
Analyzing crash report
Hello, I'm doing an update to my app already IN the app store. The app is built using .Net Maui targeting iOS, Windows and Android. All works fine in debug and in release on Android and Windows. However, the app launches on my iOS devices and crashes immediately. I really have no idea what the crash report on the device is telling me. Attached is the .ips file if anyone can at least point me in the right direction... Thanks MyApp-2025-03-01-202630.ips
2
0
310
Mar ’25
Understanding Mach-O Symbols
This posts collects together a bunch of information about the symbols found in a Mach-O file. It assumes the terminology defined in An Apple Library Primer. If you’re unfamiliar with a term used here, look there for the definition. If you have any questions or comments about this, start a new thread in the Developer Tools & Services > General topic area and tag it with Linker. Share and Enjoy — Quinn “The Eskimo!” @ Developer Technical Support @ Apple let myEmail = "eskimo" + "1" + "@" + "apple.com" Understanding Mach-O Symbols Every Mach-O file has a symbol table. This symbol table has many different uses: During development, it’s written by the compiler. And both read and written by the linker. And various other tools. During execution, it’s read by the dynamic linker. And also by various APIs, most notably dlsym. The symbol table is an array of entries. The format of each entry is very simple, but they have been used and combined in various creative ways to achieve a wide range of goals. For example: In a Mach-O object file, there’s an entry for each symbol exported to the linker. In a Mach-O image, there’s an entry for each symbol exported to the dynamic linker. And an entry for each symbol imported from dynamic libraries. Some entries hold information used by the debugger. See Debug Symbols, below. Examining the Symbol Table There are numerous tools to view and manipulate the symbol table, including nm, dyld_info, symbols, strip, and nmedit. Each of these has its own man page. A good place to start is nm: % nm Products/Debug/TestSymTab U ___stdoutp 0000000100000000 T __mh_execute_header U _fprintf U _getpid 0000000100003f44 T _main 0000000100008000 d _tDefault 0000000100003ecc T _test 0000000100003f04 t _testHelper Note In the examples in this post, TestSymTab is a Mach-O executable that’s formed by linking two Mach-O object files, main.o and TestCore.o. There are three columns here, and the second is the most important. It’s a single letter indicating the type of the entry. For example, T is a code symbol (in Unix parlance, code is in the text segment), D is a data symbol, and so on. An uppercase letter indicates that the symbol is visible to the linker; a lowercase letter indicates that it’s internal. An undefined (U) symbol has two potential meanings: In a Mach-O image, the symbol is typically imported from a specific dynamic library. The dynamic linker connects this import to the corresponding exported symbol of the dynamic library at load time. In a Mach-O object file, the symbol is undefined. In most cases the linker will try to resolve this symbol at link time. Note The above is a bit vague because there are numerous edge cases in how the system handles undefined symbols. For more on this, see Undefined Symbols, below. The first column in the nm output is the address associated with the entry, or blank if an address is not relevant for this type of entry. For a Mach-O image, this address is based on the load address, so the actual address at runtime is offset by the slide. See An Apple Library Primer for more about those concepts. The third column is the name for this entry. These names have a leading underscore because that’s the standard name mangling for C. See An Apple Library Primer for more about name mangling. The nm tool has a lot of formatting options. The ones I use the most are: -m — This prints more information about each symbol table entry. For example, if a symbol is imported from a dynamic library, this prints the library name. For a concrete example, see A Deeper Examination below. -a — This prints all the entries, including debug symbols. We’ll come back to that in the Debug Symbols section, below. -p — By default nm sorts entries by their address. This disables that sort, causing nm to print the entries in the order in which they occur in the symbol table. -x — This outputs entries in a raw format, which is great when you’re trying to understand what’s really going on. See Raw Symbol Information, below, for an example of this. A Deeper Examination To get more information about each symbol table, run nm with the -m option: % nm -m Products/Debug/TestSymTab (undefined) external ___stdoutp (from libSystem) 0000000100000000 (__TEXT,__text) [referenced dynamically] external __mh_execute_header (undefined) external _fprintf (from libSystem) (undefined) external _getpid (from libSystem) 0000000100003f44 (__TEXT,__text) external _main 0000000100008000 (__DATA,__data) non-external _tDefault 0000000100003ecc (__TEXT,__text) external _test 0000000100003f04 (__TEXT,__text) non-external _testHelper This contains a world of extra information about each entry. For example: You no longer have to remember cryptic single letter codes. Instead of U, you get undefined. If the symbol is imported from a dynamic library, it gives the name of that dynamic library. Here we see that _fprintf is imported from the libSystem library. It surfaces additional, more obscure information. For example, the referenced dynamically flag is a flag used by the linker to indicate that a symbol is… well… referenced dynamically, and thus shouldn’t be dead stripped. Undefined Symbols Mach-O’s handling of undefined symbols is quite complex. To start, you need to draw a distinction between the linker (aka the static linker) and the dynamic linker. Undefined Symbols at Link Time The linker takes a set of files as its input and produces a single file as its output. The input files can be Mach-O images or dynamic libraries [1]. The output file is typically a Mach-O image [2]. The goal of the linker is to merge the object files, resolving any undefined symbols used by those object files, and create the Mach-O image. There are two standard ways to resolve an undefined symbol: To a symbol exported by another Mach-O object file To a symbol exported by a dynamic library In the first case, the undefined symbol disappears in a puff of linker magic. In the second case, it records that the generated Mach-O image depends on that dynamic library [3] and adds a symbol table entry for that specific symbol. That entry is also shown as undefined, but it now indicates the library that the symbol is being imported from. This is the core of the two-level namespace. A Mach-O image that imports a symbol records both the symbol name and the library that exports the symbol. The above describes the standard ways used by the linker to resolve symbols. However, there are many subtleties here. The most radical is the flat namespace. That’s out of scope for this post, because it’s a really bad option for the vast majority of products. However, if you’re curious, the ld man page has some info about how symbol resolution works in that case. A more interesting case is the -undefined dynamic_lookup option. This represents a halfway house between the two-level namespace and the flat namespace. When you link a Mach-O image with this option, the linker resolves any undefined symbols by adding a dynamic lookup undefined entry to the symbol table. At load time, the dynamic linker attempts to resolve that symbol by searching all loaded images. This is useful if your software works on other Unix-y platforms, where a flat namespace is the norm. It can simplify your build system without going all the way to the flat namespace. Of course, if you use this facility and there are multiple libraries that export that symbol, you might be in for a surprise! [1] These days it’s more common for the build system to pass a stub library (.tbd) to the linker. The effect is much the same as passing in a dynamic library. In this discussion I’m sticking with the old mechanism, so just assume that I mean dynamic library or stub library. If you’re unfamiliar with the concept of a stub library, see An Apple Library Primer. [2] The linker can also merge the object files together into a single object file, but that’s relatively uncommon operation. For more on that, see the discussion of the -r option in the ld man page. [3] It adds an LC_LOAD_DYLIB load command with the install name from the dynamic library. See Dynamic Library Identification for more on that. Undefined Symbols at Load Time When you load a Mach-O image the dynamic linker is responsible for finding all the libraries it depends on, loading them, and connecting your imports to their exports. In the typical case the undefined entry in your symbol table records the symbol name and the library that exports the symbol. This allows the dynamic linker to quickly and unambiguously find the correct symbol. However, if the entry is marked as dynamic lookup [1], the dynamic linker will search all loaded images for the symbol and connect your library to the first one it finds. If the dynamic linker is unable to find a symbol, its default behaviour is to fail the load of the Mach-O image. This changes if the symbol is a weak reference. In that case, the dynamic linking continues to load the image but sets the address of the symbol to NULL. See Weak vs Weak vs Weak, below, for more about this. [1] In this case nm shows the library name as dynamically looked up. Weak vs Weak vs Weak Mach-O supports two different types of weak symbols: Weak references (aka weak imports) Weak definitions IMPORTANT If you use the term weak without qualification, the meaning depends on your audience. App developers tend to assume that you mean a weak reference whereas folks with a C++ background tend to assume that you mean a weak definition. It’s best to be specific. Weak References Weak references support the availability mechanism on Apple platforms. Most developers build their apps with the latest SDK and specify a deployment target, that is, the oldest OS version on which their app runs. Within the SDK, each declaration is annotated with the OS version that introduced that symbol [1]. If the app uses a symbol introduced later than its deployment target, the compiler flags that import as a weak reference. The app is then responsible for not using the symbol if it’s run on an OS release where it’s not available. For example, consider this snippet: #include <xpc/xpc.h> void testWeakReference(void) { printf("%p\n", xpc_listener_set_peer_code_signing_requirement); } The xpc_listener_set_peer_code_signing_requirement function is declared like so: API_AVAILABLE(macos(14.4)) … int xpc_listener_set_peer_code_signing_requirement(…); The API_AVAILABLE macro indicates that the symbol was introduced in macOS 14.4. If you build this code with the deployment target set to macOS 13, the symbol is marked as a weak reference: % nm -m Products/Debug/TestWeakRefC … (undefined) weak external _xpc_listener_set_peer_code_signing_requirement (from libSystem) If you run the above program on macOS 13, it’ll print NULL (actually 0x0). Without support for weak references, the dynamic linker on macOS 13 would fail to load the program because the _xpc_listener_set_peer_code_signing_requirement symbol is unavailable. [1] In practice most of the SDK’s declarations don’t have availability annotations because they were introduced before the minimum deployment target supported by that SDK. Weak definitions Weak references are about imports. Weak definitions are about exports. A weak definition allows you to export a symbol from multiple images. The dynamic linker coalesces these symbol definitions. Specifically: The first time it loads a library with a given weak definition, the dynamic linker makes it the primary. It registers that definition such that all references to the symbol resolve to it. This registration occurs in a namespace dedicated to weak definitions. That namespace is flat. Any subsequent definitions of that symbol are ignored. Weak definitions are weird, but they’re necessary to support C++’s One Definition Rule in a dynamically linked environment. IMPORTANT Weak definitions are not just weird, but also inefficient. Avoid them where you can. To flush out any unexpected weak definitions, pass the -warn_weak_exports option to the static linker. The easiest way to create a weak definition is with the weak attribute: __attribute__((weak)) void testWeakDefinition(void) { } IMPORTANT The C++ compiler can generate weak definitions without weak ever appearing in your code. This shows up in nm like so: % nm -m Products/Debug/TestWeakDefC … 0000000100003f40 (__TEXT,__text) weak external _testWeakDefinition … The output is quite subtle. A symbol flagged as weak external is either a weak reference or a weak definition depending on whether it’s undefined or not. For clarity, use dyld_info instead: % dyld_info -imports -exports Products/Debug/TestWeakRefC Products/Debug/TestWeakDefC [arm64]: … -imports: … 0x0001 _xpc_listener_set_peer_code_signing_requirement [weak-import] (from libSystem) % dyld_info -imports -exports Products/Debug/TestWeakDefC Products/Debug/TestWeakDefC [arm64]: -exports: offset symbol … 0x00003F40 _testWeakDefinition [weak-def] … … Here, weak-import indicates a weak reference and weak-def a weak definition. Weak Library There’s one final confusing use of the term weak, that is, weak libraries. A Mach-O image includes a list of imported libraries and a list of symbols along with the libraries they’re imported from. If an image references a library that’s not present, the dynamic linker will fail to load the library even if all the symbols it references in that library are weak references. To get around this you need to mark the library itself as weak. If you’re using Xcode it will often do this for your automatically. If it doesn’t, mark the library as optional in the Link Binary with Libraries build phase. Use otool to see whether a library is required or optional. For example, this shows an optional library: % otool -L Products/Debug/TestWeakRefC Products/Debug/TestWeakRefC: /usr/lib/libEndpointSecurity.dylib (… 511.60.5, weak) … In the non-optional case, there’s no weak indicator: % otool -L Products/Debug/TestWeakRefC Products/Debug/TestWeakRefC: /usr/lib/libEndpointSecurity.dylib (… 511.60.5) … Debug Symbols or Why the DWARF still stabs. (-: Historically, all debug information was stored in symbol table entries, using a format knows as stabs. This format is now obsolete, having been largely replaced by DWARF. However, stabs symbols are still used for some specific roles. Note See <mach-o/stab.h> and the stab man page for more about stabs on Apple platforms. See stabs and DWARF for general information about these formats. In DWARF, debug symbols aren’t stored in the symbol table. Rather, debug information is stored in various __DWARF sections. For example: % otool -l Intermediates.noindex/TestSymTab.build/Debug/TestSymTab.build/Objects-normal/arm64/TestCore.o | grep __DWARF -B 1 sectname __debug_abbrev segname __DWARF … The compiler inserts this debug information into the Mach-O object file that it creates. Eventually this Mach-O object file is linked into a Mach-O image. At that point one of two things happens, depending on the Debug Information Format build setting. During day-to-day development, set Debug Information Format to DWARF. When the linker creates a Mach-O image from a bunch of Mach-O object files, it doesn’t do anything with the DWARF information in those objects. Rather, it records references to the source objects files into the final image. This is super quick. When you debug that Mach-O image, the debugger finds those references and uses them to locate the DWARF information in the original Mach-O object files. Each reference is stored in a stabs OSO symbol table entry. To see them, run nm with the -a option: % nm -a Products/Debug/TestSymTab … 0000000000000000 - 00 0001 OSO …/Intermediates.noindex/TestSymTab.build/Debug/TestSymTab.build/Objects-normal/arm64/TestCore.o 0000000000000000 - 00 0001 OSO …/Intermediates.noindex/TestSymTab.build/Debug/TestSymTab.build/Objects-normal/arm64/main.o … Given the above, the debugger knows to look for DWARF information in TestCore.o and main.o. And notably, the executable does not contain any DWARF sections: % otool -l Products/Debug/TestSymTab | grep __DWARF -B 1 % When you build your app for distribution, set Debug Information Format to DWARF with dSYM File. The executable now contains no DWARF information: % otool -l Products/Release/TestSymTab | grep __DWARF -B 1 % Xcode runs dsymutil tool to collect the DWARF information, organise it, and export a .dSYM file. This is actually a document package, within which is a Mach-O dSYM companion file: % find Products/Release/TestSymTab.dSYM Products/Release/TestSymTab.dSYM Products/Release/TestSymTab.dSYM/Contents … Products/Release/TestSymTab.dSYM/Contents/Resources/DWARF Products/Release/TestSymTab.dSYM/Contents/Resources/DWARF/TestSymTab … % file Products/Release/TestSymTab.dSYM/Contents/Resources/DWARF/TestSymTab Products/Release/TestSymTab.dSYM/Contents/Resources/DWARF/TestSymTab: Mach-O 64-bit dSYM companion file arm64 That file contains a copy of the the DWARF information from all the original Mach-O object files, optimised for use by the debugger: % otool -l Products/Release/TestSymTab.dSYM/Contents/Resources/DWARF/TestSymTab | grep __DWARF -B 1 … sectname __debug_line segname __DWARF … Raw Symbol Information As described above, each Mach-O file has a symbol table that’s an array of symbol table entries. The structure of each entry is defined by the declarations in <mach-o/nlist.h> [1]. While there is an nlist man page, the best documentation for this format is the the comments in the header itself. Note The terms nlist stands for name list and dates back to truly ancient versions of Unix. Each entry is represented by an nlist_64 structure (nlist for 32-bit Mach-O files) with five fields: n_strx ‘points’ to the string for this entry. n_type encodes the entry type. This is actually split up into four subfields, as discussed below. n_sect is the section number for this entry. n_desc is additional information. n_value is the address of the symbol. The four fields within n_type are N_STAB (3 bits), N_PEXT (1 bit), N_TYPE (3 bits), and N_EXT (1 bit). To see these raw values, run nm with the -x option: % nm -a -x Products/Debug/TestSymTab … 0000000000000000 01 00 0300 00000036 _getpid 0000000100003f44 24 01 0000 00000016 _main 0000000100003f44 0f 01 0000 00000016 _main … This prints a column for n_value, n_type, n_sect, n_desc, and n_strx. The last column is the string you get when you follow the ‘pointer’ in n_strx. The mechanism used to encode all the necessary info into these fields is both complex and arcane. For the details, see the comments in <mach-o/nlist.h> and <mach-o/stab.h>. However, just to give you a taste: The entry for getpid has an n_type field with just the N_EXT flag set, indicating that this is an external symbol. The n_sect field is 0, indicating a text symbol. And n_desc is 0x0300, with the top byte indicating that the symbol is imported from the third dynamic library. The first entry for _main has an n_type field set to N_FUN, indicating a stabs function symbol. The n_desc field is the line number, that is, line 22. The second entry for _main has an n_type field with N_TYPE set to N_SECT and the N_EXT flag set, indicating a symbol exported from a section. In this case the section number is 1, that is, the text section. [1] There is also an <nlist.h> header that defines an API that returns the symbol table. The difference between <nlist.h> and <mach-o/nlist.h> is that the former defines an API whereas the latter defines the Mach-O on-disk format. Don’t include both; that won’t end well!
0
0
971
Mar ’25
Unable to compile gcc installed from Homebrew
I have command line tools installed: % pkgutil --pkg-info=com.apple.pkg.CLTools_Executables package-id: com.apple.pkg.CLTools_Executables version: 16.2.0.0.1.1733547573 volume: / location: / install-time: 1739567437 Thus clang is installed here: % whereis g++ g++: /usr/bin/g++ I also have installed gcc from homebrew: % /opt/homebrew/bin/g++-14 --version g++-14 (Homebrew GCC 14.2.0_1) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. However, I still cannot compile any c++ code, even the simplest one: #include &lt;iostream&gt; using namespace std; int main() { cout &lt;&lt; "Hello World!" &lt;&lt; endl; return 0; } It returned this error: % /opt/homebrew/bin/g++-14 ~/Downloads/try.cpp ld: unsupported tapi file type '!tapi-tbd' in YAML file '/Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk/usr/lib/libSystem.tbd' for architecture arm64 collect2: error: ld returned 1 exit status It seems to be command line tools related. But I've already installed the most recent version of CLT and gcc. Additionally, clang can compile the same code: % /usr/bin/g++ ~/Downloads/try.cpp % ./a.out Hello World! What else shall I do to make this g++ compiler work?
2
0
486
Mar ’25
How can we get crash reports for the app installed on users' devices
Hi, From App analytics, we found that our app crashed from time to time on users' devices despite that we have tested it thoroughly on our devices. We are doubt that it's the reason why we can't retain them. But how can we get the crash reports for the app installed on user devices? We have no users' emails and can't ask them directly.
1
0
394
Mar ’25
csh globbing got broken a while back
% mkdir /tmp/test % cd /tmp/test % touch {a,b,c}{1,2,3,4,5,6}.txt % lf a1.txt a3.txt a5.txt b1.txt b3.txt b5.txt c1.txt c3.txt c5.txt a2.txt a4.txt a6.txt b2.txt b4.txt b6.txt c2.txt c4.txt c6.txt % echo [b-z]*.txt a1.txt a2.txt a3.txt a4.txt a5.txt a6.txt b1.txt b2.txt b3.txt b4.txt b5.txt b6.txt c1.txt c2.txt c3.txt c4.txt c5.txt c6.txt I filed FB16715590 about this. I have a vague memory this might be related to some code to pretend to be case insensitive, but I can't find it now.
3
0
293
Mar ’25
App Freezing at Launch and Unexpected Termination
We are experiencing an issue where our app gets stuck during launch. The splash screen appears for some time, and then the app either becomes unresponsive or closes unexpectedly. However, there are no crash logs captured in Xcode or Firebase Crashlytics, indicating that the app is not crashing but rather being terminated. This issue is preventing affected users from properly launching the app. Additionally, some users have reported occasional lag and slow performance when using the app. The issue occurs only for a specific subset of users and appears to be related to other Electronic Logging Device (ELD) apps running in the background. When these apps are active, our app struggles to launch and sometimes becomes unresponsive. We suspect that this behavior could be related to system resource allocation, such as high memory consumption by background apps, which might be affecting our app's ability to launch correctly. However, we have been unable to reproduce the issue on our end despite multiple attempts. Actions Performed During App Launch: Firebase configuration API requests, including: Fetching account details Registering the FCM token with the server Asynchronous background requests to fetch POI details Creating a local database and storing POI data in local storage We would like guidance from Apple regarding potential causes and debugging strategies, especially in scenarios where the app does not produce crash logs but still fails to launch properly. Any insights into memory management, conflicts with background applications, or system resource constraints would be highly appreciated. Steps to Reproduce: Install and launch the app on an affected device. Observe that the app gets stuck on the launch screen. After some time, the app terminates unexpectedly. Issue is inconsistent and occurs only for certain users. Presence of other ELD apps running in the background appears to influence the issue.
3
0
303
Mar ’25
Errors after importing plugins on other machines via source control
We are trying to setup Apple Unity Plugins, in out project we have a handful of developers who contribute to the project via git. When building and importing plugins via tarball (as instructed in the Github repo) the package clearly points to local path, so once pushed all members encounter the error: An error occurred while resolving packages: Project has invalid dependencies: com.apple.unityplugin.accessibility: Tarball package [com.apple.unityplugin.accessibility] cannot be found at path ..... When trying to actually move content to the package folder (same way as any other unity plugins is setup) and add it as "embedded", it works fine on local machine, but team members will get a few of errors: [Apple Unity Plug-ins] No Apple native plug-in libraries found. DLLNotFoundException: AppleCoreNativeMac assembly ... No Apple Native plug-in libraries found. Moreover AppleCoreNativeMac.bundle is flag as not verified and deleted by macOS. What is the right way to setup unity plugins in a project used by multiple members via sourcetree ?
2
0
225
Mar ’25
Crash reports downloaded by Xcode contain impossible call hierarchy
I was just having a look at some crash reports downloaded by Xcode, and I noticed the same wrong pattern I already mentioned here: the crash reports indicate that method A calls method B, which is impossible. In the first crash report below, method MainViewController.showSettings seems to be called by ConfirmMoveViewController.openSourceInFinder, which is impossible. ConfirmMoveViewController.openSourceInFinder is a context menu action in a modal window, and MainViewController.showSettings is in a completely different window and the two methods have no relation whatsoever. In the second crash report below, MainViewController.setSortMode is triggered by the press of a button (and nothing else) but seems to be called by OtherViewController.copy that can be triggered by a context menu (or keyboard shortcut). The two methods have no relation whatsoever. The rest of the stack trace confirm that it's indeed the button that was pressed. This seems to me like a quite serious bug in how macOS creates crash reports. 1.crash 2.crash
6
0
325
Mar ’25
Flutter App not Building for iOS
Hey, Since I set up push notifications for my Flutter app following this tutorial https://documentation.onesignal.com/docs/flutter-sdk-setup, my Flutter app no ​​longer builds for iOS in the CD pipeline. I get the following error: [17:24:47]: ▸ ProcessException: Process exited abnormally with exit code -6: [17:24:47]: ▸ Command line invocation: [17:24:47]: ▸ /Applications/Xcode_15.4.app/Contents/Developer/usr/bin/xcodebuild -list [17:24:47]: ▸ User defaults from command line: [17:24:47]: ▸ IDEPackageSupportUseBuiltinSCM = YES [17:24:47]: ▸ 2025-03-10 17:24:46.855 xcodebuild[13337:34491] [MT] DVTAssertions: ASSERTION FAILURE in DevToolsCore/Xcode3Core/LegacyProjects/Frameworks/DevToolsCore/DevToolsCore/ProjectModel/DataModel/References/SynchronizedGroups/PBXFileSystemSynchronizedAbstractGroup.m:28 [17:24:47]: ▸ Details: Assertion failed: IDEFileSystemSynchronizedGroupsAreEnabled() [17:24:47]: ▸ Object: <PBXFileSystemSynchronizedRootGroup> [17:24:47]: ▸ Method: +allocWithZone: [17:24:47]: ▸ Thread: <_NSMainThread: 0x60000026c200>{number = 1, name = main} [17:24:47]: ▸ Hints: [17:24:47]: ▸ Backtrace: [17:24:47]: ▸ 0 -[DVTAssertionHandler handleFailureInMethod:object:fileName:lineNumber:assertionSignature:messageFormat:arguments:] (in DVTFoundation) [17:24:47]: ▸ 1 _DVTAssertionHandler (in DVTFoundation) [17:24:47]: ▸ 2 _DVTAssertionFailureHandler (in DVTFoundation) [17:24:47]: ▸ 3 _DVTAssertionWarningHandler (in DVTFoundation) My pipeline looks like this: name: iOS Build and Deploy to App Store with Custom Version on: workflow_dispatch: inputs: version: description: 'Version number' required: true default: '1.0.0' env: FLUTTER_CHANNEL: "stable" RUBY_VERSION: "3.2.2" jobs: build_ios: name: Build iOS runs-on: macos-latest timeout-minutes: 20 steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: ${{ env.RUBY_VERSION }} bundler-cache: true working-directory: 'daytistics/ios' - name: Clean up vendor working-directory: 'daytistics/ios' run: rm -rf vendor - name: Install Bundler Gems working-directory: 'daytistics/ios' run: bundle install - name: Run Flutter tasks and get pub packages uses: subosito/flutter-action@v2.16.0 with: flutter-version-file: 'daytistics/pubspec.yaml' channel: ${{ env.FLUTTER_CHANNEL }} cache: true - name: Get Flutter Packages working-directory: ./daytistics run: flutter pub get - name: Install Bundler Gems working-directory: 'daytistics/ios' run: | bundle install bundle exec pod repo update # Add this line # Remove the "Reinstall CocoaPods" step entirely - name: Pod Install working-directory: 'daytistics/ios' run: bundle exec pod install - name: Clean Flutter build working-directory: ./daytistics run: flutter clean - name: Create .env file working-directory: ./daytistics run: touch .env - uses: maierj/fastlane-action@v3.1.0 with: lane: 'release_app_store' subdirectory: daytistics/ios options: '{ "version_number": "${{ github.event.inputs.version }}", "env_vars": ["SUPABASE_URL", "SUPABASE_ANON_KEY", "POSTHOG_API_KEY", "SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID", "SENTRY_DSN"] }' env: ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} ASC_KEY_P8_BASE64: ${{ secrets.ASC_KEY_P8_BASE64 }} MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} APP_BUNDLE_ID: ${{ secrets.APP_BUNDLE_ID }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} SUPABASE_URL: ${{ secrets.SUPABASE_URL }} SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }} POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID: ${{ secrets.SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID }} SENTRY_DSN: ${{ secrets.SENTRY_DSN }} Everything works as expected in the simulator. However, I think that the problem isn't related to the pipeline. Instead I think it is related to the "Signing Capabilities" in X-Code: https://i.sstatic.net/E0tSetZP.png https://i.sstatic.net/oC1xG0A4.png Thanks for your help!
1
0
628
Mar ’25
TestFlight app crashes on launch when minimum supported iOS version is set to iOS 14
Hi All, I have an App on AppStore, recently the minimum supported version of the app was changed from iOS 12 to iOS 14. Post that the TestFlight builds are crashing on launch. If we revert the minimum supported iOS version to 12, the crash no longer happens. This project is using cocoapods, and from the crash logs it seems the issue with with PLCrashReporter framework. "EXC_CRASH" Termination reason: DYLD 9 weak-def symbol not found '__ZN7plcrash3PL_5async15dwarf_cfa_stateljiE10push_stateEv'. This issue is happening only on TestFlight builds where the minimum supported version is 14.0 Any pointer to a solution is welcome.
1
0
374
Mar ’25
"No Such Module" When Using Mergable Libraries In a Static XCFramework
I'm attempting to create a proof of concept of a static library, distributed as an XCFramework, which has two local XCFramework dependencies. The reason for this is because I'm working to provide a single statically linked library to a customer, instead of providing them with the static library plus the two dependencies. The Issue With a fairly simple example project, I'm not able to access any code from the static library without the complier throwing a "No such module" error and saying that it cannot find one of the dependent modules. Project Layout I have an example project that has some example targets with basic example code. Example Project on Github Target: FrameworkA Mach-0 Type: Dynamic Build Mergable Library: Yes Skip Install: No Build Libraries For Distribution: Yes Target: FrameworkB Mach-0 Type: Dynamic Build Mergable Library: Yes Skip Install: No Build Libraries For Distribution: Yes XCFrameworks are being generated from these two targets using Apple's recommendations. I've verified that the mergable metadata is present in both framework's Info.plist files. Each exposes a single struct which will return an example String. Finally I have my SDK target: Target: ExampleKit Mach-0 Type: Static Build Mergable Library: No Create Merged Binary: Manual Skip Install: No Build Libraries For Distribution: Yes The two .xcframework files are in the Target's folder structure as well. The "Link Binary With Libraries" build phase includes them and they're Required. Inside of the ExampleKit target, I have a single public struct which has two static properties which return the example strings from FrameworkA and FrameworkB. I then have another script which generates an XCFramework from this target. Expectations Based on Apple's documentation and the "Meet Mergable Libraries" WWDC session I would expect that I could make a simple iOS app, link the ExampleKit.xcframework, import ExampleKit inside of a file, and be able to access the single public struct present in ExampleKit. Unfortunately, all I get is "No such module FrameworkA". I would expect that FrameworkA and FrameworkB would have been merged into ExampleKit? I'm really unsure of where to go from here in debugging this. And more importantly, is this even a possible thing to do?
0
0
261
Mar ’25
If you have code to package as a framework which has a 3rd party dependency, what can you do given that iOS doesn't support umbrella frameworks
I've got a large and complex app which has several dependencies upon 3rd party libraries (installed as pods). The app is structured according to Model-View-Controller design and there is a requirement to implement the Model part as an .xcframework so it can be included and used in the original app along with a few new apps. However, Apple documentation states that umbrella frameworks are not supported (Technical Note TN2435). The Model code has several dependencies which would be totally unfeasible to replace or remove, for example it uses RealmSwift for database storage. Obviously it would be impossible to write one's own database storage scheme in place of using Realm. However, if my framework uses Realm as a dependency, then its now become an umbrella framework. So therefore not supported according to Apple documentation. So what are options/solutions?
11
0
565
Mar ’25
Game Porting Toolkit brew install issue
Hi, I’m having trouble installing GPT 1.1 on macOS Sequoia 15.3.1 using Xcode Command Line Tools 16.0. I downloaded Evaluation Environment for Windows Games 2.1, mounted the image, and opened the README file. Then, I followed Option 2 to build the environment from scratch: Set up your development and Homebrew environment Ensure you are using Command Line Tools for Xcode 15.1. You can download this older version from: https://developer.apple.com/downloads Note: There is a header file layout change that prevents using newer versions of the macOS SDK. softwareupdate --install-rosetta arch -x86_64 zsh /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" which brew brew tap apple/apple http://github.com/apple/homebrew-apple brew -v install apple/apple/game-porting-toolkit At first, I noticed that I needed to use CLT 15.1, which is not supported on later macOS versions (including mine). Even when I tried using 15.3 (which is somehow supported), I received a message stating that I needed CLT v16.0 or higher to install GPT. After following all the steps and waiting for the installation to complete, I got the following error: ==> Installing apple/apple/game-porting-toolkit ==> Staging /Users/tycjanfalana/Library/Caches/Homebrew/downloads/7baed2a6fd34b4a641db7d1ea1e380ccb2f457bb24cd8043c428b6c10ea22932--crossover-sources-22.1.1.tar.gz in /private/tmp/game-porting-toolkit-20250316-15122-yxo3un ==> Patching ==> /private/tmp/game-porting-toolkit-20250316-15122-yxo3un/wine/configure --prefix=/usr/local/Cellar/game-porting-toolkit/1.1 --disable-win16 --disable-tests --without-x --without-pulse --without-dbus --without-inotify --without-alsa --without-capi --without-oss --without-udev --without-krb5 --enable-win64 --with-gnutls --with-freetype --with-gstreamer CC=/usr/local/opt/game-porting-toolkit-compiler/bin/clang CXX=/usr/local/opt/game-porting-toolkit-compiler/bin/clang++ checking build system type... x86_64-apple-darwin24.3.0 checking host system type... x86_64-apple-darwin24.3.0 checking whether make sets $(MAKE)... yes checking for gcc... /usr/local/opt/game-porting-toolkit-compiler/bin/clang checking whether the C compiler works... no configure: error: in `/private/tmp/game-porting-toolkit-20250316-15122-yxo3un/wine64-build': configure: error: C compiler cannot create executables See `config.log' for more details ==> Formula Tap: apple/apple Path: /usr/local/Homebrew/Library/Taps/apple/homebrew-apple/Formula/game-porting-toolkit.rb ==> Configuration HOMEBREW_VERSION: 4.4.24 ORIGIN: https://github.com/Homebrew/brew HOMEBREW_PREFIX: /usr/local Homebrew Ruby: 3.3.7 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/3.3.7/bin/ruby CPU: 14-core 64-bit westmere Clang: 16.0.0 build 1600 Git: 2.39.5 => /Library/Developer/CommandLineTools/usr/bin/git Curl: 8.7.1 => /usr/bin/curl macOS: 15.3.1-x86_64 CLT: 16.0.0.0.1.1724870825 Xcode: N/A Rosetta 2: true ==> ENV HOMEBREW_CC: clang HOMEBREW_CXX: clang++ CFLAGS: [..] Error: apple/apple/game-porting-toolkit 1.1 did not build Logs: /Users/xyz/Library/Logs/Homebrew/game-porting-toolkit/00.options.out /Users/xyz/Library/Logs/Homebrew/game-porting-toolkit/01.configure /Users/xyz/Library/Logs/Homebrew/game-porting-toolkit/01.configure.cc /Users/xyz/Library/Logs/Homebrew/game-porting-toolkit/wine64-build If reporting this issue, please do so to (not Homebrew/brew or Homebrew/homebrew-core): apple/apple In config.log, I found this: configure:4672: checking for gcc configure:4704: result: /usr/local/opt/game-porting-toolkit-compiler/bin/clang configure:5057: checking for C compiler version configure:5066: /usr/local/opt/game-porting-toolkit-compiler/bin/clang --version >&5 clang version 8.0.0 Target: x86_64-apple-darwin24.3.0 Thread model: posix InstalledDir: /usr/local/opt/game-porting-toolkit-compiler/bin configure:5077: $? = 0 configure:5066: /usr/local/opt/game-porting-toolkit-compiler/bin/clang -v >&5 clang version 8.0.0 Target: x86_64-apple-darwin24.3.0 Thread model: posix InstalledDir: /usr/local/opt/game-porting-toolkit-compiler/bin configure:5077: $? = 0 configure:5066: /usr/local/opt/game-porting-toolkit-compiler/bin/clang -V >&5 clang-8: error: argument to '-V' is missing (expected 1 value) clang-8: error: no input files configure:5077: $? = 1 configure:5066: /usr/local/opt/game-porting-toolkit-compiler/bin/clang -qversion >&5 clang-8: error: unknown argument '-qversion', did you mean '--version'? clang-8: error: no input files configure:5077: $? = 1 configure:5066: /usr/local/opt/game-porting-toolkit-compiler/bin/clang -version >&5 clang-8: error: unknown argument '-version', did you mean '--version'? clang-8: error: no input files configure:5077: $? = 1 configure:5097: checking whether the C compiler works configure:5119: /usr/local/opt/game-porting-toolkit-compiler/bin/clang [...] dyld[15547]: Symbol not found: _lto_codegen_debug_options_array Referenced from: <E33DCAC4-3116-3019-8003-432FB3E66FB4> /Library/Developer/CommandLineTools/usr/bin/ld Expected in: <43F5C676-DE37-3F0E-93E1-BF793091141E> /usr/local/Cellar/game-porting-toolkit-compiler/0.1/lib/libLTO.dylib clang-8: error: unable to execute command: Abort trap: 6 clang-8: error: linker command failed due to signal (use -v to see invocation) configure:5123: $? = 254 configure:5163: result: no configure: failed program was: | /* confdefs.h */ | #define PACKAGE_NAME "Wine" | #define PACKAGE_TARNAME "wine" | #define PACKAGE_VERSION "7.7" | #define PACKAGE_STRING "Wine 7.7" | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "" | /* end confdefs.h. */ | | int | main (void) | { | | ; | return 0; | } configure:5168: error: in `/private/tmp/game-porting-toolkit-20250316-15122-yxo3un/wine64-build': configure:5170: error: C compiler cannot create executables See `config.log` for more details Does anyone have any ideas on how to fix this?
0
0
487
Mar ’25
When creating a nested framework, most but not all symbols found
I've got an app where I want to split its Model code into a framework (.xcframework and .framework for debugging) so that it can be used by more than one app. The code has dependencies on 3rd party code, which are installed via pods. During the conversion process I keep running into the same issue which manifests with all the 3rd party code - which is that the majority of its api can be used (something like 80-90%) but for the remainder there is a linker error at runtime showing undefined symbols. I have this problem with CocoaLumberjack,RealmSwift, PhoneNumberKit and more. Its very quick and easy to reproduce the issue with a minimal framework and minimal app, below I'll describe how a minimal setup using CocoaLumberjack reproduces the issue: From scratch, I use Xcode to create a framework project, run pod init, then modify the pod file to be: platform :ios, '16.0' workspace 'TheFramework' project 'TheFramework' target 'TheFramework' do use_frameworks! pod 'CocoaLumberjack/Swift', '3.8.5' end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0' config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES' end end end Then I add source code: import Foundation import CocoaLumberjack public class AClassInTheFramework { public class func aMethod() { let consoleLogger = DDOSLogger.sharedInstance DDLog.add(consoleLogger, with: .debug) DDLogDebug("Some logging") } } Within the Xcode project, Build Libraries for Distribution is set to Yes, I also add that line to the pod file in case CocoaLumberjack isn't set similarly. In the Framework's Xcode General section, Frameworks and Libraries contains Pods_TheFramework.framework set to Do Not Embed. In the Build Phases section, in the Link Binary with Libraries section, Pods_TheFramework.framework is set to required. Next I create an Xcode app template, run pod install, and edit the app pod file to be: platform :ios, '16.0' workspace 'AppUsingFramework' project 'AppUsingFramework' target 'AppUsingFramework' do use_frameworks! pod 'CocoaLumberjack/Swift', '3.8.5' end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0' end end end I build the framework, and drag and drop it into the app. I add the following code to the app's delegate: import TheFramework ... AClassInTheFramework.aMethod() The App's target has the following linkage settings: When I build and run the app, there is the following error: If I change the source code in the framework to this: public class AClassInTheFramework { public class func aMethod() { let consoleLogger = DDOSLogger.sharedInstance DDLog.add(consoleLogger, with: .debug) // DDLogDebug("Some logging") } } Then there is no error and the code runs successfully. This illustrates the problem I've encountered with all the nested frameworks - in this particular case calls to DDLog.add() don't result in an error but calls to DDlogDebug() do, and that has been mirrored with other nested frameworks (for example with Realm, opening a database, adding, finding,retrieving an item all works without a problem, however attempting to use Realm's Results<> API results in a similar symbol not found error). Additionally note that the identical CocoaLumberjack code can run fine when used directly from within the app, i.e., if I add the following code to the app: import CocoaLumberjack func useCocoaLumberjackDirectlyFromWithinApp() { let consoleLogger = DDOSLogger.sharedInstance DDLog.add(consoleLogger, with: .debug) DDLogDebug("Some logging") } useCocoaLumberjackDirectlyFromWithinApp() Then it runs, i.e. DDLogDebug() can be successfully called from within the app, its only when its called via the framework that the error occurs. Why might I be encountering these issues? I'd have thought either I'd be able to use 100% of the nested framework's public api, or 0% of it (is something is not configured correct), not ~80% which is what I am encountering. Any ideas? TIA
2
0
254
Mar ’25
Debugging Mail extensions
I'm trying to rewrite an old AppleScript mail rule that I used extensively as a Mail extension using the MailKit framework and I've run into an issue. Previously, when developing the script, it was possible to debug it by selecting the message I wanted it applied to and choosing the Mail.app menu item "Message/Apply Rules" This would re-execute my script and I could iterate over it as many times as I liked while developing. I haven't found any great way of doing this for my extension with a MEMessageActionHandler. The closest I've found is to forward the message to myself and wait for it to come back in again over the internet, at which point the extension would get executed again. Needless to say, this makes debugging my MEMessageAction handler much slower. I've tried a number of things in Mail.app to try and get it to re-execute my extension with a particular message without any luck. Does anyone know of a good process for debugging a MEMessageActionHandler that doesn't involve forwarding the message to myself over and over and waiting for it to come in each time?
3
0
135
Mar ’25