Updating extensions for iOS 10
Let's collect knowledge like we did with iOS 9, iOS 8 and iOS 7 – paste in your notes and share what you've learned, and somebody else will organize it later. :) If you want to ask questions and share tips over chat with other developers, see How to use IRC for how to connect to #theos and #iphonedev.
Hey developer, you can add your knowledge here! Yes, you! Make an account and edit this page!
It's also helpful to double-check the statements here and add more info! These are notes and drafts from early research – feel free to update them.
If you want to see what's been recently updated on this page, you can use the wiki's history feature to compare the revisions (to look at the diff) since the last time you visited this page.
In iOS 9 and applications dynamic and shortcut items were accessed view dynamicShortcutItems and staticShortcutItems. These have now been changed to dynamicApplicationShortcutItems and staticApplicationShortcutItems;
For now you will need RocketBootStrap from https://rpetri.ch/repo .
You used to be able to manually create a shortcut item and activate it using _activateShortcutItem:fromApplication:. This has been removed.
The Console app in macOS Sierra supports reading logs from connected iOS devices – just select the device from the sidebar. The new concept seems to encourage being verbose, so system processes have become pretty noisy. Right click a message to reveal options for filtering to or filtering out messages from a process, library, subsystem, category, etc. You probably want to filter out irrelevant noisy processes otherwise you’ll be overwhelmed and need to scroll a lot. Set up a filter you’re happy with and click Save in the top-right. There is also the log command line tool.
Keep in mind the APIs are new to iOS 10. If you support older iOS, retrieve the function symbols at runtime with dlsym() and fall back to an old logging mechanism if they are null.
The iOS 10 lockscreen presents subclasses of SBDashBoardPageViewController as pages for the user to swipe through; new pages can be added with ease. See this wiki page for further information.
OpenSSH is broken on iOS 10, which is why yalu comes with dropbear (an alternative ssh server). To SSH into your device after jailbreaking, you have to do it via USB
If you accidentally install the openssh package (BigBoss Tools includes it for example), simply remove the openssh package, reboot and rejailbreak.
If you get this error with scp:
sh: scp: command not found lost connection
Download iosbinpack, then copy it over like so:
ssh phone 'cat > /usr/bin/scp' < ~/Downloads/iosbinpack64/usr/bin/scp
Then on the phone,
chmod +x /usr/bin/scp.
Tweak simply not loading
If your tweak (or preference bundle) does not load, you might have these lines in your Makefile that you need to remove:
TweakName_LDFLAGS += -Wl,-segalign,4000 TweakName_CODESIGN_FLAGS=-Sentitlements.xml
For reasons X and Y (I don't know - someone please fill this in).
See here for why
If your tweak relied on these method _menuButtonDown:/Up: (iOS 7+) or menuButtonDown:/Up: (iOS 6-) those will no longer work. A few alternatives are:
In the SpringBoard class you can call these
If you need to do a double press you can use the new class SBHomeHardwareButton which has a few methods to use. One that works well with the older methods is
-(BOOL)emulateHomeButtonEventsIfNeeded:(IOHIDEventRef)arg1 ; // IOS 10
This method takes the same parameter as the older methods to it is easy to use it:
uint64_t abTime = mach_absolute_time(); IOHIDEventRef event = IOHIDEventCreateKeyboardEvent(kCFAllocatorDefault, *(AbsoluteTime *)&abTime, 0xC, 0x40, YES, 0); [[[UIApplication sharedApplication] homeHardwareButton] emulateHomeButtonEventsIfNeeded:event]; CFRelease(event);
The SpringBoard class has a @property for the new "hardware" button like so:
@property (nonatomic,readonly) SBHomeHardwareButton * homeHardwareButton; // IOS 10
Both _simulateHomeButtonPress and emulateHomeButtonEventsIfNeeded don't simulate Home button fully, for example, you can't take screenshot, or call Siri by those methods
Logging using OSLog
NSLog/printf no longer prints to the system log. You must now use OSLog to display output on the console.
In order to use NSLog, you must compile your tweak using the iOS 10 SDK (or later)
In your makefile:
SDKVERSION = 10.1
To use OSLog:
#import <os/log.h> os_log(OS_LOG_DEFAULT, "HELLO CONSOLE!");