شروع کار با Places SDK برای iOS (Objective-C)

1. قبل از شروع

قبل از شروع کدنویسی، چند پیش نیاز وجود دارد که باید آنها را تنظیم کنید.

Xcode

این آموزش از ابزار Xcode اپل به همراه زبان Objective-C برای ایجاد یک برنامه ساده iOS که در یک شبیه ساز اجرا می شود، استفاده می کند. شما نیازی به دستگاه فیزیکی ندارید. می توانید Xcode را در https://developer.apple.com/xcode/ دریافت کنید

CocoaPods

Places SDK برای iOS به عنوان یک CocoaPods در دسترس است. CocoaPods یک ابزار مدیریت وابستگی منبع باز برای پروژه های Swift و Objective-C است. اگر قبلاً این ابزار را ندارید، قبل از ادامه کار باید آن را نصب کنید. می توان آن را از ترمینال به صورت زیر نصب کرد:

sudo gem install cocoapods

برای جزئیات بیشتر در مورد CocoaPods، راهنمای شروع به کار CocoaPods را ببینید.

نصب SDK

برای نصب SDK باید یک Podfile در فهرست پروژه خود ایجاد کنید که CocoaPods از آن برای دانلود و پیکربندی وابستگی های مورد نیاز استفاده می کند. ساده ترین راه برای انجام این کار این است که یک پروژه جدید در Xcode ایجاد کنید، یک Podfile به آن اضافه کنید و پادها را در آنجا نصب کنید.

Xcode را باز کنید و صفحه "Welcome to Xcode" را خواهید دید. در اینجا، "ایجاد یک پروژه Xcode جدید" را انتخاب کنید

4f1ecee473937c7b.png

در صفحه بعدی از شما یک الگو برای پروژه جدیدتان خواسته می شود. "برنامه مشاهده تک" را برای iOS انتخاب کنید و "بعدی" را فشار دهید

وقتی نام محصول از شما خواسته می‌شود، می‌توانید هر چیزی را که دوست دارید انتخاب کنید، اما حتماً شناسه بسته‌ای را که برای شما ایجاد می‌شود، یادداشت کنید. بعداً به آن نیاز خواهید داشت.

72fbf25cb2db22ad.png

"بعدی" را فشار دهید و پروژه برای شما ایجاد می شود. دایرکتوری که در آن ایجاد شده است را یادداشت کنید. Xcode را ببندید و با استفاده از ترمینال به آن دایرکتوری بروید.

با استفاده از ترمینال دستور زیر را وارد کنید:

pod init

فایلی به نام Podfile برای شما ساخته خواهد شد. آن را ویرایش کنید تا یک pod برای GoogleMaps مانند این اضافه کنید:

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

آن را ذخیره کنید و Xcode را ببندید. حتما آن را ببندید، زیرا در مرحله بعدی قرار است پروژه زیربنایی را ویرایش کنید. پس از اتمام کار، فایل پروژه دیگری را باز می‌کنید، و بسیار معمول است که یک توسعه‌دهنده در صورتی که قبلا Xcode را نبسته باشد، گیج می‌شود که همه چیز کجاست! اکنون، در یک ترمینال، به دایرکتوری پروژه خود بروید و "pod install" را به صورت زیر اجرا کنید:

789c5bc62817f68a.png

پس از اتمام کار، پادها نصب می شوند و یک فایل xcworkspace. جدید ایجاد می شود. از این به بعد برای پروژه استفاده کنید. اما، قبل از کدنویسی، چیزی که نیاز دارید یک کلید API است.

2. کلید API خود را دریافت کنید

برای مرحله فعال سازی زیر، Maps SDK برای iOS را فعال کنید.

پلتفرم نقشه های گوگل را راه اندازی کنید

اگر قبلاً حساب Google Cloud Platform و پروژه‌ای با صورت‌حساب فعال ندارید، لطفاً راهنمای شروع به کار با Google Maps Platform را برای ایجاد یک حساب صورت‌حساب و یک پروژه ببینید.

  1. در Cloud Console ، روی منوی کشویی پروژه کلیک کنید و پروژه ای را که می خواهید برای این کد لبه استفاده کنید انتخاب کنید.

  1. APIها و SDKهای پلتفرم Google Maps مورد نیاز برای این لبه کد را در Google Cloud Marketplace فعال کنید. برای انجام این کار، مراحل این ویدئو یا این مستند را دنبال کنید.
  2. یک کلید API در صفحه Credentials در Cloud Console ایجاد کنید. می توانید مراحل این ویدئو یا این مستند را دنبال کنید. همه درخواست‌ها به پلتفرم نقشه‌های Google به یک کلید API نیاز دارند.

3. ایجاد برنامه Places API

