بدء استخدام حزمة تطوير البرامج (SDK) للأماكن لنظام التشغيل iOS (الهدف-ج)

1. قبل البدء

قبل أن تبدأ في الترميز، هناك بعض المتطلبات الأساسية التي ستكون بحاجة إلى إعدادها.

Xcode

يستخدم هذا البرنامج التعليمي أداة Xcode في Apple's، بالإضافة إلى لغة GOAL-C لإنشاء تطبيق iOS بسيط يتم تشغيله في المحاكي. ولست بحاجة إلى جهاز فعلي. يمكنك الحصول على Xcode من خلال https://developer.apple.com/xcode/

حبوب الكاكاو

تتوفّر حزمة تطوير البرامج (SDK) للأماكن التي تعمل بنظام التشغيل iOS على شكل لوحة CocoaPods. CocoaPods هي أداة مفتوحة المصدر لإدارة الاعتمادية على مشاريع Swift وGOAL-C. إذا لم تكن لديك هذه الأداة من قبل، ستحتاج إلى تثبيتها قبل المضي قدمًا. يمكن تثبيته من الوحدة الطرفية كما يلي:

sudo gem install cocoapods

لمزيد من التفاصيل حول CocoaPods، يُرجى الاطّلاع على دليل البدء في CocoaPods.

تثبيت حزمة تطوير البرامج (SDK)

لتثبيت حزمة تطوير البرامج (SDK)، يجب إنشاء ملف Podfile في دليل المشروع الذي ستستخدمه CocoaPods لتنزيل مكوّنات الاعتماد المطلوبة وإعدادها. أسهل طريقة لإجراء ذلك هي إنشاء مشروع جديد في Xcode وإضافة ملف Podfile إلى ذلك وتثبيت اللوحات هناك.

افتح Xcode وستظهر لك شاشة "مرحبًا بك في Xcode'. هنا، حدد "إنشاء مشروع Xcode جديد؛

4f1ecee473937c7b.png

في الشاشة التالية، ستتم مطالبتك بنموذج لمشروعك الجديد. حدّد "تطبيق العرض الواحد" بالنسبة إلى نظام التشغيل iOS، ثم اضغط على "التالي&#39؛

عندما يُطلب منك اسم المنتج، يمكنك اختيار أي شيء تريده، ولكن احرص على تدوين معرّف الحزمة الذي يتم إنشاؤه لك. ستحتاج إلى ذلك لاحقًا.

72fbf25cb2db22ad.png

اضغط على "التالي&#39؛ وسيتم إنشاء المشروع لك. دوِّن الدليل الذي تم إنشاؤه فيه. أغلِق Xcode واستخدِم Terminal، انتقِل إلى هذا الدليل.

أدخِل الأمر التالي باستخدام Terminal:

pod init

سيتم إنشاء ملف باسم Podfile لك. يمكنك تعديله لإضافة لوحة لـ "خرائط Google" على النحو التالي:

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

احفظه، ثم أغلِق Xcode. احرِص على إغلاقه، لأنّك في الخطوة التالية ستُعدِّل المشروع الأساسي. ستفتح ملف مشروع مختلفًا بعد أن يتم الانتهاء منه، وسيصبح من الصعب جدًا على مطوّر البرامج معرفة الموضع الذي حدث فيه إذا لم يتم إغلاق Xcode في السابق. الآن، في الوحدة الطرفية، انتقِل إلى دليل المشاريع وابدأ تشغيل "pod install' على النحو التالي:

789c5bc62817f68a.png

وبعد الانتهاء من ذلك، سيتم تثبيت اللوحات وإنشاء ملف .xcworkspace جديد. يمكنك استخدام هذا المشروع للمشروع من الآن فصاعدًا. ولكن قبل الترميز، عليك بعد ذلك استخدام مفتاح واجهة برمجة التطبيقات.

2. الحصول على مفتاح واجهة برمجة التطبيقات

بالنسبة إلى خطوة التفعيل التالية، فعِّل حزمة تطوير البرامج (SDK) لتطبيق "خرائط Google" لنظام التشغيل iOS.

إعداد "منصة خرائط Google"

إذا لم يكن لديك حساب على Google Cloud Platform ومشروع تم تفعيل الفوترة فيه، يُرجى الاطّلاع على دليل بدء استخدام "منصة خرائط Google" لإنشاء حساب فوترة ومشروع.

  1. في Cloud Console، انقر على القائمة المنسدلة للمشروع واختَر المشروع الذي تريد استخدامه لهذا الدرس التطبيقي.

  1. فعِّل واجهات برمجة تطبيقات ومنصة SDK لمنصة "خرائط Google" المطلوبة لهذا الدرس التطبيقي في Google Cloud Marketplace. ولإجراء ذلك، اتّبِع الخطوات الواردة في هذا الفيديو أو هذه المستندات.
  2. يمكنك إنشاء مفتاح واجهة برمجة تطبيقات في صفحة بيانات الاعتماد في Cloud Console. يمكنك اتّباع الخطوات الواردة في هذا الفيديو أو هذه المستندات. تتطلب جميع الطلبات إلى "منصة خرائط Google" مفتاح واجهة برمجة تطبيقات.

