תחילת העבודה עם SDK של מקומות ל-iOS (Objective-C)

1. לפני שמתחילים

לפני שמתחילים לקודד, יש מספר דרישות מוקדמות שצריך להגדיר.

Xcode

מדריך זה משתמש בכלי Xcode של Apple, יחד עם השפה של Target-C כדי ליצור אפליקציית iOS פשוטה שמופעלת באמולטור. אין צורך במכשיר פיזי. ניתן לקבל Xcode בכתובת https://developer.apple.com/xcode/

כיסויי קקאו

ה-SDK של 'מקומות' ל-iOS זמין כ-CocoaPods. CocoaPods הוא כלי לניהול תלות בקוד פתוח לפרויקטים של Swift ו-Object-C. אם הכלי הזה עדיין לא מותקן במכשיר שלך, יהיה עליך להתקין אותו לפני שתהיה לך אפשרות להמשיך. ניתן להתקין אותו מהמסוף כך:

sudo gem install cocoapods

מידע נוסף על CocoaPods זמין במדריך של CocoaPods לתחילת העבודה.

התקנת ה-SDK

כדי להתקין את ה-SDK, עליך ליצור Podfile בספריית הפרויקט שלך שבו ישתמש ב-CocoaPods כדי להוריד ולהגדיר את התלות הנדרשות. הדרך הקלה ביותר לעשות זאת היא ליצור פרויקט חדש ב-Xcode, להוסיף אליו קובץ Pod ולהתקין את ה-Pods שם.

פותחים את Xcode ואתם רואים את המסך 'Welcome to Xcode' . כאן בוחרים באפשרות ‘יצירת פרויקט Xcode חדש'

4f1ecee473937c7b.png

במסך הבא תופיע בקשה בתבנית חדשה. בחר באפשרות ‘אפליקציה אחת לתצוגה’' עבור iOS, ולחץ על 'הבא'

כשתתבקשו להזין את שם המוצר, תוכלו לבחור כל מה שתרצו, אבל חשוב לזכור את מזהה החבילה שנוצר עבורכם. יהיה עליך זאת מאוחר יותר.

72fbf25cb2db22ad.png

לוחצים על ‘Next&#39’, והפרויקט ייווצר עבורך. כדאי לרשום את הספרייה שבה היא נוצרה. סוגרים את Xcode ומשתמשים ב-Terminal, מנווטים לספרייה הזו.

באמצעות Terminal, מזינים את הפקודה הבאה:

pod init

המערכת תיצור עבורך קובץ בשם Podfile. אפשר לערוך אותו כדי להוסיף רצף של מפות Google כך:

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

שומרים אותו וסוגרים את Xcode. חשוב לסגור אותו, כי בשלב הבא אתם עורכים את הפרויקט הבסיסי. תיפתח קובץ פרויקט אחר אחרי שהתהליך יסתיים, ובמקרים רבים מפתחי אפליקציות עלולים להתבלבל ולא ברור אם הם סגרו את Xcode! עכשיו, במסוף, עוברים לספריית הפרויקט ומפעילים את 'podinstall&#39'. כך עושים את זה:

789c5bc62817f68a.png

בסיום, ה-Pods יותקנו וייווצר קובץ .xcworkspace חדש. אפשר להשתמש באפשרות הזו מעכשיו והלאה. אבל, לפני תכנות, הדבר הבא הנדרש הוא מפתח API.

2. קבלת מפתח ה-API

בשלב הבא של ההפעלה, מפעילים את SDK של מפות Google ל-iOS.

הגדרת מפות Google

אם עדיין אין לכם חשבון Google Cloud Platform ופרויקט שבו מופעל חיוב, כדאי לעיין במדריך תחילת העבודה עם הפלטפורמה של מפות Google ליצירת חשבון לחיוב ופרויקט.

  1. ב-Cloud Console, לוחצים על התפריט הנפתח של הפרויקט ובוחרים את הפרויקט שבו רוצים להשתמש ב-Codelab הזה.

  1. מפעילים את ממשקי ה-API ואת ערכות ה-SDK של מפות Google הנדרשים למעבדת קוד זו ב-Google Cloud Marketplace. כדי לעשות זאת, יש לבצע את השלבים המפורטים בסרטון הזה או בתיעוד הזה.
  2. יוצרים מפתח API בדף פרטי הכניסה ב-Cloud Console. ניתן לבצע את השלבים המפורטים בסרטון הזה או בתיעוד הזה. לכל הבקשות שנשלחות לפלטפורמה של מפות Google נדרש מפתח API.

