הגדרת פרויקט ב-Xcode

אחרי שתפעילו את החיוב ותצרו מפתח API, תוכלו להגדיר את פרויקט ה-Xcode שבו אתם משתמשים כדי לפתח את האפליקציה.

נתוני הגרסה זמינים לכל גרסה.

שלב 1: מתקינים את התוכנה הנדרשת

כדי לבנות פרויקט באמצעות Places SDK ל-iOS, צריך:

  • Xcode גרסה 15.0 ואילך

שלב 2: יצירת פרויקט Xcode והתקנה של Places SDK ל-iOS

מנהל חבילות SWIFT

ניתן להתקין את Places SDK ל-iOS דרך Swift Package Manager. כדי להוסיף את ה-SDK, צריך לוודא שהסרתם את כל יחסי התלות הקיימים של Places SDK ל-iOS.

כדי להוסיף את ה-SDK לפרויקט חדש או קיים:

  1. פותחים את ה-Xcode project או workspace ועוברים אל 'קובץ' > 'הוספת יחסי תלות של חבילה'.
  2. מזינים את הכתובת https://github.com/googlemaps/ios-places-sdk בתור כתובת ה-URL, מקישים על Enter כדי למשוך את החבילה ולוחצים על 'הוספת חבילה'.
  3. כדי להתקין version ספציפי, צריך להגדיר את השדה כלל תלות לאחת מהאפשרויות שמבוססות על גרסה. בפרויקטים חדשים, מומלץ לציין את הגרסה האחרונה ולהשתמש באפשרות 'גרסה מדויקת'. בסיום, לוחצים על 'הוספת חבילה'.
  4. בחלון Choose Package Products, מוודאים שהערך של GooglePlaces יתווסף ליעד main שציינתם. בסיום, לוחצים על 'הוספת חבילה'.
  5. כדי לבדוק את ההתקנה, צריך לעבור לחלונית General של היעד. ב-Frameworks, ספריות ותוכן מוטמע אתם אמורים לראות את החבילות המותקנות. אפשר גם לעיין בקטע 'יחסי תלות של חבילה' בדף 'Project Navigator' כדי לאמת את החבילה ואת הגרסה שלה.

כדי לעדכן את package בפרויקט קיים:

  1. אם משדרגים מגרסה קודמת מ-9.0.0, צריך להסיר את יחסי התלות הבאים: GoogleMapsBase, GoogleMapsCore ו-GoogleMapsM4B לאחר השדרוג. אין להסיר את התלות של GoogleMaps. למידע נוסף, ראו את נתוני הגרסה של גרסה 9.0.0.

    בהגדרות האישיות של פרויקט Xcode, מחפשים את Frameworks, ספריות ותוכן מוטמע. משתמשים בסימן המינוס(-) כדי להסיר את המסגרת הבאה:

    • GoogleMapsBase (רק לשדרוגים מגרסאות מוקדמות יותר מ-9.0.0)
    • GoogleMapsCore (רק לשדרוגים מגרסאות מוקדמות יותר מ-9.0.0)
    • GoogleMapsM4B (רק לשדרוגים מגרסאות מוקדמות יותר מ-9.0.0)
  2. מ-Xcode, עוברים אל 'קובץ' > 'חבילות' > 'עדכון לגרסאות האחרונות של החבילה'.
  3. כדי לאמת את ההתקנה, עוברים לקטע Package Dependencies של Project Navigator כדי לאמת את החבילה ואת הגרסה שלה.

כדי להסיר יחסי תלות קיימים של Places SDK ל-iOS שנוספו באמצעות CocoaPods, יש לבצע את השלבים הבאים:

  1. סוגרים את סביבת העבודה של Xcode. פותחים את הטרמינל ומריצים את הפקודה הבאה:
    sudo gem install cocoapods-deintegrate cocoapods-clean 
    pod deintegrate 
    pod cache clean --all
  2. מסירים את Podfile, Podfile.resolved ואת ה-Xcode workspace אם אתם לא משתמשים בהם לכל מטרה אחרת מלבד CocoaPods.