اکنون که یک پروژه کنسول ایجاد کرده‌اید، و Places API را روی آن فعال کرده‌اید و یک کلید API دریافت کرده‌اید، آماده شروع کدنویسی اولین برنامه Places API خود هستید.

قبل از اینکه فایل‌های پاد را نصب کردید، یک فایل xcworkspace. جدید برای شما ایجاد شد. این را با دوبار کلیک کردن روی آن باز کنید.

19d62f34c08e645c.png

در Project Explorer خود متوجه خواهید شد که اکنون یک پوشه جدید به نام "Pods" دارید. اگر این کار با موفقیت انجام شد، یک پوشه GoogleMaps را در آنجا خواهید دید که حاوی چارچوب‌ها است.

8844d861f64c61aa.png

4. فایل Info.plist را ویرایش کنید.

هنگامی که برای اولین بار برنامه را اجرا می کنید، iOS یک دیالوگ به شما می دهد که از کاربر می خواهد اجازه دسترسی به خدمات مکان را بدهد. این دیالوگ رشته ای را که شما تعریف کرده اید می دهد و آن را در فایل Info.plist قرار می دهید. اگر این رشته وجود نداشته باشد، گفتگو نمایش داده نمی شود و برنامه شما کار نمی کند.

می‌توانید فایل Info.plist را در اکسپلورر پروژه در اینجا بیابید:

c224c920ab3f1ef.png

آن را انتخاب کنید و ویرایشگر plist را خواهید دید.

859ca56f3b19da5.png

ماوس را روی هر یک از عناصر قرار دهید، می بینید که نماد "+" ظاهر می شود. آن را فشار دهید، می بینید که یک ورودی جدید ظاهر می شود. مقدار "NSLocationAlwaysUsageDescription" را در این کادر وارد کنید.

9fb225d6f5508794.png

برای افزودن کلید جدید، Enter را فشار دهید. سپس روی ستون Value برای این کلید دوبار کلیک کنید و یک رشته اضافه کنید:

5aefeb184187aa58.png

برای کسب اطلاعات بیشتر در مورد این رشته، مستندات توسعه دهنده اپل را اینجا ببینید .

5. App Delegate خود را ویرایش کنید

در کاوشگر پروژه، AppDelegate.m را پیدا کرده و باز کنید. از این برای افزودن کلید API خود استفاده خواهید کرد.

در بالای فایل، این را بلافاصله زیر خط #import اضافه کنید:

@import GoogleMaps;

سپس، در تابع didFinishLaunchingWithOptions: موارد زیر را دقیقاً در مورد خط "بازگشت بله" اضافه کنید:

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

مطمئن شوید که از کلید API که قبلا تولید کرده اید استفاده کنید.

6. فایل Storyboard خود را ویرایش کنید

در کاوشگر پروژه، فایل Main.storyboard را باز کنید. با فشار دادن دکمه نوار کناری در گوشه سمت راست بالا، مطمئن شوید که نوار کناری فعال است.

352af28b970d9e2.png

سپس، در پایین نوار کناری، با اطمینان از انتخاب Object Library، Label Control را پیدا کنید.

adec7051ae949531.png

در View Controller Scene در سمت چپ، مطمئن شوید که "View" انتخاب شده است:

e4827b92b5861e3e.png

سپس 7 برچسب را روی نما بکشید و رها کنید. آنها را همانطور که در اینجا نشان داده شده است مرتب کنید. مطمئن شوید که اندازه آنها را بکشید تا با آنچه نشان داده شده مطابقت داشته باشد. با دوبار کلیک کردن روی آن و تایپ مقدار مورد نیاز، می توانید متن موجود در برچسب را ویرایش کنید:

f8a9457772358069.png

برای پایین ترین برچسب (البته بزرگ)، به ویرایشگر خواص بروید و اطمینان حاصل کنید که 0 خط تنظیم شده است (پیش فرض 1 است). این به آن امکان می دهد چندین خط را ارائه دهد.

a4abacf00d8888fe.png

7. خروجی هایی برای ارزش ها ایجاد کنید

برای 3 برچسب "ارزش"، باید یک خروجی ایجاد کنید. این به شما این امکان را می دهد که مقادیر آنها را با استفاده از کد تغییر دهید. برای انجام این کار، ابتدا باید دستیار ویرایشگر را فعال کنید. برای این کار ابتدا نوار کناری خواص را با کلیک بر روی دکمه آن ببندید تا حذف شود. (این دکمه در مرحله قبل نشان داده شد)

سپس، دکمه دستیار را انتخاب کنید - این دایره دوتایی است که در اینجا نشان داده شده است:

e92dcc4ceea20a51.png

مطمئن شوید که فایل ViewController.h را رندر می کند. اگر نه، می‌توانید آن را با استفاده از ویرایشگر بالای پنجره دستیار تغییر دهید:

d42f0fcc18b84703.png

