PracticU

ניטור מיקום המשתמש וציור מסלול קוי על המפה

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › ניטור מיקום המשתמש וציור מסלול קוי על המפה
מילון מושגים:
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
כפתור - רכיב בממשק המשתמש שהמשתמש לוחץ עליו כדי להפעיל פעולה, כמו שליחת טופס או מעבר לדף אחר.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
הרשאה - קביעה אילו פעולות ומשאבים מותרים למשתמש או לתהליך לאחר שזהותו אומתה. שולטת במי רשאי לעשות מה.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
תמונה - קובץ גרפי המוצג על המסך. בהקשר של וירטואליזציה או Docker, תבנית מוכנה שממנה יוצרים מכונה או קונטיינר.

ניטור מיקום המשתמש וציור מסלול קוי על המפה
בשיעור האחרון במודול בונים את מסך המיקום: חיפוש כתובת על המפה, מעקב אחרי מסלול הריצה של המשתמש וציור שלו כקו, סימון נקודות בנענוע המכשיר, ובסוף מיון רשימת המקומות לפי הקרבה ויצירת אייקון לאפליקציה.
השלבים העיקריים
1. המסך: View Controller חדש בתוך Navigation Controller, שמחובר ל-Tab Bar עם relationship segue. מוסיפים לו כפתור Start/Stop ו-Map View, ומחלקה LocationViewController עם outlet למפה ופעולה לכפתור.
2. חיפוש בקוד: בלי Table View אי אפשר להניח Search Bar ב-Storyboard, ולכן יוצרים UISearchController ומציבים אותו ב-navigationItem.searchController. המחלקה היא ה-delegate של המפה ושל ה-Search Bar. ב-searchBarSearchButtonClicked לוקחים את הטקסט, בודקים שאינו ריק, וסוגרים את החיפוש עם isActive = false.
3. Geocoder: CLGeocoder().geocodeAddressString ממיר טקסט למערך placemarks. לוקחים את הראשון, יוצרים ממנו Annotation (שם המקום ואזור מנהלי ככותרת משנה), מוסיפים למפה ועושים זום. את הזום מבצעים עם MKCoordinateRegion סביב המיקום, ברדיוס של 1000 מטר, ו-setRegion. בדוגמה חיפוש בעברית הוביל לבאר שבע.
4. ניטור מיקום: ב-LocationManager מוסיפים דגל isMonitoringLocation כ-private(set), ומערך steps פרטי של מיקומים. מגדירים activityType לכושר, distanceFilter (בדוגמה 100 מטר, או none לכל תזוזה) ו-desiredAccuracy. דיוק גבוה צורך יותר סוללה.
5. התחלה והפסקה: start מפעיל את הדגל, מרוקן את steps ואם יש הרשאה קורא ל-startUpdatingLocation. stop מכבה את הדגל וקורא ל-stopUpdatingLocation.
6. איסוף נקודות: ב-didUpdateLocations מוסיפים את המיקומים ל-steps, ושולחים Notification בשם חדש עם userInfo שבו המיקום האחרון, כדי שמסכים אחרים יוכלו להאזין.
7. הכפתור: בלחיצה מתחילים או עוצרים את הניטור, מחליפים את הכותרת בין Start ל-Stop, ובהתחלה עושים זום למיקום הנוכחי.
8. ציור המסלול: מ-steps מוציאים את coordinate של כל נקודה, יוצרים MKPolyline (הבנאי מקבל מצביע למערך קואורדינטות וכמות), ומוסיפים אותו כ-overlay. ב-rendererFor overlay של ה-delegate מחזירים MKPolylineRenderer עם lineWidth ו-strokeColor. כדי שיוצג רק המסלול האחרון, מסירים את ה-overlay הקודם לפני הוספת החדש.
9. Annotation בנענוע: ב-motionBegan בודקים אם התנועה היא shake, ויוצרים Annotation במיקום הנוכחי. ב-viewFor annotation מחזירים nil למה שאינו שלנו, וממחזרים תצוגות עם dequeueReusableAnnotationView ו-reuse identifier. לתצוגה החדשה נותנים כפתור callout ותמונה של נעל ריצה בגודל כ-25 פיקסלים. בסימולטור מנענעים דרך Hardware, Shake Gesture.
10. מיון לפי קרבה: בטבלת האתרים מיון sortPlaces מקבל מיקום, ו-Notification Center מאזין לעדכוני המיקום ב-main queue, עם weak self, ממיין מחדש בכל עדכון.
11. אייקון לאפליקציה: האפליקציה Asset Catalog Creator מה-App Store (חינמית) מקבלת תמונה גדולה, בגודל כ-1024, ויוצרת את כל הגדלים ישירות בקטלוג של הפרויקט.
שימו לב
- בסימולטור הכפתור לא יעשה כלום בלי מיקום מדומה (צעד אחרון של בדיקה בכל הרצה).
- הכפתור Start/Stop רק מבצע זום ושינוי כותרת. הציור קורה בעצירה.
- אם המקלדת לא נפתחת בסימולטור, מחליפים את Connect Hardware Keyboard.
אחרי השיעור אפשר לחפש כתובת על מפה, לעקוב אחרי מסלול משתמש ולצייר אותו, ולשלב Notification Center בעדכוני מיקום.

