Отправка пользователям текущего местоположения Xcode

Я бы хотел, чтобы мое приложение отправляло местоположение пользователей так же, как Apple Maps на скриншоте. Я прочитал этот ответ " link ", но я не понимаю, как реализовать Это. Я пробовал это с помощью CLPlaceMark, но я могу отправить адрес только в текстовом формате. Вот мой код. Снимок экрана

       //.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

person Jeff    schedule 03.01.2015    source источник


Ответы (1)


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

- (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");
}

Теперь, если вы хотите отправить изображение с булавкой на карте, есть несколько способов сделать это. Программно сделайте снимок экрана и отправьте его по электронной почте. Это все теоретический код, и он не на 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");
        }
}
person Henry F    schedule 03.01.2015
comment
Я отредактировал свой вопрос, чтобы он был ясен. Отличное решение! Большое спасибо! возможно, это обсуждение принесет пользу другим, потому что в этой теме не так много новичков. Еще раз спасибо! - person Jeff; 03.01.2015
comment
@Scrappy Рад помочь, дайте мне знать, если у вас есть другие вопросы. - person Henry F; 04.01.2015