3. יצירת האפליקציה של API של 'מקומות'

עכשיו, לאחר שיצרת פרויקט ב-Console, והפעלת בו את API API של Google Places, השגת מפתח API, אתה מוכן להתחיל לקודד את אפליקציית Places API הראשונה.

מוקדם יותר כשהתקנתם את קובצי ה-Pod, נוצר עבורכם קובץ .xcworkspace חדש. כדי לפתוח את הקובץ, לוחצים עליו לחיצה כפולה.

19d62f34c08e645c.png

ב-Project Explorer תופיע תיקייה חדשה, בשם Pods&#39. אם הפעולה בוצעה בהצלחה, תופיע בתיקייה 'מפות Google' המכיל את המסגרות.

8844d861f64c61aa.png

4. עורכים את קובץ ה-Info.plist.

בפעם הראשונה שתפעילו את האפליקציה, תוצג ב-iOS תיבת דו-שיח שבה המשתמש יתבקש לאשר את הגישה לשירותי המיקום. תיבת דו-שיח זו תספק מחרוזת שתגדירו, ותציבו אותה בקובץ Info.plist. אם מחרוזת זו לא קיימת, תיבת הדו-שיח לא תוצג והאפליקציה לא תפעל.

ניתן למצוא את הקובץ Info.plist בכלי המחקר של הפרויקט כאן:

c224c920ab3f1ef.png

יש לבחור בה, ואז יוצג לך העורך של הרשימה.

859ca56f3b19da5.png

מציבים את הסמן מעל הרכיב הרצוי, ואז יופיע הסמל '+&33;'. לחץ עליו, ואז תופיע רשומה חדשה. בתיבה זו, מזינים את הערך 'NSLocationOnlyUsageDescription'

9fb225d6f5508794.png

יש להקיש על Enter כדי להוסיף את המפתח החדש. לאחר מכן, לוחצים לחיצה כפולה על העמודה 'ערך' עבור המפתח הזה ומוסיפים מחרוזת:

5aefeb184187aa58.png

מידע נוסף על המחרוזת הזאת זמין בתיעוד של Apple למפתחים כאן.

5. עריכת משתמש עם גישה לאפליקציה

בסייר הפרויקטים, יש למצוא את אפליקציית AppDelegate.m ולפתוח אותה. הקוד הזה ישמש אותך כדי להוסיף את מפתח ה-API.

בחלק העליון של הקובץ, מוסיפים אותו מיד מתחת לשורת ה- #Import:

@import GoogleMaps;

לאחר מכן, בפונקציה doFinishLaunchingWithOption: מוסיפים את הערכים הבאים בערך בשורה 'return YES''

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

חשוב להשתמש במפתח ה-API שיצרתם לפני כן.

6. עריכת קובץ ה-Storyboard

בסייר הפרויקטים, פותחים את קובץ Central.storyboard. מוודאים שהסרגל הצדי פעיל על ידי לחיצה על לחצן סרגל הצד בפינה השמאלית העליונה.

352af28b970d9e2.png

לאחר מכן, בחלק התחתון של סרגל הצד, מחפשים את 'פקד התוויות' כדי לוודא שספריית האובייקטים נבחרה.

adec7051ae949531.png

בסצנה 'בקר תצוגה' שבצד ימין, ודא שהאפשרות 'הצג' נבחרה:

e4827b92b5861e3e.png

לאחר מכן גוררים ומשחררים 7 תוויות בתצוגה המפורטת. יש לארגן אותם כפי שמוצג כאן. חשוב להקפיד לגרור את הגדלים שלהם כדי להתאים לגודל שלהם. אפשר לערוך את הטקסט שבתווית על ידי לחיצה כפולה עליה והקלדה של הערך הנדרש:

f8a94577722550099.png

עבור התווית התחתונה ביותר (הגדולה ביותר), יש לעבור אל עורך הנכסים ולוודא שהוא מוגדר כ-0 שורות (ברירת המחדל היא 1). פעולה זו תאפשר לה לעבד שורות מרובות.

