Bắt đầu sử dụng Places SDK for iOS (Objective-C)

1. Trước khi bắt đầu

Trước khi bắt đầu viết mã, bạn cần thiết lập một số điều kiện tiên quyết.

Xcode

Hướng dẫn này sử dụng công cụ Xcode của Apple cùng với ngôn ngữ Objective-C để tạo một ứng dụng iOS đơn giản chạy trong trình mô phỏng. Bạn không cần thiết bị thực. Bạn có thể tải Xcode xuống tại https://developer.apple.com/xcode/

CocoaPods

Places SDK for iOS có sẵn dưới dạng một pod CocoaPods. CocoaPods là một công cụ quản lý phần phụ thuộc nguồn mở cho các dự án Swift và Objective-C. Nếu chưa có công cụ này, bạn cần cài đặt trước khi tiếp tục. Bạn có thể cài đặt công cụ này từ thiết bị đầu cuối như sau:

sudo gem install cocoapods

Để biết thêm thông tin chi tiết về CocoaPods, hãy xem Hướng dẫn bắt đầu sử dụng CocoaPods.

Cài đặt SDK

Để cài đặt SDK, bạn cần tạo một Podfile trong thư mục dự án mà CocoaPods sẽ dùng để tải xuống và định cấu hình các phần phụ thuộc cần thiết. Cách dễ nhất để làm việc này là tạo một Dự án mới trong Xcode, thêm một Podfile vào dự án đó và cài đặt các pod ở đó.

Mở Xcode và bạn sẽ thấy màn hình "Chào mừng bạn đến với Xcode". Tại đây, hãy chọn "Tạo một dự án Xcode mới"

4f1ecee473937c7b.png

Trên màn hình tiếp theo, bạn sẽ được yêu cầu chọn một mẫu cho dự án mới. Chọn "Single View Application" (Ứng dụng có một chế độ xem duy nhất) cho iOS, rồi nhấn vào "Next" (Tiếp theo)

Khi được hỏi về Tên sản phẩm, bạn có thể chọn tên bất kỳ mà bạn muốn, nhưng hãy nhớ ghi lại Mã nhận dạng gói được tạo cho bạn. Bạn sẽ cần đến thông tin đó sau này.

72fbf25cb2db22ad.png

Nhấn vào "Tiếp theo" và dự án sẽ được tạo cho bạn. Ghi lại thư mục nơi bạn tạo tệp này. Đóng Xcode rồi dùng Terminal để chuyển đến thư mục đó.

Sử dụng Terminal, nhập lệnh sau:

pod init

Một tệp có tên là Podfile sẽ được tạo cho bạn. Chỉnh sửa tệp này để thêm một pod cho GoogleMaps như sau:

target '{YOUR APP NAME}' do
pod 'GoogleMaps'
end

Lưu tệp đó rồi đóng Xcode. Nhớ đóng tệp này vì trong bước tiếp theo, bạn sẽ chỉnh sửa dự án cơ bản. Bạn sẽ mở một tệp dự án khác sau khi hoàn tất. Nhà phát triển thường nhầm lẫn về vị trí của mọi thứ nếu trước đó họ không đóng Xcode! Bây giờ, trong một thiết bị đầu cuối, hãy chuyển đến thư mục dự án của bạn và chạy "pod install" như sau:

789c5bc62817f68a.png

Sau khi bạn hoàn tất, các pod sẽ được cài đặt và một tệp .xcworkspace mới sẽ được tạo. Hãy sử dụng mã này cho dự án từ giờ trở đi. Tuy nhiên, trước khi viết mã, bạn sẽ cần có một khoá API.

2. Lấy khoá API

Đối với bước bật sau đây, hãy bật Maps SDK cho iOS.

Thiết lập Nền tảng Google Maps

Nếu bạn chưa có tài khoản Google Cloud Platform và dự án có bật tính năng thanh toán, vui lòng xem hướng dẫn Bắt đầu sử dụng Google Maps Platform để tạo tài khoản thanh toán và dự án.

  1. Trong Cloud Console, hãy nhấp vào trình đơn thả xuống dự án rồi chọn dự án mà bạn muốn sử dụng cho lớp học lập trình này.

  1. Bật các API và SDK của Google Maps Platform cần thiết cho lớp học lập trình này trong Google Cloud Marketplace. Để làm như vậy, hãy làm theo các bước trong video này hoặc tài liệu này.
  2. Tạo khoá API trong trang Thông tin xác thực của Cloud Console. Bạn có thể làm theo các bước trong video này hoặc tài liệu này. Tất cả các yêu cầu gửi đến Nền tảng Google Maps đều cần có khoá API.

