2017-10-18 14 views
1

J'essaie de détecter l'état de Hotspot dans iOS. Pour que je dois utiliser les API SystemConfiguration comme suitModifier les en-têtes de SCDynamicStore.h dans swift

let sc = SCDynamicStoreCreate(nil, "com.apple.wirelessmodemsettings.MISManager" as CFString, nil, nil) 
let info = SCDynamicStoreCopyValue(sc, "com.apple.MobileInternetSharing" as CFString) 

Mais SCDynamicStoreCreate et SCDynamicStoreCopyValue ne sont pas disponibles pour iOS. Je dois modifier le fichier SCDynamicStore.h et rendre ces fonctions disponibles pour iOS (elles sont actuellement marquées disponibles pour Mac uniquement).

Ce lien mentionne un moyen de le faire en créant un en-tête dupliqué. SCDynamicStoreCreate is unavailable: not available on iOS. Mais cette méthode ne fonctionne pas pour moi rapidement.

Comment cela peut-il être réalisé avec swift?

Merci

Répondre

1

Il y a quelques façons dont vous pouvez le faire.

Voici une manière qui est tout Swift et n'implique pas de modifier les fichiers d'en-tête.

import SystemConfiguration 

    // Define types for each of the calls of interest 
    typealias TSCDynamicStoreCreate = @convention (c) (_ allocator: CFAllocator?, _ name: CFString, _ callout: SystemConfiguration.SCDynamicStoreCallBack?, _ context: UnsafeMutablePointer<SCDynamicStoreContext>?) -> SCDynamicStore? 
    typealias TSCDynamicStoreCopyValue = @convention (c) (_ store: SCDynamicStore?, _ key: CFString) -> CoreFoundation.CFPropertyList? 

    // Get a handle to the library, the flag `RT_NOLOAD` will limit this 
    // to already loaded libraries 
    let hLibrary = dlopen("/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration", RTLD_NOLOAD); 

    // Load addresses of the functions from the library 
    let MySCDynamicStoreCreate = unsafeBitCast(dlsym(hLibrary, "SCDynamicStoreCreate"), to: TSCDynamicStoreCreate.self) 
    let MySCDynamicStoreCopyValue = unsafeBitCast(dlsym(hLibrary, "SCDynamicStoreCopyValue"), to: TSCDynamicStoreCopyValue.self) 

    // Setup constants 
    let name = "com.apple.wirelessmodemsettings.MISManager" as CFString 
    let key = "com.apple.MobileInternetSharing" as CFString 

    // Call the functions through the looked up addresses 
    let dynamicStore = MySCDynamicStoreCreate(nil, name, nil, nil) 
    let plist = MySCDynamicStoreCopyValue(dynamicStore, key) 
    dump(plist) 
+1

Merci @idz ... ça marche parfaitement bien – Suraj