פרקי ההרצאה: ניטור מיקום המשתמש וציור מסלול קוי על המפה

  1. 00:00

    חיפוש כתובת במסך המיקום

  2. 00:37

    מסך חדש עם Navigation וטאב

  3. 01:32

    כפתור Start ו-Map View

  4. 02:40

    יצירת LocationViewController ו-Outlets

  5. 04:01

    הוספת Search Controller מהקוד

  6. 08:30

    טיפול בלחיצה על Search

  7. 10:03

    המרת כתובת לקואורדינטות עם Geocoder

  8. 13:33

    זום לאזור עם setRegion

תמלול ההרצאה: ניטור מיקום המשתמש וציור מסלול קוי על המפה

הטקסט המלא של הדקות הראשונות בהרצאה «ניטור מיקום המשתמש וציור מסלול קוי על המפה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:25

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

  3. 00:41

    אז אנחנו נעשה פה פלוס View Controller אחרון בפרויקט ונשים אותו נגיד פה. עכשיו ה-View Controller הזה רצוי שהוא יהיה ב-Navigation כדי שיהיה אפשר להוסיף לו חיפוש וכן הלאה, אז הכנסנו אותו לתוך Navigation Controller וכל הדבר הזה אנחנו עושים פה ואנחנו נרצה להוציא סגווי מהתא בר

  4. 01:08

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

  5. 01:38

    מבחינת ייצור ואין לנו פה המון אנחנו פשוט רוצים להוסיף כפתור של סטארט וסטופ אוקיי נשים את הכפתור נגיד פה באיזשהם שוליים גדולים מלמעלה ומבחינת ציר X אני ארצה פשוט למרכז אותו ונוסיף רק אילוץ אחד ואני אוסיף מריכוז אופקי יש עכשיו בגודל של הפונד בוא

  6. 01:51

    נגדיל את זה משמעותית נגיד 32 פה ככה נבחר נגדיל את זה מאוד אוקיי ובוא נכתוב פה במקום בטון נכתוב פה פשוט סטארט כשעל חוץ מדי יש לנו map view אז בואו נוסיף map view ואנחנו נרצה פשוט לאלץ אותו לכל מה שנשאר מהמסך אז בואו ניקח שוליים של 888 לכל מה שנשאר אז זאת בעצם המפה שלנו איך מפה אנחנו מתקדמים בקונטרולרים אנחנו רוצים לייצר לזה קונטרולר אז אנחנו נעשה קליק ימני

  7. 02:44

    new file ואנחנו רוצים קודם כל קלאס שיורש מ ui view קונטרולר הפעם ואנחנו נקרא לזה לוקיישן view קונטרולר את הקלאס הזה צריך לקשר לסטורי וורד אז Back to the Storyboard כאן אתם רוצים לעמוד על הרצאות ללכת ל-Identity Inspector בצד ימין ולבחור בקלאס שלכם Allocation View Controller מעולה עכשיו אנחנו נלך פה למעלה לבורגר לאיפה שכתוב Just Editor Options

  8. 03:15

    ואנחנו רוצים לפתוח את האסיסטנט עכשיו אנחנו נלך פה לאוטומטיק ונבחר את הקלאס שיצר ה-Allocation View Controller מעולה אז נוציא ל-The Action לכפתור אוקיי רק נדאג שזה אקשן ונשנה את ה-apply-o-a-button אני אקרא לזה tagel user-location ויותר מאוחר אנחנו נעשה את המימוש של הפעולה עכשיו חוץ

  9. 03:45

    מזה אנחנו רוצים להוציא outlet למפטיו נכון אז הנה יש לנו פה את המפטיו והוצאנו אליו פשוט את ה-outlet וכשמוציאים outlet אז צריך אימפורטות אתם בטח כבר זוכרים ל-mapkit נכון אז בואו נוסיף אותו נהדר עכשיו מה לגבי החיפוש אתם בטח שואלים את עצמכם נכון זאת זאת אומרת אני מריץ את

  10. 04:13

    זה פה ואין חיפוש בטייבל ויו קונטרולר סליחה בטייבל ויו קונטרולר היינו יכולים לעשות פה פלוס רגע נראה לכם את זה שוב טייבל ויו קונטרולר היינו יכולים לעשות פה פלוס להוסיף search bar לתוך הטייבל ויו אבל פה זה לא טייבל ויו קונטרולר ואין פה איזה שהוא מקום לזה אפשר לעבוד עם זה גם כן אבל אנחנו רוצים לראות דרך

  11. 04:33

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

  12. 04:52

    לתכונה הזאת נגיד let search קונטרולר שווה ל ui סארצ' קונטרולר חדש עכשיו יש פה את ה ui סארצ' רזלטס קונטרולר ואנחנו לא צריכים אחד כזה אז אנחנו נעביר בוניל וזה זה בעיניי שאנחנו צריכים להשתמש בו, אוקיי? לא לבחור באף מנה אחר, זה בדרך כלל לא יעבוד לנו.

  13. 05:21

    אז יצרנו את ה-search-controller ב-view-did-load אנחנו רוצים קודם כל להיות ה-delegate של ה-map-view עצמו, אז בואו נגיד map-view.delegate שווה ל-self, בגלל שאנחנו עובדים עם מפה אנחנו רוצים להיות ה-delegate שלה, וזה מצריך אותנו להוסיף לזה extension, אז בואו נוסיף אותו כבר עכשיו כדי שלא נשכח אחר כך.

  14. 05:41

    extension ל-location-view-controller שאני נמצא בו, כדי לממש את MKMFViewDelegate אוקיי מה עוד אנחנו רוצים לעשות כאן אנחנו רוצים גם להיות הדלגייט של הסרצ' קונטרולר אוקיי יש לי פה סרצ' קונטרולר זה די דומה לחיפושים שעשינו בעבר אז אני ככה מניח שאתם בסדר עם זה על הסרצ' קונטרולר יש לו את הסרצ' באר ואנחנו רוצים להיות הדלגייט של הסרצ' באר פשוט אותו דבר כמו שעשינו בעבר

  15. 06:19

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

  16. 06:34

    צריך לממש UASearchBarDelegate גם כן, אז אנחנו נממש extension ל-location-vcontroller שאנחנו נמצאים בו כדי לממש את ה-searchBarDelegate.

  17. 06:47

    יפה, בואו נראה אם אנחנו צריכים פה עוד משהו. אנחנו אולי רוצים פשוט להציג את המיקום של המשתמש על המפה, בוא נגיד mapview.showsuserlocation שווה למה?

  18. 07:02

    בוא ניקח את ה-location-manager שלנו, share ואם יש רשות אז true אחרת false אוקיי אז האם המפה צריכה להציג מיקום אם יש רשות זו התשובה שלנו יפה מאוד אז אנחנו גם מציגים את המיקום של המשתמש אם אפשר וה-search-controller שלנו לא יוצג עדיין נכון הוספנו יצרנו מופע של search-controller ואמרנו שאנחנו רוצים להיות ה-delegate

  19. 07:30

    אבל הדבר האחרון שנשאר לנו לעשות פה בעצם זה להגיד בוא נוסיף את הסרצ' קונטרולר הזה שלנו לנביגיישן אייטם אז self.navigationitem searchcontroller שווה לסרצ' קונטרולר שיצרנו יפה מאוד אז בעצם עכשיו אנחנו יכולים כבר להריץ ולראות שאמור להיות לנו איזה שהוא חיפוש צ'יק באפליקציה הוא עדיין לא עובד יותר מדי

  20. 07:55

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

  21. 08:11

    דרך אגב אם לא נפתחת לכם המקלדת אז אתם מוזמנים פשוט hardware tagel keyboard בטלפון אמיתי היא נפתחת אצלי פשוט כתוב connect hardware keyboard אז פשוט תעשו tagel software keyboard ותרים אותה במקלדת ואתם יכולים לכתוב פה אבל רגע אנחנו לוחצים על search לא מחפש לא מוחק את הטקסט אז כל הקטע הבא הוא בדלגייט

  22. 08:33

    נכון? ב-search bar delegate אנחנו פשוט רוצים להוסיף את המתודה של clicked יש שם פשוט כפתור והם קראו לו הפעם clicked search bar search clicked אוקיי זה מה שמעניין אותנו ואנחנו רוצים לקחת את הטקסט אז בואו ניקח את הטקסט guard let text שווה ל-search bar נקודה טקסט וגם בואו נבדוק שהאורך

  23. 09:03

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

  24. 09:29

    אייטם נכון? navigationitem.searchcontroller וברגע שיש לי את הnavigationitem.searchcontroller אנחנו רוצים להגיד is active false ומה שזה עושה זה עושה לו דיסמיס למעשה אוקיי ובוא נעשה רגע פריט לטקסט אחר כך נמשיך אני גם ארשום לנו פה ב-a זה דיסמיס ופה הוצאנו את הטקסט והדפסנו אותו אז אנחנו הולכים רגע לסרצ'

  25. 10:05

    מחפשים פה משהו motion ועשינו enter אז יש לי פה פרינט למשה וגם עשינו dismiss מגניב אוקיי עכשיו מה נשאר לנו לעשות זה לחפש את המיקום הזה איכשהו נכון כדי לחפש את המיקום אנחנו רוצים להשתמש באובייקט שנקרא Geocoder Geocoder עוזר לנו לקחת טקסט ולהמיר אותו לקואורדינטות שזה מגניב אז בואו נלמד את זה אז עבודה עם Geocoder let Coder שווה Geocoder חדש או CL Geocoder אם אתם רוצים ככה זה השם המלא שלו ו-Once יש

  26. 10:38

    לכם Coder Geocoder אתם רוצים לתת לו את ה-String שלכם אוקיי? איבדתי פה רגע את ההשלמה האוטומטית במקרים כאלה צריך פשוט לפתוח את Xcode או לעשות Command B ואצלי זה יסתדר ככה Geocode Address String אני יכול לתת לו פשוט לתת לו String והוא ייתן לנו Address בוא ננסה את זה עכשיו מה ה-Address

  27. 11:07

    String זה הטקסט שלנו נכון? וה completion handler זה פשוט בלוק אז בואו נעשה פה אינטרנט. הוא נותן לי מערך של place marks לבקש הוא רוצה יותר מאחד אז בוא נקרא לזה place mark array כדי שנבין שזה מערך ו-error optional אוקיי עכשיו בוא נעשה weak self-in כי אנחנו לא רוצים שמישהו יחזיק

  28. 11:34

    אלינו strong reference אוקיי ומה אנחנו עכשיו עושים בעצם אז בוא נוציא את ה-place מה-place array גארד ל-place שווה ל-place array נקודה first ולט לוקיישן שווה לפלייס הזה נקודה לוקיישן אחרת לא הצלחנו נכון אז אנחנו יכולים להוציא הודעה שלא הצלחנו אני פשוט אעשה פה כרגע ריטר מעולה אז יש לנו את

  29. 12:05

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

  30. 12:44

    או את הפלייס ניים סליחה ומבחינת הסאב טייטל בואו ניקח פשוט את הפלייס נקודה אדמיניסטרי דיבריה שזה כמו כזה ריצ'ה דרום צפון וכן הלאה אז יש לנו אנוטציה אנחנו רוצים להוסיף אותה למפה אז self אם אתה קיים, זאת אומרת optional self.mapview.addannotation.

  31. 13:10

    אוקיי? יפה מאוד. אז בואו נראה רגע את כל הדבר הזה בפעולה מה שנקרא, רגע רגע רגע רגע רגע, כאן הקומפיילר מתלונן שכאילו לא השתמשנו בgeocoder, אתם רואים? אבל השתמשנו בו, אז עוד פעם עשיתי command+b והכל בסדר.

  32. 13:33

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

  33. 13:53

    או לוקיישן אוקיי ותציג אותו תעשה לו זום אין איך אנחנו עושים את הזום אין הזה אנחנו מייצרים mk coordinate ריצ'ן let ריצ'ן שווה mk coordinate ריצ'ן וכאן אנחנו נבחר בוונאי שמקבל center point אוקיי אז זה זה לוקיישן נקודה קואורדינייטס ואיזשהו מרחק נגיד אלף מטר סביב

  34. 14:25

    הנקודה רדיוס כזה של לונגיטוד ולטיטוד זה ה-region ואנחנו רוצים בעצם להגיד למפה שלנו ככה להתקבע על ה-region הזה אז mapview.setregion תיכנסי ל-region אם אני

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: עבודה עם SplitViewController Master Details

ההרצאה הבאה: פרויקט גמר לקורס פיתוח אפליקציות לאייפון

הרצאות קשורות מקורסים אחרים

  • מאפינים של המשתמש
  • ניטור ובקרה של בדיקות
  • ולידציה על קלט המשתמש - Validation
  • מיקום הטלפון במפה של גוגל - Geolocation

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון