
In den Kern des Apple dient als Haus, um die Grenzen dessen zu testen, was an nativem iOS ohne Jailbreak getan werden kann.
Dieses Projekt dient zu Bildungszwecken und der Code sollte in keiner Anwendung für den App Store verwendet werden.
Alle Projekte und Snippits werden für Nichtjailbroken -Geräte durchgeführt und betrieben. Während der ungetesteten Ausschnitte sollten die meisten folgenden Ausschnitte in Spielplätzen auf dem iPad laufen können.
import Darwin
import Foundation
/**
Obtains an array of dictionaries representing device battery info. Returns nil if there was an issue retrieving info from battery API.
*/
func deviceBatteryInfo ( ) -> [ [ String : AnyObject ] ] ? {
guard case let handle = dlopen ( " /System/Library/PrivateFrameworks/BatteryCenter.framework/BatteryCenter " , RTLD_LAZY ) , handle != nil ,
let c = NSClassFromString ( " BCBatteryDeviceController " ) as AnyObject as? NSObjectProtocol else {
return nil
}
func sharedInstance ( ) -> String { return " sharedInstance " } // Silence compiler warnings
guard c . responds ( to : Selector ( sharedInstance ( ) ) ) == true else { return nil }
let instance = c . perform ( Selector ( sharedInstance ( ) ) ) . takeUnretainedValue ( )
guard let batteries = instance . value ( forKey : " connectedDevices " ) as? [ AnyObject ] else { return nil }
let batteryInfo = batteries . compactMap { battery -> [ String : AnyObject ] ? in
var propertyCount : UInt32 = 0
guard let properties = class_copyPropertyList ( battery . classForCoder , & propertyCount ) else { return nil }
var batteryDictionary = [ String : AnyObject ] ( )
for i in 0 ..< propertyCount {
let cPropertyName = property_getName ( properties [ Int ( i ) ] )
let pName = String ( cString : cPropertyName )
batteryDictionary [ pName ] = battery . value ( forKey : pName ) as AnyObject
}
free ( properties ) //release Obj-C property structs
return batteryDictionary
}
return batteryInfo
}
print ( " Batteries' Info: ( deviceBatteryInfo ( ) ) " ) ![]()
Ich habe ein ganzes Projekt um diese Idee namens Appexplorer erstellt. Weitere Informationen finden Sie im Repo und wie Sie es in Ihrem eigenen Projekt implementieren können.
class AirplaneManager {
/**
Whether or not airplane mode is enabled. Returns nil if an error occured getting info from API.
*/
static func isAirplaneModeEnabled ( ) -> Bool ? {
guard case let handle = dlopen ( " /System/Library/PrivateFrameworks/AppSupport.framework/AppSupport " , RTLD_LAZY ) , handle != nil ,
let c = NSClassFromString ( " RadiosPreferences " ) as? NSObject . Type else {
return nil
}
let radioPreferences = c . init ( )
if radioPreferences . responds ( to : NSSelectorFromString ( " airplaneMode " ) ) {
return ( radioPreferences . value ( forKey : " airplaneMode " ) as AnyObject ) . boolValue
}
return false
}
}
print ( " Airplane Mode Enabled: ( AirplaneManager . isAirplaneModeEnabled ( ) ) " ) Um die Funktionen von ScdynamicStorecreate und ScdynamicStoreCopyValue zu verwenden, muss das Makro __OSX_AVAILABLE_STARTING für diese Funktionen geändert werden.
Der einfachste Weg, dies zu tun, ist ⌘ + ⌥ + CLICK auf die Funktionsnamen in Xcode, die Sie zu den jeweiligen Headern bringt. Kommentieren Sie die hier gesehenen Makros:
SCDynamicStoreRef __nullable SCDynamicStoreCreate (
CFAllocatorRef __nullable allocator,
CFStringRef name,
SCDynamicStoreCallBack __nullable callout,
SCDynamicStoreContext * __nullable context
) /* __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_NA) */ ; CFPropertyListRef __nullable SCDynamicStoreCopyValue (
SCDynamicStoreRef __nullable store,
CFStringRef key
) /* __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_NA) */ ;
let reader = MobileHotspotReader . sharedReader
print ( " Connected Devices: ( reader . numberOfConnectedDevices ) " )
print ( " Connected over Bluetooth: ( reader . connectionsOverBluetooth ) " ) Dieser Code erfordert keine privaten APIs, verwendet jedoch hartcodierte Zeichenfolgen, die sich in zukünftigen Betriebssystemversionen ändern können.
print ( " Wifi is Enabled : ( NetworkManager . wifiEnabled ( ) ) " )
print ( " Wifi is Connected : ( NetworkManager . wifiConnected ( ) ) " )
print ( " Currently Tethering : ( NetworkManager . isTethering ( ) ) " ) import Darwin
import UIKit
struct WallpaperLocation : OptionSet {
let rawValue : Int
static let lockscreen = WallpaperLocation ( rawValue : 1 << 0 )
static let homescreen = WallpaperLocation ( rawValue : 1 << 1 )
}
func setWallpaper ( image : UIImage , location : WallpaperLocation ) -> Bool {
guard case let handle = dlopen ( " /System/Library/PrivateFrameworks/SpringBoardUI.framework/SpringBoardUI " , RTLD_LAZY ) , handle != nil else {
return false
}
guard case let symbol = dlsym ( handle , " SBSUIWallpaperSetImageAsWallpaperForLocations " ) , symbol != nil else {
return false
}
typealias methodSignature = @ convention ( c ) ( AnyObject , NSInteger ) -> ( )
let _ = unsafeBitCast ( symbol , to : methodSignature . self ) ( image , location . rawValue )
dlclose ( handle )
return true
}
setWallpaper ( image , location : [ . homescreen , . lockscreen ] )