2015-01-03 4 views
1

Id как мое приложение для отправки местоположения пользователей так же, как Карты Apple на экране. Я прочитал этот ответ «link», но я не понимаю, как его реализовать. Ive пробовал это с помощью CLPlaceMark, но я могу только отправить адрес в текстовом формате. Вот мой код. Screen ShotОтправка пользователей Текущее местоположение Xcode

 //.h 


#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import <CoreLocation/CoreLocation.h> 
#import <MessageUI/MessageUI.h> 
@interface ViewController : UIViewController<MKMapViewDelegate,CLLocationManagerDelegate, MFMessageComposeViewControllerDelegate>{ 
CLLocationCoordinate2D coordinates; 
MKMapView *mapView; 
} 
@property (nonatomic, retain) IBOutlet MKMapView *mapView; 
@property (strong, nonatomic) CLLocationManager *locationManager; 
-(IBAction)SetMap:(id)sender; 
- (IBAction)getLocation:(id)sender; 
- (IBAction)send:(id)sender; 
@end 



//.m 

    #import "ViewController.h" 
    #import <MessageUI/MFMessageComposeViewController.h> 
    @interface ViewController() 

    @end 

    @implementation ViewController{ 
    CLGeocoder *geoCoder; 
    CLPlacemark *placeMark; 
    } 
    @synthesize mapView; 
    @synthesize locationManager; 
    - (void)viewDidLoad { 
    [super viewDidLoad]; 
    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { 
    [locationManager requestWhenInUseAuthorization]; 
    } 
    mapView.showsUserLocation = YES; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 
    [locationManager startUpdatingLocation]; 

    CLLocation *location1 = [locationManager location]; 
    coordinates = [location1 coordinate]; 
    geoCoder = [[CLGeocoder alloc]init]; 
    } 
    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
    { 

    NSLog(@"Location: %@", newLocation); 
    CLLocation *currentLocation = newLocation; 



    [geoCoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) { 

    if (error == nil && [placemarks count] > 0) { 

    placeMark = [placemarks lastObject]; 

    _adressLabel.text = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@", 
    placeMark.subThoroughfare, placeMark.thoroughfare, 
    placeMark.postalCode, placeMark.locality, 
    placeMark.administrativeArea, 
    placeMark.country]; 

    } else { 

    NSLog(@"%@", error.debugDescription); 

    } 

    } ]; 

    } 
    - (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
    } 
    -(IBAction)SetMap:(id)sender{ 
    switch (((UISegmentedControl *)sender).selectedSegmentIndex) { 
    case 0: 
    mapView.mapType = MKMapTypeStandard; 
    break; 
    case 1: 
    mapView.mapType = MKMapTypeSatellite; 
    break; 
    case 2: 
    mapView.mapType = MKMapTypeHybrid; 
    break; 
    default: 
    break; 
    } 
    } 

    - (IBAction)getLocation:(id)sender { 
    mapView.showsUserLocation = YES; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 
    [locationManager startUpdatingLocation]; 

    CLLocation *location = [locationManager location]; 
    coordinates = [location coordinate]; 
    } 
    - (IBAction)send:(id)sender { 

    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init]; 

    [controller setMessageComposeDelegate:self]; 
    if([MFMessageComposeViewController canSendText]) 
    { 
    [controller setRecipients:[NSArray arrayWithObjects:nil]]; 
    [controller setBody:[NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@", 
    placeMark.subThoroughfare, placeMark.thoroughfare, 
    placeMark.postalCode, placeMark.locality, 
    placeMark.administrativeArea, 
    placeMark.country]]; 
    [self presentViewController:controller animated:YES completion:NULL]; 

    }else{ 
    NSLog(@"NO Texting"); 
    } 

    } 

    -(void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{ 
    [self dismissViewControllerAnimated:YES completion:NULL]; 
    } 

    @end 

ответ

2

Теперь что вы подразумеваете под "отправкой" его пользователю? Если вы просто хотите отправить координаты, где вы находитесь, я хотел бы попробовать изменить свой код к этому:

- (IBAction)send:(id)sender { 

MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init]; 
[controller setMessageComposeDelegate:self]; 

NSString *theLocation = [NSString stringWithFormat:@"latitude: %f longitude: %f", self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude]; 

if([MFMessageComposeViewController canSendText]) 
{ 
[controller setRecipients:[NSArray arrayWithObjects:nil]]; 
[controller setBody:theLocation]; 
[self presentViewController:controller animated:YES completion:NULL]; 
}else{ 
NSLog(@"NO Texting"); 
} 

Теперь, если вы хотите, чтобы отправить изображение с пальцем на карте, Theres несколько способов сделать Это. Программируйте снимок экрана и отправьте его по электронной почте. Это все теоретический код, а не 100% совершенный (я не думаю ... может быть):

- (UIImage *) screenshot { 
     UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale); 

     [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES]; 

     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     return image; 

     [self send:image]; 

    - (IBAction)send:(UIImage *)image { 
     UIImage *locationImage = image; 

     MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init]; 
     [controller setMessageComposeDelegate:self]; 

     if([MFMessageComposeViewController canSendText]) { 

     [controller setRecipients:[NSArray arrayWithObjects:nil]]; 
     [controller setBody:locationImage]; 
     [self presentViewController:controller animated:YES completion:NULL]; 
     } 

     else { 
     NSLog(@"NO Texting"); 
     } 
} 
+1

Ive отредактировал мой вопрос, чтобы его было ясно. Отличное решение! Спасибо огромное! возможно, другие извлекут выгоду из этого обсуждения из-за того, что для этой темы не так много на эту тему. Еще раз спасибо! – Jeff

+1

@Scrappy Рад помочь человеку, дайте мне знать, если у вас есть другие вопросы. – John