2014-08-21 5 views
3

Я новичок в iOS и изучаю код с Swift. Мое приложение должно измерять уровень сигнала. Я нашел этот код, работающий над Objective-C/C, и нуждаюсь в некоторой помощи для реализации в Swift. Вот что я получил. Надеюсь, кто-то может помочь мне закончить его.iOS Получите силу сигнала в быстрой (основной телефонии)

ЦЕЛЬ 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; 
    } 

СВИФТ

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 
    } 
+1

Почему вы не реализовать его в качестве метода класса в Obj-C класса? – creker

+1

Я пытаюсь сделать это быстрым. –

+0

Вы решили? Это просто невозможно? :( –

ответ

2

Не используйте dlopen для загрузки CoreTelephony. Используйте import CoreTelephony в верхней части вашего файла Swift. Затем просто используйте CTGetSignalStrength, как если бы это была любая другая функция.

+0

Тогда есть ошибка: использование неразрешенного идентификатора 'CTGetSignalStrength' –

+0

А, это частный API. Я не думаю, что можно использовать частные API непосредственно из Swift. Однако вы можете сохранить рабочий код Objective-C и использовать его из Swift. – Jesper

2

Swift 3 Решение

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 
} 
+0

Эта функция всегда возвращает 100 для меня на iOS11, все еще работает для вас на iOS11? –

+0

Нет, к сожалению это решение больше не работает с iOS11. –

+0

Спасибо за информацию. знаете метод, который работает и на iOS11? –

Смежные вопросы