כדי להסיר SDK קיים של Places SDK ל-iOS שהותקנו באופן ידני, מבצעים את השלבים הבאים:
  1. בהגדרות האישיות של פרויקט Xcode, מחפשים את Frameworks, ספריות ותוכן מוטמע. משתמשים בסימן המינוס(-) כדי להסיר את המסגרת הבאה:
    • GooglePlaces.xcframework
  2. מהספרייה ברמה העליונה של פרויקט Xcode, מסירים את החבילה GooglePlaces.

CocoaPods

Places SDK ל-iOS זמין כרצף של CocoaPod, GooglePlaces, שמכיל את כל יכולות המקומות.

CocoaPods הוא מנהל יחסי תלות בקוד פתוח לפרויקטים של Swift ו-Objective-C Cocoa. אם עדיין לא התקנתם את הכלי CocoaPods, תוכלו להתקין אותו ב-macOS על ידי הרצת הפקודה הבאה מהטרמינל. לפרטים נוספים, אפשר לעיין במדריך לתחילת העבודה של CocoaPods.

sudo gem install cocoapods

יוצרים Podfile ל-Places SDK ל-iOS ומשתמשים בו כדי להתקין את ה-SDK ואת יחסי התלות שלו:

  1. אם עדיין לא יצרת פרויקט Xcode, עליך ליצור פרויקט עכשיו ולשמור אותו במחשב המקומי. אם אתם רק מתחילים להשתמש בפיתוח ל-iOS, יוצרים פרויקט חדש ובוחרים את iOS App template.
  2. יוצרים קובץ בשם Podfile בספריית הפרויקט. הקובץ הזה מגדיר את יחסי התלות של הפרויקט.
  3. עורכים את Podfile ומוסיפים את יחסי התלות ואת הגרסאות שלהם. זוהי דוגמה שמציינת את שם היעד של האפליקציה ואת שם ה-pod GooglePlaces:
    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '15.0'
    
    target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
      pod 'GooglePlaces', '8.3.0'
    end
    
    חשוב להקפיד להריץ את pod outdated באופן קבוע כדי לזהות אם יש גרסה חדשה יותר, כדי לוודא שתמיד מריצים את הגרסה העדכנית ביותר.
  4. שומרים את Podfile.
  5. פותחים טרמינל ונכנסים לספרייה שמכילה את Podfile:

    cd <path-to-project>
  6. מריצים את הפקודה pod install. הפעולה הזו תתקין את ממשקי ה-API שצוינו ב-Podfile, יחד עם כל יחסי התלות שעשויים להיות להם.

    pod install
  7. סוגרים את Xcode ואז פותחים (לחיצה כפולה) את קובץ .xcworkspace של הפרויקט כדי להפעיל את Xcode. מהשלב הזה ואילך, צריך להשתמש בקובץ .xcworkspace כדי לפתוח את הפרויקט.

כדי לעדכן את ה-API לפרויקט קיים:

  1. פותחים טרמינל ונכנסים לספריית הפרויקט שמכילה את Podfile.
  2. מריצים את הפקודה pod update. הפעולה הזו תעדכן את כל ממשקי ה-API שצוינו ב-Podfile לגרסה האחרונה.

התקנה ידנית