a4abacf00d8888fe.png

7. יצירת שקעים לערכים

עבור 3 התוויות של 'value&33', צריך ליצור שקע. כך תוכלו לשנות את הערכים שלהם באמצעות קוד. לשם כך, תחילה עליך להפעיל את העוזר הדיגיטלי. לשם כך, תחילה סוגרים את סרגל הצד של הנכסים בלחיצה על הלחצן שלו כדי להסיר אותו. (הלחצן הזה הוצג בשלב הקודם)

לאחר מכן בוחרים את לחצן העוזר הדיגיטלי – זה העיגול הכפול שמוצג כאן:

e92dcc4ceea20a51.png

מוודאים שהוא מעבד את קובץ ViewController.h. אם לא, אפשר לשנות אותה באמצעות העורך שבחלק העליון של חלון ה-Assistant.

d42f0fcc18b84703.png

לאחר מכן, כשלוחצים על מקש CONTROL, גוררים כל תווית ומשחררים אותה מתחת לשורה @interface בקובץ ViewView.h ב-Assistant. תופיע תיבת דו-שיח עם שאלה לגבי סוג החיבור שרוצים לבצע:

a44b7888ed0f62b.png

יש לוודא שההגדרות מוצגות (חיבור: שקע; סוג: UILabel; אחסון: חלש), ולאחר מכן לתת שם. למטרת קוד ה-codelab הזה, קראתי לתוויות LitLongitude, Latitude ו-lblAltidude ו-Latitude, Latitude ו-Latitude. בנוסף, יש לגרור את התווית הגדולה מתחתית המסך ולקרוא לה בשם 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 Client API

לפני השלבים האחרונים – שבהם צריך לבנות את האפליקציה כדי להשתמש ב-API של מקומות, עליכם להגדיר מספר משתנים נוספים בקובץ הכותרת (ViewController.h). אלו הם המנהלים של מיקום המיקום ואובייקט מיקום בסיסי:

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

יש צורך גם בלקוח Google API:

@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. עריכת השלט הרחוק לתצוגה

השלב הראשון הוא לערוך את הפונקציה viewDoneLoad כדי להפעיל את מנהל המיקום, לבקש מהמשתמש הרשאת גישה למיקום ולבסוף להפעיל את מנהל המיקום כך שיעקוב אחר המיקום הנוכחי. עליכם גם לאתחל את לקוח ה-API של 'מקומות Google'.

- (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. ניהול עדכוני מיקום

מנהל המיקום יחזור לבקר התצוגה כדי לעדכן את המיקום, על ידי קריאה לפונקציה doUpdateLocations. יהיה עליך להוסיף זאת ל-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];

בשלב הבא, תקרא ל-places API באמצעות לקוח המקומות. ניתן לעשות זאת על ידי ציון פונקציית הקריאה החוזרת, שתקבל את רשימת הסיכויים של מקומות. ה-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;
}];

לאחר שמסיימים, פונקציית doUpdateLocations אמורה להיראות כך:

-(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. הפעלת האפליקציה באמולטור

מריצים את האפליקציה באמצעות לחצן ההפעלה בסרגל הכותרת. כך גם אפשר לבחור את סוג ההפעלה, וכפי שאפשר לראות כאן בדיקות ב-iPhone 6 בעזרת האמולטור.

bbbe0b8820c8a913.png

כאשר לוחצים על לחצן ההפעלה, האפליקציה תיצור ותפעיל. תוצג לכם בקשה לאפשר לאפליקציה לגשת למיקום, כולל המחרוזת המותאמת אישית שציינתם קודם.

b9bb2ace7e68f186.png

לאחר מכן, יוצג קו הרוחב וקו האורך. כדי לשנות את המיקום, בוחרים בתפריט 'ניפוי באגים' ובוחרים מיקום. לדוגמה, אפשר לבחור באפשרות 'כביש מהיר''

dcb1ce091d780f56.png

פעולה זו תגרום להצגת המיקום עם עדכון סביר של המקומות שבו, והוא מדמה את הכביש המהיר.

649e3eeb2321ae03.png

זהו, סיימתם. ניגשת בהצלחה אל פרטי המקום הנוכחי באמצעות ממשק ה-API של 'מקומות Google' ב-iOS.