2016-04-07 18 views
8

Ứng dụng của tôi (ứng dụng cửa hàng ứng dụng) có thể kết nối qua 3G/4G/LTE/Edge, v.v. tuy nhiên nó không thể phát hiện tại thời gian thực (thông qua một cuộc gọi lại có lẽ) rằng sức mạnh của tín hiệu đã được sửa đổi. Ví dụ: Nếu tôi kết nối với 4G và tôi đang ở "góc" nơi tín hiệu là EDGE hoặc 2G, tôi muốn tắt một số chức năng. Ngoài ra tôi muốn kích hoạt lại chức năng với tín hiệu trở thành 4G một lần nữa.Cách phát hiện thời gian thực tăng/giảm công suất tín hiệu di động trong iOS

tôi đã thấy lớp CTTelephonyNetworkInfo và cũng có những giá trị được cung cấp trong SDK

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE   __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 

nhưng làm thế nào ứng dụng có thể nhận được thông báo nếu một trong những giá trị đó đang hoạt động. Tôi có một số mã mà đọc từ CTTelephoneNetworkInfo và các giá trị tôi đang lấy lại là chính xác, tuy nhiên điều này được thực hiện khi tôi gọi các phương pháp thủ công.

+2

Hãy nêu trong câu hỏi của bạn nếu ứng dụng bạn đang làm việc trên là dành cho các cửa hàng của Apple hoặc ứng dụng doanh nghiệp. Các giải pháp cho mỗi có thể khác nhau. – OhadM

+0

Bạn có thể kiểm tra http://stackoverflow.com/a/4955390/4557505 hoặc http://stackoverflow.com/a/14584397/4557505, nó có thể giúp bạn – HardikDG

Trả lời

5

Để phát hiện nguồn tín hiệu di động, tôi sử dụng CTRadioAccessTechnologyDidChangeNotification.

Bạn có thể thử mã này:

import CoreTelephony 

private var info: CTTelephonyNetworkInfo! 

func createObserver() { 
    self.info = CTTelephonyNetworkInfo(); 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "currentAccessTechnologyDidChange", 
      name: CTRadioAccessTechnologyDidChangeNotification, object: self.observerObject) 
} 

func currentAccessTechnologyDidChange() { 
    if let currentAccess = self.info.currentRadioAccessTechnology { 
     switch currentAccess { 
     case CTRadioAccessTechnologyGPRS: 
      print("GPRS") 
     case CTRadioAccessTechnologyEdge: 
      print("EDGE") 
     case CTRadioAccessTechnologyWCDMA: 
      print("WCDMA") 
     case CTRadioAccessTechnologyHSDPA: 
      print("HSDPA") 
     case CTRadioAccessTechnologyHSUPA: 
      print("HSUPA") 
     case CTRadioAccessTechnologyCDMA1x: 
      print("CDMA1x") 
     case CTRadioAccessTechnologyCDMAEVDORev0: 
      print("CDMAEVDORev0") 
     case CTRadioAccessTechnologyCDMAEVDORevA: 
      print("CDMAEVDORevA") 
     case CTRadioAccessTechnologyCDMAEVDORevB: 
      print("CDMAEVDORevB") 
     case CTRadioAccessTechnologyeHRPD: 
      print("HRPD") 
     case CTRadioAccessTechnologyLTE: 
      print("LTE") 
     default: 
      print("DEF") 
     } 
    } else { 
     print("Current Access technology is NIL") 
    } 
} 

Tôi đã thử nghiệm nó trên iphone của tôi bằng cách bật/tắt chế độ máy bay và tôi đã nhận thấy rằng đôi khi tôi phải chờ thêm một chút thời gian để thông báo. Vì vậy, có lẽ cách tốt hơn trong trường hợp của bạn sẽ được gọi là info.currentRadioAccessTechnology và nhận kết quả khi bạn cần. Tất nhiên, hãy nhớ loại bỏ người quan sát khi bạn không cần nó nữa.

của Apple tài liệu về vấn đề này:

currentRadioAccessTechnology Thảo luận: Các công nghệ truy cập vô tuyến hiện tại các thiết bị được đăng ký với. Có thể là NULL nếu thiết bị không được đăng ký trên bất kỳ mạng nào.

Additionaly, tôi thực hiện một số nghiên cứu và tôi thấy thú vị answer có thể giúp bạn.

Simple obj-C phiên bản:

#import <CoreTelephony/CTTelephonyNetworkInfo.h> 


CTTelephonyNetworkInfo *ctInfo = [CTTelephonyNetworkInfo new]; 
[[NSNotificationCenter defaultCenter] addObserverForName:CTRadioAccessTechnologyDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) { 
    NSLog(@"current access radio access did change to : %@", ctInfo.currentRadioAccessTechnology); 
}]; 
Các vấn đề liên quan