במדריך הזה מוסבר איך להוסיף באופן ידני את ה-XCFramework שמכיל את Places SDK ל-iOS אל הפרויקט, ולקבוע את הגדרות ה-build ב-Xcode. XCFramework היא חבילה בינארית שאפשר להשתמש בה במספר פלטפורמות, כולל מכונות שמשתמשות ב-Apple silicon.

  1. מורידים את קובצי ה-SDK הבינאריים ואת הקבצים הבאים של משאבים:
  2. מחלצים את הקבצים כדי לגשת ל-XCFramework ולמשאבים.
  3. מפעילים את Xcode ופותחים פרויקט קיים או יוצרים פרויקט חדש. אם אתם רק מתחילים להשתמש בפיתוח ל-iOS, יוצרים פרויקט חדש ובוחרים את iOS App template.
  4. צריך להסיר מהפרויקט את כל החבילות של מפות Google מגרסאות קודמות.
  5. פותחים את הכרטיסייה 'כללי'. גוררים את ה-XCFramework הבא לפרויקט בקטע Frameworks, ספריות ותוכן מוטמע. הקפידו לבחור באפשרות Do Not Embed (ללא הטמעה):
    • GooglePlaces.xcframework
  6. גוררים את GooglePlaces.bundle מ-GooglePlacesResources שהורדתם
  7. מעתיקים את GooglePlaces.bundle מהקובץ GooglePlacesResources שהורדתם לספרייה ברמה העליונה של פרויקט ה-Xcode. כשמופיעה ההנחיה, חשוב לבחור באפשרות העתקת פריטים לתיקייה של קבוצת היעד.
  8. בוחרים את הפרויקט מ-Project Navigator ובוחרים את יעד האפליקציה.
  9. פותחים את הכרטיסייה שלבי הבנייה. בתוך Link Binary with Libraries, מוסיפים את ה-frameworks והספריות הבאות:
    • CoreGraphics.framework
    • CoreLocation.framework
    • libc++.tbd
    • libz.tbd
    • QuartzCore.framework
    • UIKit.framework
  10. בוחרים את הפרויקט ולא יעד ספציפי ופותחים את הכרטיסייה Build Settings. בקטע Linking - General -> Other Linker Banners (קישור - כללי -> אחרים) מוסיפים את -ObjC ל-Debug ול-Release (שחרור). אם ההגדרות האלה לא מופיעות, משנים את המסנן בסרגל Build Settings (הגדרות Build) מ-Basic ל-All.

GooglePlacesSwift

ניתן להתקין את ה-SDK של GooglePlacesSwift (תצוגה מקדימה) באמצעות Swift Package Manager, CocoaPods ובאופן ידני. שלבי ההתקנה בכל התהליכים תואמים את השלבים שמתוארים עבור Places SDK ל-iOS, עם ההבדלים הבאים:

לדוגמה, אם משתמשים ב-CocoaPods, הערך של Podfile הערוך ייראה כך:

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '15.3'

target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
  pod 'GooglePlacesSwift', '0.1.0'
end

שלב 3: בודקים את קובץ מניפסט הפרטיות של Apple

Apple דורשת פרטים לגבי הפרטיות של אפליקציות ב-App Store. עדכונים ומידע נוסף זמינים בדף פרטי הפרטיות של Apple App Store.

קובץ מניפסט הפרטיות של Apple כלול בחבילת המשאבים של ה-SDK. כדי לוודא שקובץ מניפסט הפרטיות נכלל וכדי לבדוק את התוכן שלו, יש ליצור ארכיון של האפליקציה ולהפיק דוח פרטיות מהארכיון.

שלב 4: מוסיפים את מפתח ה-API לאפליקציה

בדוגמאות הבאות, מחליפים את YOUR_API_KEY במפתח ה-API שלכם.

Swift

מוסיפים את מפתח ה-API ל-AppDelegate.swift באופן הבא:

  • מוסיפים את הצהרת הייבוא הבאה:
    import GooglePlaces
  • מוסיפים את הערך הבא ל-method application(_:didFinishLaunchingWithOptions:), ומחליפים את YOUR_API_KEY במפתח ה-API:
    GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

Objective-C

מוסיפים את מפתח ה-API ל-AppDelegate.m באופן הבא:

  • מוסיפים את הצהרת הייבוא הבאה:
    @import GooglePlaces;
  • מוסיפים את הערך הבא ל-method application:didFinishLaunchingWithOptions:, ומחליפים את YOUR_API_KEY במפתח ה-API:
    [GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];

GooglePlacesSwift

מוסיפים את מפתח ה-API ל-AppDelegate.swift באופן הבא:

  • מוסיפים את הצהרת הייבוא הבאה:
    import GooglePlacesSwift
  • מוסיפים את הערך הבא ל-method application(_:didFinishLaunchingWithOptions:), ומחליפים את YOUR_API_KEY במפתח ה-API:
    PlacesClient.shared.provideAPIKey("YOUR_API_KEY")