3- إنشاء تطبيق واجهة برمجة تطبيقات الأماكن

الآن وبعد الانتهاء من إنشاء مشروع وحدة التحكم وتفعيل واجهة برمجة تطبيقات الأماكن عليه والحصول على مفتاح واجهة برمجة التطبيقات، أصبحت مستعدًا لبدء ترميز أول تطبيق لواجهة برمجة تطبيقات الأماكن.

في وقت سابق عند تثبيت ملفات اللوحات، تم إنشاء ملف xcworkspace جديد لك. افتح هذا العنصر بالنقر عليه مرّتين.

19d62f34c08e645c.

ستلاحظ في Project Explorer أن لديك مجلدًا جديدًا باسم "Pods'". إذا تم ذلك بنجاح، سيظهر لك مجلد "خرائط Google" يحتوي على إطارات العمل.

8844d861f64c61aa.png

4. عدِّل ملف Info.plist.

عند تشغيل التطبيق لأول مرة، سيمنحك نظام التشغيل iOS مربع حوار يطلب من المستخدم أن يمنح الإذن للوصول إلى خدمات الموقع. سيمنح مربع الحوار هذا سلسلة بيانات تحدّدها، وستضعها في ملف Info.plist. إذا كانت هذه السلسلة غير متاحة، لن يظهر مربع الحوار، ولن يعمل تطبيقك.

يمكنك العثور على ملف Info.plist في مستكشف المشروع هنا:

c224c920ab3f1ef.png

حدّدها، وسترى محرر plist.

859ca56f3b19da5.png

مرّر مؤشر الماوس فوق أي عنصر من العناصر، وسيظهر لك الرمز "+"". اضغط على الرمز الخاص بك، وسيظهر لك إدخال جديد. أدخِل القيمة "NSLocationAlwaysUsageDescription&#39؛ في هذا المربّع.

9fb225d6f5508794.png

اضغط على مفتاح Enter لإضافة المفتاح الجديد. بعد ذلك، انقر مرّتين على عمود Value (القيمة) لهذا المفتاح، وأضِف سلسلة:

5aefeb184187aa58.png

للتعرُّف على المزيد من المعلومات عن هذه السلسلة، يُرجى الاطِّلاع على وثائق مطوِّري تطبيقات Apple هنا.

5. تعديل تفويض التطبيق

في مستكشف المشروع، ابحث عن AppDelegate.m. افتحه وافتحه، وستستخدمه لإضافة مفتاح واجهة برمجة التطبيقات.

في أعلى الملف، أضِف ما يلي أسفل سطر #import مباشرةً:

@import GoogleMaps;

بعد ذلك، في الدالة itFinishLaunchingWithOptions:، أضِف ما يلي إلى السطر "Return" و#39; :

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

واحرص على استخدام مفتاح واجهة برمجة التطبيقات الذي أنشأته سابقًا.

6- تعديل ملف Storyboard

في مستكشف المشاريع، افتح ملف Main.storyboard. تأكّد من أن الشريط الجانبي نشط عن طريق الضغط على زر الشريط الجانبي في أعلى يسار الشاشة.

352af28b970d9e2.png

ثم ابحث في أسفل الشريط الجانبي عن "التحكم في التصنيفات" عن طريق التأكُّد من اختيار "مكتبة العناصر".

adec7051ae949531.png

في مشهد عرض وحدة التحكم، على الجانب الأيمن، تأكّد من تحديد "العرض&39":

e4827b92b5861e3e.png

ثم اسحب وأفلت 7 تصنيفات في العرض. نظِّمها كما هو موضح هنا. احرص على سحب أحجامها لتطابق ما يظهر. يمكنك تعديل النص في التصنيف بالنقر عليه مرّتين وكتابة القيمة المطلوبة:

f8a9457772358069.png

بالنسبة إلى أقل تصنيف (التسمية الكبيرة جدًا)، انتقِل إلى محرِّر الخصائص وتأكَّد من إعداده على 0 سطر (يتم ضبطه تلقائيًا على 1). وسيسمح لك هذا بعرض عدة أسطر.

a4abacf00d8888fe.png

7- إنشاء منافذ للقيم