3. Tạo ứng dụng Places API

Giờ đây, bạn đã tạo một dự án trên bảng điều khiển và kích hoạt Places API trên dự án đó, đồng thời nhận được khoá API. Vậy là bạn đã sẵn sàng bắt đầu lập trình ứng dụng Places API đầu tiên của mình.

Trước đó, khi bạn cài đặt các tệp pod, một tệp .xcworkspace mới đã được tạo cho bạn. Mở tệp này bằng cách nhấp đúp vào tệp.

19d62f34c08e645c.png

Trong Project Explorer (Trình khám phá dự án), bạn sẽ thấy một thư mục mới có tên là "Pods". Nếu quá trình này diễn ra thành công, bạn sẽ thấy một thư mục GoogleMaps chứa các khung.

8844d861f64c61aa.png

4. Chỉnh sửa tệp Info.plist.

Khi bạn chạy ứng dụng lần đầu tiên, iOS sẽ hiển thị một hộp thoại yêu cầu người dùng cấp quyền truy cập vào dịch vụ vị trí. Hộp thoại này sẽ cung cấp một chuỗi mà bạn xác định và bạn sẽ đặt chuỗi đó vào tệp Info.plist. Nếu không có chuỗi này, hộp thoại sẽ không xuất hiện và ứng dụng của bạn sẽ không hoạt động.

Bạn có thể tìm thấy tệp Info.plist trong trình khám phá dự án tại đây:

c224c920ab3f1ef.png

Chọn tệp đó, bạn sẽ thấy trình chỉnh sửa plist.

859ca56f3b19da5.png

Di chuột lên một phần tử bất kỳ, bạn sẽ thấy biểu tượng "+" xuất hiện. Nhấn vào đó, bạn sẽ thấy một mục mới xuất hiện. Nhập giá trị "NSLocationAlwaysUsageDescription" vào hộp này.

9fb225d6f5508794.png

Nhấn Enter để thêm khoá mới. Sau đó, nhấp đúp vào cột Giá trị cho khoá này rồi thêm một chuỗi:

5aefeb184187aa58.png

Để tìm hiểu thêm về chuỗi này, hãy xem tài liệu dành cho nhà phát triển của Apple tại đây.

5. Chỉnh sửa uỷ quyền ứng dụng

Trong trình khám phá dự án, hãy tìm và mở AppDelegate.m. Bạn sẽ dùng tệp này để thêm Khoá API.

Ở đầu tệp, hãy thêm dòng này ngay bên dưới dòng #import:

@import GoogleMaps;

Sau đó, trong hàm didFinishLaunchingWithOptions:, hãy thêm nội dung sau vào ngay trước dòng "return YES":

[GMSServices provideAPIKey:@"<Add your API Key>"];

Hãy nhớ sử dụng Khoá API mà bạn đã tạo trước đó.

6. Chỉnh sửa tệp bảng phân cảnh

Trong trình khám phá dự án, hãy mở tệp Main.storyboard. Đảm bảo thanh bên đang hoạt động bằng cách nhấn vào nút thanh bên ở góc trên cùng bên phải.

352af28b970d9e2.png

Sau đó, ở cuối thanh bên, hãy tìm Label Control (Nhãn kiểm soát) bằng cách đảm bảo bạn đã chọn Object Library (Thư viện đối tượng).

adec7051ae949531.png

Trong Cảnh của trình điều khiển chế độ xem ở bên trái, hãy đảm bảo bạn đã chọn "Chế độ xem":

e4827b92b5861e3e.png

Sau đó, kéo và thả 7 nhãn vào khung hiển thị. Sắp xếp các thành phần đó như hình minh hoạ tại đây. Hãy nhớ kéo kích thước của các thành phần này cho phù hợp với kích thước hiển thị. Bạn có thể chỉnh sửa văn bản trong nhãn bằng cách nhấp đúp vào nhãn đó rồi nhập giá trị cần thiết:

f8a9457772358069.png

