At WWDC 2018 Apple announced that they are working on a multi-year strategy to make it easier to port UIKit applications to the Mac. While some first-party applications such as the Home & News app are going to use this API in macOS 10.14, third-party developers won't have official access for another year. As a result, I made this project to help tinkerers/other impatient people get a taste of what's to come when Apple gives everyone access to Marzipan next year.
- macOS 10.14 Mojave & Xcode 10 (note: apparently Virtual Machines do not work with Marzipan, so you'll need a real Mac/Hackintosh to make magic happen)
- Disabling SIP & adding the
boot-args(Hopefully we can circumvent the entitlement check with a less brutish method in the near future)
- Requires jtool to parse the MachO loader commands.
- Requires optool to edit the MachO header of our almost final product.
- No longer requires any environment variables because the best rules are no rules.
- Still probably requires a beer or two.
- Requires you to disable SIP & add
boot-args. There has to be a better way.
- Seems to crash my debugger/Mac a lot (not sure if this is a me or a Mojave beta issue)
UIKitSystemprocess doesn't usually stop running when you stop debugging your app. It's best if you leave
sshdopen (I mean we already killed code signing, what's the worst that could happen) and connected so you can kill
UIKitSystemif your development machine locks up. Thanks goes to @stroughtonsmith and @_inside for the gnarly tip!
- Install Xcode 10, go to Preferences -> Locations -> select Xcode 10 for Command Line Tools
- Disable SIP and AMFI:
- boot into Recovery Mode (hold Cmd+R while rebooting), open Terminal from menu bar
- Get jtool and optool:
- Download jtool binary
git clone --recurse-submodules https://github.com/alexzielenski/optool.git
optool/optool.xcodeproj, hit Build
- Configure Xcode project
MarzipanPlatter/MarzipanPlatter.xcodeproj, go to MarzipanPlatter in sidebar -> MarzipanPlatter target -> General
- Change Signing -> Team to your team, let Xcode regenerate provisioning profiles
- Go to Build Settings tab, and set the
OPTOOL_PATHuser-defined settings to the respective locations where you installed
- Also, you can set the
IOSMAC_PLATFORM_NAMEuser-definied setting to either
iosmacwill use the linking magic to create an
macoswill create a patched
macOSbinary that requires the
CFMZEnabled=1environment variable to be set before launching the app. However, you can also link things like
- Hit Run (or use the CLI method below)
Build Release & Run (from the CLI)
If you're running into oh my goodness my Mac keeps dying issues when debugging, I've provided some simple instructions to create a release version of your Marzipan app.
To build the archive:
xcodebuild archive -scheme MarzipanPlatter -archivePath ./build/MarzipanPlatter.xcarchive
To export the
.app from the archive:
xcodebuild -exportArchive -archivePath ./build/MarzipanPlatter.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath ./build/
MarzipanPlatter with the useful
CFMZEnabled environment variable:
Or just use this one-liner:
xcodebuild archive -scheme MarzipanPlatter -archivePath ./build/MarzipanPlatter.xcarchive && xcodebuild -exportArchive -archivePath ./build/MarzipanPlatter.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath ./build/ && ./build/MarzipanPlatter.app/Contents/MacOS/MarzipanPlatter
- find a better way to run Marzipan apps without disabling important things like AMFI/SIP.
- continue adding samples to make this project sizzle.
- find a better way to debug Marzipan apps that doesn't involve rebooting my Mac every 30 minutes.
- write up an explaination of why you have to disable SIP/AMFI
- fix these TODOs
- A big shout out to @stroughtonsmith for sanity checking my approach to this problem/figuring out why UILabel decided to derp.
- @s1guza for tbdump
- @zhuowei for coming up with the clever
ldwrapmethod. Definitely check out the MarzipanTool repo listed below.
- @Morpheus______ for the awesome
*OS Internalsbooks that have taught me many things.
- MarzipanTool - Tools to build and run iOS UIKit applications on macOS 10.14 Mojave, using the iOSMac framework announced at WWDC.
It's probably best if you leave an issue if you have a real problem with this code. However, you can tweet/DM me @NSBiscuit on Twitter if you want to chat about life/snakes/random thoughts/etc.