/
ViewController.m
117 lines (92 loc) · 3.64 KB
/
ViewController.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//
// ViewController.m
// WorldPin
//
// Created by Patrick Perini on 6/17/14.
// Copyright (c) 2014 MegaBits. All rights reserved.
//
#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <SIOSocket/SIOSocket.h>
#import "WPAnnotation.h"
@interface ViewController () <MKMapViewDelegate>
@property IBOutlet MKMapView *mapView;
@property SIOSocket *socket;
@property BOOL socketIsConnected;
@property NSMutableDictionary *pins;
@property CLLocationManager *locationManager;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.pins = [NSMutableDictionary dictionary];
[SIOSocket socketWithHost: @"http://10.1.10.16:3000" response: ^(SIOSocket *socket)
{
self.socket = socket;
__weak typeof(self) weakSelf = self;
self.socket.onConnect = ^()
{
weakSelf.socketIsConnected = YES;
[weakSelf mapView: weakSelf.mapView didUpdateUserLocation: weakSelf.mapView.userLocation];
};
[self.socket on: @"join" callback: ^(SIOParameterArray *args)
{
[weakSelf mapView: weakSelf.mapView didUpdateUserLocation: weakSelf.mapView.userLocation];
}];
[self.socket on: @"update" callback: ^(SIOParameterArray *args)
{
NSString *pinData = [args firstObject];
NSArray *dataPieces = [pinData componentsSeparatedByString: @":"];
NSString *pinID = [dataPieces firstObject];
NSString *pinLocationString = [dataPieces lastObject];
WPAnnotation *pin = [[WPAnnotation alloc] initWithCoordinateString: pinLocationString];
if ([[self.pins allKeys] containsObject: pinID])
{
CLLocationCoordinate2D newCoordinate = pin.coordinate;
pin = self.pins[pinID];
pin.coordinate = newCoordinate;
[self.mapView removeAnnotation: pin];
}
self.pins[pinID] = pin;
[self.mapView addAnnotation: pin];
}];
[self.socket on: @"disappear" callback: ^(SIOParameterArray *args)
{
NSString *pinID = [args firstObject];
[self.mapView removeAnnotation: self.pins[pinID]];
[self.pins removeObjectForKey: pinID];
}];
}];
}
#pragma mark - MKMapViewDelegate
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
// Zoom to user location
MKMapCamera *camera = [mapView.camera copy];
camera.altitude = 1; // Zoom in
camera.centerCoordinate = userLocation.coordinate;
mapView.camera = camera;
// Broadcast new location
if (self.socketIsConnected)
{
[self.socket emit: @"location" args: @[
[NSString stringWithFormat: @"%f,%f", userLocation.coordinate.latitude, userLocation.coordinate.longitude]
]];
}
}
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation isKindOfClass: [MKUserLocation class]])
return nil;
MKPinAnnotationView *pinAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier: @"pinAnnotation"];
[pinAnnotationView setAnnotation: annotation];
if (!pinAnnotationView)
{
pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation: annotation
reuseIdentifier: @"pinAnnotation"];
}
pinAnnotationView.pinColor = MKPinAnnotationColorPurple;
return pinAnnotationView;
}
@end