Warning
Public APIs Only
-
App Store apps may only use public APIs.
-
This workshop is not about shipping to the App Store.
-
Today's examples are for debugging and personal experimentation.
To everyone joining iOS Private Playgrounds, welcome.
This project is where you'll add and share what you build in the workshop.
Create your folder, add your view, and make it available from the list in Playgrounds/ContentView.swift.
Work on your own branch and merge your changes through a pull request.
- Create a branch for your work.
- Open
Playgrounds.xcodeprojin Xcode. - Create a folder for your work at
Playgrounds/<ParticipantName>/. - Use the samples in
Playgrounds/WorkshopSample/as references for your view. - Add your Swift files inside
Playgrounds/<ParticipantName>/. - Register your entry in
Playgrounds/ContentView.swiftwith a newNavigationLink. - Run the
Playgroundsscheme and confirm your entry appears in the list. - Commit and push your branch.
- Open a pull request into
main, then merge it when your sample is ready. You do not need to wait for workshop staff approval.
List {
// Add one entry per participant here.
// Keep your view in `Playgrounds/<ParticipantName>/`.
NavigationLink {
YourSampleView()
} label: {
Text("Your Sample")
}
NavigationLink {
WorkshopSampleView()
} label: {
Text("Workshop Sample")
}
}Playgrounds/
ContentView.swift # Register your NavigationLink here with a clear label
WorkshopSample/ # Reference implementation for participants
<ParticipantName>/ # Add your work here, for example `Alex`
Docs/ # Guides for exploration, private API patterns, and workshop ideas
PrivateInterfaces/ # Reference interface files used in the workshop
When you start looking for private APIs, begin with runtime inspection so you can see what is actually present on the object in front of you. After that, use declarations and headers to broaden the search.
poallows you to check raw data from runtime objects.- Start here when you already know the target view or object and want to inspect what is visible at runtime.
| Command | What it shows |
|---|---|
_ivarDescription |
Check the list of instance variables for a specific object. |
_shortMethodDescription |
Quickly inspect the available methods on a class or object. |
_methodDescription |
Inspect method information in more detail. |
- headers.82flex.com is a convenient site for browsing iOS framework headers.
- Use it when you want to search by name quickly or get a rough sense of where a type is declared.
These are the main calling patterns covered in the workshop docs and samples.
Use these patterns after you know the key, selector, symbol, or class name you want to try.
| Pattern | Use it when |
|---|---|
| Key-Value Coding | You know the property name and want to read or set it through Objective-C Key-Value Coding. |
| Calling Objective-C Methods by Selector | You know the selector name and want to call the Objective-C method from Swift. |
| Resolving Symbols with dlsym | You know the exported symbol name and want to resolve it at runtime with dlsym(). |
| Adding an Objective-C Header | You want to expose a private Objective-C type to Swift and refer to it directly by name. |
These are just starting points 🚀 Feel free to explore beyond them and try any fun idea that catches your interest.
See Workshop Theme Ideas for previews and more details.
| Difficulty | Theme |
|---|---|
| ★ | Show a custom view controller above the message area of UIAlertController. |
| ★ | Present UISheetPresentationController as a full-screen sheet with interactive dismissal, like Apple Music Now Playing. |
| ★★ | Show a Menu independently from its source view with showsMenuFromSource. |
| ★★ | Apply VariableBlur to any view with UIBlurEffect. |
| ★★ | Show UISheetPresentationController from the left side on iPad. |
| ★★ | Show a custom view inside UIMenu. |
| ★★★ | Keep the background glassy for UISheetPresentationController even with the large detent. |
| ★★★★★ | Enable glass on the medium detent of UISheetPresentationController. The default medium detent looks subdued. |
- To submit an interoperability request, see Interoperability requests.
- To browse the current request list, see the Interoperability request tracker.