Đối với nhãn dưới cùng (nhãn thực sự lớn), hãy chuyển đến trình chỉnh sửa thuộc tính và đảm bảo rằng nhãn đó được đặt thành 0 dòng (theo mặc định là 1). Thao tác này sẽ cho phép thành phần hiển thị nhiều dòng.

a4abacf00d8888fe.png

7. Tạo các ổ cắm cho các giá trị

Đối với 3 nhãn "giá trị", bạn cần tạo một cửa hàng. Điều này sẽ cho phép bạn thay đổi các giá trị của chúng bằng mã. Để làm việc này, trước tiên, bạn cần kích hoạt trình chỉnh sửa hỗ trợ. Để làm việc này, trước tiên, hãy đóng thanh bên thuộc tính bằng cách nhấp vào nút của thanh bên đó để xoá. (Nút này xuất hiện ở bước trước)

Sau đó, hãy chọn nút trợ lý (nút có hình hai vòng tròn như trong hình dưới đây):

e92dcc4ceea20a51.png

Đảm bảo rằng tệp này đang hiển thị tệp ViewController.h. Nếu không, bạn có thể thay đổi để làm như vậy bằng cách sử dụng trình chỉnh sửa ở đầu cửa sổ trợ lý:

d42f0fcc18b84703.png

Sau đó, khi giữ phím CONTROL, hãy kéo từng nhãn và thả nhãn đó xuống dưới dòng @interface trong tệp ViewController.h trong trợ lý. Một hộp thoại sẽ bật lên hỏi bạn muốn thực hiện loại kết nối nào:

a44b7888ed0f62b.png

Đảm bảo rằng các chế độ cài đặt như hình minh hoạ (Kết nối: Ổ cắm; Loại: UILabel; Bộ nhớ: Yếu), sau đó đặt tên cho từng chế độ cài đặt. Trong phạm vi của lớp học lập trình này, tôi đã gọi nhãn Kinh độ, Vĩ độ và Độ cao lần lượt là lblLongitude, lblLatitude và lblAltidude. Ngoài ra, hãy kéo nhãn lớn từ dưới lên và gọi nhãn đó là lblPlaces.

Sau khi hoàn tất, tệp ViewController.h của bạn sẽ có dạng như sau:

#import <UIKit/UIKit.h>
@import GoogleMaps;

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;

@end

8. Chỉnh sửa tệp tiêu đề cho API vị trí và API ứng dụng Google

Trước các bước cuối cùng (khi bạn tạo ứng dụng để sử dụng Places API), bạn cần thiết lập thêm một số biến trong tệp tiêu đề (ViewController.h). Đây là Trình quản lý vị trí cốt lõi và một đối tượng Vị trí cốt lõi:

@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;

Bạn cũng cần có một Google API Client:

@property GMSPlacesClient *placesClient;

Cuối cùng, bạn sẽ cần cập nhật tệp tiêu đề để lớp này triển khai CLLocationManagerDelegate:

@interface ViewController : UIViewController<CLLocationManagerDelegate>

Sau khi hoàn tất, tệp tiêu đề của bạn sẽ có dạng như sau:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>


@interface ViewController : UIViewController<CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;

@property GMSPlacesClient *placesClient;
@end

9. Chỉnh sửa View Controller

Bước đầu tiên là chỉnh sửa hàm viewDidLoad để khởi tạo Trình quản lý vị trí, yêu cầu người dùng cấp quyền truy cập thông tin vị trí và cuối cùng là khởi động trình quản lý vị trí để trình quản lý này theo dõi vị trí hiện tại. Bạn cũng sẽ khởi chạy ứng dụng Google Places API.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc]init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.locationManager requestAlwaysAuthorization];
        // Or [self.locationManager requestWhenInUseAuthorization];
    }
    [self.locationManager startUpdatingLocation];
    
    self.locationManager.delegate = self;
    self.location = [[CLLocation alloc] init];
    self.placesClient = [GMSPlacesClient sharedClient];
}

10. Xử lý thông tin cập nhật vị trí

Trình quản lý vị trí sẽ gọi lại cho Bộ điều khiển chế độ xem của bạn bằng các bản cập nhật vị trí bằng cách gọi hàm didUpdateLocations. Bạn sẽ cần thêm hàm này vào ViewController.m. Hàm này có dạng như sau:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    // Enter code here
}

Hàm này sẽ cần thực hiện một số việc.

