Breaking News
Loading...
Saturday, July 20, 2013

Thu tín hiệu GPS - Xcode - IPhone

7/20/2013 08:19:00 PM
CoreLocation là một framework của IOS  là rất mạnh mẽ, cho phép truy cập GPS của iPhone một cách dễ dàng. Ta có thể truy cập vào tọa độ hoặc tam giác di động, la bàn, hướng và tốc độ di chuyển của các thiết bị qua GPS. Sau đây sẽ là hướng dẫn các bạn tạo ra một Project kết nối tới GPS của iPhone.


Hình 1 Kết quả cần đạt được khi thu GPS của iPhone

Đầu tiên ta phải tạo một Project mới. Trong Xcode, File-> New Project. Hộp thoại hiển thị ra ta cần lưu ý chọn Application  của iPhone OS. Chọn tạo kiểu ứng dụng là View-based Application và lưu lại với tên CoreLocationDemo hoặc một tên bất kỳ bạn muốn.
Hình 2 Tạo Project “CoreLocationDemo” kiểu View-based Application

Sau khi tạo xong Project ta Add framework “CoreLocation.framework” vào trong dự án của chúng ta. Bằng cách tích vào dấu “+” trong Build Phases để Add framework này vào.
Hình 3 Tích vào dấu “+” trong Build Phases để Add framework
Ø Sau khi bấm vào dấu “+” thì hộp thoại chọn Add framework hiển thị ra ta hãy tìm chọn đến “CoreLocation.framework”
Hình 4 Chọn Add “CoreLocation.framework”

Tiếp theo ta cần tạo một lớp để quản lý truy cập “CoreLocation”. Lớp này sẽ nhận thông điệp từ framework  “CoreLocation” là chứa dữ liệu thô và sau đó sẽ chuyển thông tin này đến lớp ViewController(điều khiển hiển thị).
Ø Tạo một file mới (File-> New File) và tạo ra một lớp Objective-C mới (iPhone OS-> Cocoa Touch Class-> Objective-C) và nhớ chọn subclass là  “NSObject”. Đặt tên file này là “CoreLocationController” và chọn Add vào Project “CoreLocationDemo” của ta.
Hình 5 Tạo file mới “CoreLocationController”

Sau khi tạo file mới xong ta viết mã lệnh vào file này.
Ø Trong file CoreLocationController.h thêm mã lệnh sau vào:
#import <CoreLocation/CoreLocation.h> //Chèn thư viện CoreLocation
Ø Khai báo giao thức để cho các lớp khác có thể truy cập vào lấy thông tin lớp này thông qua giao thức ta tạo ra. Vẫn ở trong lớp CoreLocationController.h thêm lệnh sau:
@protocol CoreLocationControllerDelegate
@required
- (void)locationUpdate:(CLLocation *)location;
- (void)locationError:(NSError *)error;
@end
Ø Bây giờ chúng ta cần tạo cho lớp vừa mới thêm vào tuân thủ theo giao thức “CLLocationManagerDelegate”. Trong file CoreLocationController.h:
@interface CoreLocationController : NSObject <CLLocationManager Delegate> {
      CLLocationManager *locMgr;
      id delegate;
}
@property (nonatomic, retain) CLLocationManager *locMgr;
@property (nonatomic, assign) id delegate;
@end
Ø Sau khi khai báo lớp xong ở file “.h” ta chuyển sang phần nội dung của lớp ở file. Trong file CoreLocationController.m:
@synthesize locMgr, delegate; //Khởi tạo 2 biến đã được khai báo từ trước
Ø Bây giờ ta cần bắt đầu với phương thức “init”để được quyền truy cập vào giao thức CLLocationManager.(Bạn có thể tìm hiểu thêm ý phương thức “init” trong Objective-C). Trong file CoreLocationController.m:
- (id)init {
      self = [super init];
      if(self != nil) {
                  self.locMgr = [[[CLLocationManager alloc] init] autorelease];
                  self.locMgr.delegate = self;
      }
      return self;
}
Ø Tiếp theo là hai phương thức gọi lại từ giao thức CLLocationManagerDelegate. Chúng sẽ cập nhật dữ liệu tọa độ GPS, tốc độ…của “CoreLocation”, cũng như xử lý các thông báo lỗi. Cuối cùng, chúng ta cần xóa bỏ locMgr khi không cần dùng đến nữa. Trong file CoreLocationController.m:
- (void)locationManager:(CLLocationManager *)manager
 didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
if([self.delegate conformsToProtocol:@protocol
(CoreLocationControllerDelegate)]) {
                  [self.delegate locationUpdate:newLocation];
      }
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError: (NSError *)error {
      if([self.delegate conformsToProtocol:@protocol
(CoreLocationControllerDelegate)]) {
                  [self.delegate locationError:error];
      }
}
- (void)dealloc {
      [self.locMgr release];
      [super dealloc];
}

Ta đã tạo ra lớp thu nhận tín hiệu GPS của iPhone, giờ chúng ta cần lien kết file này tới các file View Controller để hiển thị thông tin GPS thu nhận được, ta cần tuân thủ theo giao thức mà đã tạo ra ở lớp trên. Mở file “CoreLocationDemoViewController.h” trong file này ta định nghĩa 4 IBOutlet UILabel để hiện thị thông tin thu nhận GPS.
#import <UIKit/UIKit.h>
#import "CoreLocationController.h"
@interface CoreLocationDemoViewController : UIViewController <CoreLocationControllerDelegate> {
      CoreLocationController *CLController;
      IBOutlet UILabel *speedLabel;
      IBOutlet UILabel *latitudeLabel;
      IBOutlet UILabel *longitudeLabel;
      IBOutlet UILabel *altitudeLabel;
}
@property (nonatomic, retain) CoreLocationController *CLController;
@end

Chọn file CoreLocationDemoViewController.xib và kéo thả từ Object Library 4 IBOutlets UILabel. Ta thiết kế như hình đầu Project giới thiệu. Sau đó liên kết 4 Label này với mã lệnh(làm tương tự như phần 4.3). Tiếp theo ta chọn file “CoreLocationDemoViewController.m” viết code sau vào:
@synthesize CLController;
- (void)viewDidLoad {
[super viewDidLoad];
      CLController = [[CoreLocationController alloc] init];
      CLController.delegate = self;
      [CLController.locMgr startUpdatingLocation];
}
- (void)locationUpdate:(CLLocation *)location {
      speedLabel.text = [NSString stringWithFormat:@"SPEED: %f", [location speed]];
      latitudeLabel.text = [NSString stringWithFormat:@"LATITUDE: %f", location.coordinate.latitude];
      longitudeLabel.text = [NSString stringWithFormat:@"LONGITUDE: %f", location.coordinate.longitude];
      altitudeLabel.text = [NSString stringWithFormat:@"ALTITUDE: %f", [location altitude]];
}
- (void)locationError:(NSError *)error {
      speedLabel.text = [error description];
}
- (void)dealloc {
      [CLController release];
    [super dealloc];
}


Vậy là ta đã hoàn thành việc kết nói GPS iPhone và hiển thị các thông tin này lên giao diện của chương trình. Bạn có thể bấm Build and Go để chạy chương trình. (Các bạn lưu ý muốn có kết quả hiển thị thì ta phải sử dụng kết nối thiết bị iPhone)

0 comments:

Post a Comment

 
Toggle Footer