بالنسبة إلى 3 "value' "، عليك إنشاء منفذ. وسيسمح لك ذلك بتغيير القيم باستخدام الرمز. لإجراء ذلك، يجب أولاً تفعيل محرّر مساعد Google. لتنفيذ ذلك، عليك أولاً إغلاق الشريط الجانبي للمواقع من خلال النقر على زر إزالته لإزالته. (تم عرض هذا الزر في الخطوة السابقة)

بعد ذلك، اختَر زر "مساعد Google"، وهي الدائرة المزدوجة المعروضة هنا:

e92dcc4ceea20a51.png

تأكد من أنها تعرض الملف ViewController.h. وإذا لم يكن الأمر كذلك، يمكنك تغييره لإجراء ذلك باستخدام أداة التعديل في أعلى نافذة "مساعد Google":

d42f0fcc18b84703.png

بعد ذلك، عند الضغط مع الاستمرار على مفتاح Control، اسحب كل تصنيف وأفلته أسفل سطر @interface في ملف ViewController.h في خدمة "مساعد Google". سيظهر مربّع حوار يسألك عن نوع الاتصال الذي تريد إجراءه:

a44b7888ed0f62b.png

تأكّد من ظهور الإعدادات على النحو الموضّح (الاتصال: مقبس، النوع: UILabel، مساحة التخزين: ضعيف)، ثم أدخِل اسمًا لكل منها. لأغراض هذا الدرس التطبيقي، استثمرت في خطوط الطول وخطوط العرض وارتفاع الارتفاع lbllongitude وlblخطوط العرض وlblAltidude على التوالي. اسحب أيضًا التصنيف الكبير من الأسفل إلى أعلى، واسمِه بـ lblأماكن.

عند الانتهاء، سيظهر ملف 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- تعديل ملف العنوان للموقع وواجهات برمجة تطبيقات Google Client

قبل الخطوات الأخيرة - حيث تنشئ التطبيق لاستخدام واجهة برمجة تطبيقات الأماكن التي تحتاج إليها لإعداد بعض المتغيرات الأخرى في ملف العنوان (ViewController.h). في ما يلي "مدير الموقع الجغرافي الأساسي" و"كائن الموقع الجغرافي الأساسي":

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

ستحتاج أيضًا إلى عميل واجهة برمجة تطبيقات Google:

@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- تعديل وحدة تحكم الملف الشخصي

تتمثل الخطوة الأولى في تعديل دالة viewDoesLoad لإعداد "مدير الموقع الجغرافي"، وطلب تفويض المستخدم بالوصول إلى الموقع الجغرافي، وبدء "مدير الموقع الجغرافي" أخيرًا، حتى يتتبّع الموقع الجغرافي الحالي. وستتولى أيضًا إعداد عميل واجهة برمجة تطبيقات أماكن 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];

وستتصل بعد ذلك بواجهة برمجة تطبيقات الأماكن باستخدام برنامج الأماكن. يمكنك إجراء ذلك من خلال تحديد دالة رد الاتصال، التي ستحصل على قائمة بالأماكن احتمالية. تحدّد واجهة برمجة تطبيقات الأماكن احتمالية وقوعك في مكان معين بناءً على موقعك الجغرافي. تعرض اسم الأماكن المحتملة، مع قيمة بين 0 و1 تحتوي على احتمالية وجودك في هذا المكان.

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

وبعد ذلك، يمكنك تنفيذ معاودة الاتصال. سيؤدي هذا إلى تكرار قائمة الاحتمالات، وإضافة الأماكن والاحتمالات لهذه الأماكن.

[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- تشغيل التطبيق في المحاكي

ويمكنك تشغيل التطبيق باستخدام زر التشغيل في شريط العناوين. يتيح لك هذا أيضًا تحديد نوع التشغيل، وكما يظهر هنا، يمكنك إجراء اختبار I'm على جهاز iPhone 6، باستخدام المحاكي.

bbe0b8820c8a913.png

عند الضغط على زر التشغيل، سيتم إنشاء التطبيق وإطلاقه. سيظهر لك طلب السماح للتطبيق بالوصول إلى الموقع الجغرافي، بما في ذلك السلسلة المخصّصة التي حدّدتها سابقًا.

b9bb2ace7e68f186.png

بعد إجراء ذلك، سيظهر لك تحديث خط الطول وخط العرض. لتغيير الموقع الجغرافي، اختَر قائمة تصحيح الأخطاء واختَر موقعًا جغرافيًا. على سبيل المثال، يمكنك اختيار "الطريق السريع Drive&#39؛

dcb1ce091d780f56.png

عند إجراء ذلك، سترى الموقع مع تحديث الأماكن المحتملة له، ومحاكاة محرك الطريق السريع.

649e3eeb2321ae03.png

وهكذا انتهى كل شيء! لقد نجحت في الوصول إلى تفاصيل المكان الحالي باستخدام واجهة برمجة تطبيقات أماكن Google على نظام التشغيل iOS.