Trước tiên, nó sẽ lưu vị trí vào bộ nhớ đệm bằng vị trí nhận được gần đây nhất:

self.location = locations.lastObject;

Tiếp theo, bạn nên cập nhật 3 nhãn cho Vĩ độ, Kinh độ và Độ cao:

self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];

self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];

self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];

Tiếp theo, bạn sẽ gọi Places API bằng ứng dụng Places. Bạn thực hiện việc này bằng cách chỉ định hàm gọi lại. Hàm này sẽ nhận được danh sách xác suất của địa điểm. Places API xác định khả năng bạn đang ở một địa điểm cụ thể dựa trên vị trí của bạn. API này trả về tên của những địa điểm có khả năng cao, cùng với một giá trị từ 0 đến 1 chứa xác suất bạn ở địa điểm đó.

[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

Sau đó, bạn có thể triển khai lệnh gọi lại. Thao tác này sẽ lặp lại danh sách các khả năng, thêm địa điểm và khả năng cho những địa điểm đó.

[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

  if (error != nil) {
    NSLog(@"Current Place error %@", [error localizedDescription]);
    return;
  }
  NSMutableString *strPlaces = [NSMutableString stringWithString:@""];

  for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods) {
    GMSPlace* place = likelihood.place;
    NSLog(@"Current Place name %@ at likelihood %g", place.name,
            likelihood.likelihood);
    NSLog(@"Current Place address %@", place.formattedAddress);
    NSLog(@"Current Place attributions %@", place.attributions);
    NSLog(@"Current PlaceID %@", place.placeID);
    [strPlaces appendString:place.name];
    [strPlaces appendString:@" "];
    [strPlaces appendFormat:@"%g",likelihood.likelihood];
    [strPlaces appendString:@"\n"];
  }
  self.lblPlaces.text = strPlaces;
}];

Khi bạn hoàn tất, hàm didUpdateLocations sẽ có dạng như sau:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    
    self.location = locations.lastObject;
    self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];
    self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];
    self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];
    
    NSLog(@"%@", self.location.description);
    
    [self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

        if (error != nil) {
            NSLog(@"Current Place error %@", [error localizedDescription]);
            return;
        }
        NSMutableString *strPlaces = [NSMutableString stringWithString:@""];
        
        for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods)  
        {
            GMSPlace* place = likelihood.place;
            NSLog(@"Current Place name %@ at likelihood %g", place.name, likelihood.likelihood);
            NSLog(@"Current Place address %@", place.formattedAddress);
            NSLog(@"Current Place attributions %@", place.attributions);
            NSLog(@"Current PlaceID %@", place.placeID);
            [strPlaces appendString:place.name];
            [strPlaces appendString:@" "];
            [strPlaces appendFormat:@"%g",likelihood.likelihood];
            [strPlaces appendString:@"\n"];
        }
        self.lblPlaces.text = strPlaces;
    }];
}

Giờ bạn đã sẵn sàng chạy ứng dụng và kiểm thử ứng dụng!

11. Chạy ứng dụng trong trình mô phỏng

Bạn chạy ứng dụng bằng nút chạy trên thanh tiêu đề. Thao tác này cũng cho phép bạn chọn loại lượt chạy và như bạn thấy ở đây, tôi đang kiểm thử trên iPhone 6 bằng trình mô phỏng.

bbbe0b8820c8a913.png

Khi bạn nhấn nút chạy, ứng dụng sẽ tạo và khởi chạy. Bạn sẽ thấy yêu cầu cho phép ứng dụng truy cập vào thông tin vị trí, bao gồm cả chuỗi tuỳ chỉnh mà bạn đã chỉ định trước đó.

b9bb2ace7e68f186.png

Sau khi thực hiện, bạn sẽ thấy thông tin về Vĩ độ và Kinh độ được cập nhật. Để thay đổi vị trí, hãy chọn trình đơn Gỡ lỗi rồi chọn một vị trí. Ví dụ: bạn có thể chọn "Lái xe trên đường cao tốc"

dcb1ce091d780f56.png

Khi làm như vậy, bạn sẽ thấy vị trí cùng những địa điểm có khả năng xuất hiện, mô phỏng việc lái xe trên đường cao tốc.

649e3eeb2321ae03.png

Chỉ vậy thôi! Bạn đã truy cập thành công thông tin chi tiết về địa điểm hiện tại bằng Google Places API trên iOS.