3

I'm new to iOS, and am learning to code with Swift. My app needs to measure the signal strength. I've found this code working on Objective-C/C, and need some help to implement on Swift. Here is what I got. Hope someone can help me finish it.

OBJECTIVE C

    int getSignalStrength()
    {
       void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
       int (*CTGetSignalStrength)();
       CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength");
       if( CTGetSignalStrength == NULL) NSLog(@"Could not find CTGetSignalStrength");
       int result = CTGetSignalStrength();
       dlclose(libHandle);
       return result;
    }

SWIFT

    func getSignalStrength()->Int{
       var result : Int! = 0
       let libHandle = dlopen ("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTD_LAZY)
       ** help **
       var CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength")
       if (CTGetSignalStrength != nil){
           result = CTGetSignalStrength()
       }
       dlclose(libHandle)
       return result
    }

2 Answers2

2

Don't use dlopen to load CoreTelephony. Use import CoreTelephony at the top of your Swift file. Then just use CTGetSignalStrength as if it were any other function.

Jesper
  • 7,477
  • 4
  • 40
  • 57
  • Then there is an error : Use of unresolved identifier 'CTGetSignalStrength' – Supertel Moviles Aug 21 '14 at 15:24
  • Ah, it's a private API. I don't think it's possible to use private APIs directly from Swift. However, you can keep the working Objective-C code and use it from Swift. – Jesper Aug 21 '14 at 15:28
2

Swift 3 Solution

import CoreTelephony
import Darwin

    static func getSignalStrength()->Int{
        var result : Int = 0
        //int CTGetSignalStrength();
        let libHandle = dlopen ("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_NOW)
        let CTGetSignalStrength2 = dlsym(libHandle, "CTGetSignalStrength")

        typealias CFunction = @convention(c) () -> Int

        if (CTGetSignalStrength2 != nil) {
            let fun = unsafeBitCast(CTGetSignalStrength2!, to: CFunction.self)
            let result = fun()
            return result;
            print("!!!!result \(result)")
        } 
     return -1
 }
Leanid Vouk
  • 460
  • 6
  • 13