רשימת תפוצה

חפש באתר:

Loading

פייסבוק
5to9-תמונות מ
שיחות בפורום

 

 

« הסבת אפליקציות לאייפד | Main | דעו איך משתמשים באפליקציה שלכם »
יום שני
יול182011

שינויי מיקום משמעותיים

לפני כשנה שידרגנו כולנו את מערכת ההפעלה ב-iPhone-ים שלנו לגרסה החדשה שלה: iOS 4. אחד הדברים המשמעותיים ביותר בשדרוג הזה היה היכולת של אפליקציות לרוץ ברקע. אז נכון שבשלב הזה כנראה שרובכם כבר יודעים שהיכולת הזו לרוץ ברקע לא בדיוק מאפשרת לאפליקציות לעשות מה שהן רוצות ברקע ובעצם בהרבה מובנים היא קצת עבודה בעיניים. אבל, יש דברים חשובים שהיא כן מאפשרת לנו לעשות, כמו למשל היכולת בה אתמקד במדריך זה והיא: Significant Location Change.

על מנת להסביר קצת על היכולת הזו, אשתמש בדוגמא בה Apple השתמשו כשהציגו אותה: נניח ואתם כל הזמן שוכחים לקחת את הבגדים מגיהוץ. אתם נזכרים רק אחרי שאתם מגיעים הביתה ואז או שאין לכם כח לזה, או שהחנות כבר נסגרה ואתם אומרים לעצמכם: “לא נורא, אעשה את זה מחר”. הרי ידוע שמחר זה תמיד היום הכי עמוס בשבוע. כמובן שלמחרת קורה בדיוק אותו הדבר. והחלק הכי מתסכל בכל הסיפור הוא שהחנות נמצאת גם ככה בדרך שלכם הביתה...

איזה מגניב זה היה יכול להיות אם הייתם יכולים לקבל תזכורת על הבגדים שבגיהוץ כשאתם עוברים גם ככה באזור של החנות, נכון? אז זה בדיוק מה ש-Significant Location Change מאפשר לכם לעשות. אם האפליקציה שלכם מתמנה לקבל את ההתראות הללו, בכל פעם שיש שינוי מיקום משמעותי (Apple לא מתחייבים על מרחק מדויק בין התראות אבל נסיונות לא מאוד רבים שלי מראים שזה קורה אחת לשניים-שלושה קילומטרים כתלות באזור בו המשתמש נמצא), האפליקציה שלכם מקבלת רשות להריץ קטע קוד ולהגיב לשינוי במיקום. כלומר, המשתמש שלכם יוכל להגדיר את המיקום של החנות של הגיהוץ ובכל פעם שהאפליקציה תקבל אינדיקציה על שינוי מיקום משמעותי, תתבצע בדיקה האם אנחנו קרובים מספיק לחנות. אם כן, נוכל להקפיץ למשתמש שלנו הודעה על כך וסוף סוף הוא יוכל ללכת להציל את הבגדים מהגיהוץ.

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

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

אז בואו נצלול ישר לעניינים. איך משלבים את היכולת הזו באפליקציה שלכם?

פתחו פרויקט חדש ב-XCode והוסיפו לו את ה-Framework בשם CoreLocation. ב-AppDelegate.h בצעו את השינויים הבאים כך לאחריהם הקובץ ייראה כך:

#import <UIKit/UIKit.h>

#import <CoreLocation/CoreLocation.h>

 

@class MyLocationTestViewController;

 

@interface MyLocationTestAppDelegate : NSObject <UIApplicationDelegate, CLLocationManagerDelegate

{    

    CLLocationManager *locationManager;

}

 

@property (nonatomic, retain) IBOutlet UIWindow *window;

 

@property (nonatomic, retain) IBOutlet MyLocationTestViewController *viewController;

 

@end

 

הוספנו בעצם את ה-Location Manager דרכו נתמנה לקבלת העדכונים והגדרנו את ה-AppDelegate שלנו ל-Delegate של ה-Location Manager על מנת שיידע לקבל ולהתמודד עם ההתראות. כעת, נעבור לקובץ ה-m ונראה איך מתמנים לקבלת העדכונים ואיך מטפלים בהתראות כשהן מתקבלות.

אנחנו נאתחל את ה-Location Manager שלנו ונרשם לקבלת ההתראות ב-applicationDidFinishLaunching. הוסיפו למתודה זו את השורות הבאות:

locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;

[locationManager startMonitoringSignificantLocationChanges];

 

מה שאנחנו עושים בשורות הללו זה לאתחל את ה-Location Manager שלנו. להגדיר לו את ה-delegate שלו כך שנוכל להוסיף מתודות לטיפול באירועים שלו בכל פעם שקורה אחד כזה ולבסוף, התמננו לקבלת עדכוני מיקום משמעותיים.

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

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

- (void)locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation

fromLocation:(CLLocation *)oldLocation

{

    UILocalNotification *notification = [[UILocalNotification alloc] init];

 

    notification.alertBody = [NSString stringWithFormat:@"Signigicant Location Change from %.06f %.06f to %.06f %.06f at %@" , oldLocation.coordinate.latitude, oldLocation.coordinate.longitude, newLocation.coordinate.latitude, newLocation.coordinate.longitude, newLocation.timestamp];

 

    notification.soundName = UILocalNotificationDefaultSoundName;

 

    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];

}

 

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

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

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

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

PrintView Printer Friendly Version

EmailEmail Article to Friend

Reader Comments

There are no comments for this journal entry. To create a new comment, use the form below.

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>