سپس، هنگامی که کلید CONTROL را نگه دارید، هر برچسب را بکشید و آن را زیر خط @interface در فایل ViewController.h در دستیار بیندازید. یک گفتگو ظاهر می شود که از شما می پرسد چه نوع اتصالی را می خواهید ایجاد کنید:

a44b7888ed0f62b.png

اطمینان حاصل کنید که تنظیمات مطابق شکل است (اتصال: خروجی، نوع: UIlabel، ذخیره سازی: ضعیف)، و سپس نامی برای هر کدام بگذارید. برای اهداف این آزمایشگاه کد، من برچسب های طول، عرض و ارتفاع را به ترتیب lblLongitude، lblLatitude و lblAltidude نامیدم. همچنین برچسب بزرگ را از پایین به سمت بالا بکشید و آن را lblPlaces بنامید.

وقتی کارتان تمام شد، فایل ViewController.h شما باید به شکل زیر باشد:

#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. فایل هدر را برای مکان و APIهای سرویس گیرنده Google ویرایش کنید

قبل از مراحل نهایی – جایی که برنامه را می‌سازید تا از API مکان‌هایی استفاده کنید که برای تنظیم چند متغیر دیگر در فایل هدر (ViewController.h) نیاز دارید. اینها Core Location Manager و یک شی Core Location هستند:

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

همچنین به Google API Client نیاز دارید:

@property GMSPlacesClient *placesClient;

در نهایت، باید فایل هدر را به‌روزرسانی کنید تا کلاس CLLocationManagerDelegate را پیاده‌سازی کند:

@interface ViewController : UIViewController<CLLocationManagerDelegate>

وقتی کارتان تمام شد، فایل هدر شما باید به این شکل باشد:

#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. View Controller خود را ویرایش کنید

اولین قدم این است که تابع viewDidLoad را ویرایش کنید تا موقعیت مکانی را مقداردهی اولیه کند، مجوز کاربر را برای دسترسی به موقعیت مکانی درخواست کنید و در نهایت مدیر مکان را راه اندازی کنید تا مکان فعلی را ردیابی کند. همچنین سرویس گیرنده 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. به روز رسانی مکان را مدیریت کنید

مدیر مکان با فراخوانی تابع didUpdateLocations، با به‌روزرسانی‌های مکان به View Controller شما تماس می‌گیرد. شما باید این را به ViewController.m خود اضافه کنید. تابع به شکل زیر است:

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

این تابع باید چندین کار را انجام دهد.

ابتدا مکان را با آخرین مورد دریافتی کش می کند:

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];

سپس با استفاده از مکان‌های Client با Places API تماس می‌گیرید. شما این کار را با مشخص کردن تابع callback انجام می دهید، که لیست احتمالات مکان را دریافت می کند. Places API احتمال حضور شما در یک مکان خاص را بر اساس موقعیت مکانی شما تعیین می کند. نام مکان‌های احتمالی را به همراه مقداری بین 0 و 1 برمی‌گرداند که احتمال اینکه شما در آن مکان هستید را در بر می‌گیرد.

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

سپس می توانید callback را پیاده سازی کنید. این مورد در لیست احتمالات تکرار می شود، مکان ها و احتمالات برای آن مکان ها اضافه می شود.

[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;
}];

وقتی کارتان تمام شد، تابع didUpdateLocations شما باید به شکل زیر باشد:

-(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;
    }];
}

اکنون آماده اجرای برنامه خود و آزمایش آن هستید!

11. اجرای برنامه در شبیه ساز

شما برنامه را با استفاده از دکمه اجرا در نوار عنوان اجرا می کنید. این همچنین به شما امکان می‌دهد نوع اجرا را انتخاب کنید، و همانطور که در اینجا مشاهده می‌کنید، با استفاده از شبیه‌ساز در حال تست کردن بر روی آیفون 6 هستم.

bbbe0b8820c8a913.png

وقتی دکمه run را فشار دهید، برنامه ساخته و راه اندازی می شود. درخواست اجازه دسترسی برنامه را به مکان، از جمله رشته سفارشی که قبلاً مشخص کرده‌اید، خواهید دید.

b9bb2ace7e68f186.png

پس از انجام این کار، به‌روزرسانی طول و عرض جغرافیایی خود را خواهید دید. برای تغییر مکان، منوی Debug را انتخاب کرده و یک مکان را انتخاب کنید. برای مثال، می‌توانید «درایو آزادراه» را انتخاب کنید

dcb1ce091d780f56.png

وقتی این کار را انجام می‌دهید، موقعیت مکانی را می‌بینید که مکان‌های احتمالی آن به‌روزرسانی می‌شوند و رانندگی بزرگراه را شبیه‌سازی می‌کنند.

649e3eeb2321ae03.png

و بس! با استفاده از Google Places API در iOS با موفقیت به جزئیات مکان فعلی دسترسی پیدا کردید.