שלב 5: מתחילים לכתוב קוד

דוגמאות הקוד הבאות ממחישות איך למצוא את המקום הנוכחי.

Swift

  import GooglePlaces
  import UIKit

  class GetStartedViewController : UIViewController {

    // Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
    @IBOutlet private var nameLabel: UILabel!
    @IBOutlet private var addressLabel: UILabel!

    private var placesClient: GMSPlacesClient!

    override func viewDidLoad() {
      super.viewDidLoad()
      placesClient = GMSPlacesClient.shared()
    }

    // Add a UIButton in Interface Builder, and connect the action to this function.
    @IBAction func getCurrentPlace(_ sender: UIButton) {
      let placeFields: GMSPlaceField = [.name, .formattedAddress]
      placesClient.findPlaceLikelihoodsFromCurrentLocation(withPlaceFields: placeFields) { [weak self] (placeLikelihoods, error) in
        guard let strongSelf = self else {
          return
        }

        guard error == nil else {
          print("Current place error: \(error?.localizedDescription ?? "")")
          return
        }

        guard let place = placeLikelihoods?.first?.place else {
          strongSelf.nameLabel.text = "No current place"
          strongSelf.addressLabel.text = ""
          return
        }

        strongSelf.nameLabel.text = place.name
        strongSelf.addressLabel.text = place.formattedAddress
      }
    }
  }

  

Objective-C

  #import "GetStartedViewController.h"
  @import GooglePlaces;

  @interface GetStartedViewController ()
  // Add a pair of UILabels in Interface Builder and connect the outlets to these variables
  @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
  @property (weak, nonatomic) IBOutlet UILabel *addressLabel;
  @end

  @implementation GetStartedViewController {
    GMSPlacesClient *_placesClient;
  }

  - (void)viewDidLoad {
    [super viewDidLoad];
    _placesClient = [GMSPlacesClient sharedClient];
  }

  // Add a pair of UILabels in Interface Builder and connect the outlets to these variables.
  - (IBAction)getCurrentPlace:(UIButton *)sender {
    GMSPlaceField placeFields = (GMSPlaceFieldName | GMSPlaceFieldFormattedAddress);

    __weak typeof(self) weakSelf = self;
    [_placesClient findPlaceLikelihoodsFromCurrentLocationWithPlaceFields:placeFields callback:^(NSArray<GMSPlaceLikelihood *> * _Nullable likelihoods, NSError * _Nullable error) {
      __typeof__(self) strongSelf = weakSelf;
      if (strongSelf == nil) {
        return;
      }

      if (error != nil) {
        NSLog(@"An error occurred %@", [error localizedDescription]);
        return;
      }

      GMSPlace *place = likelihoods.firstObject.place;
      if (place == nil) {
        strongSelf.nameLabel.text = @"No current place";
        strongSelf.addressLabel.text = @"";
        return;
      }

      strongSelf.nameLabel.text = place.name;
      strongSelf.addressLabel.text = place.formattedAddress;
    }];
  }

  @end
  

GooglePlacesSwift

  struct ContentView: View {
    @State var place: Place?

    var body: some View {
      Button("Get Place") {
        // A hotel in Saigon with an attribution.
        let placeID = "ChIJV4k8_9UodTERU5KXbkYpSYs"
        let fetchPlaceRequest = FetchPlaceRequest(
          placeID: placeID,
          placeProperties: [.displayName, .formattedAddress]
        )
        Task {
          switch await placesClient.fetchPlace(with: fetchPlaceRequest) {
          case .success(let place):
            self.place = place
          case .failure(let placesError):
            // Handle error
        }
      Text(swiftPlace?.displayName ?? "No place yet")
        .padding()
      Text(swiftPlace?.formattedAddress ?? "No place yet")
        .padding()
    }
  }
  

השלבים הבאים

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