12
12
#import < UIKit/UIKit.h>
13
13
#import < Photos/Photos.h>
14
14
#import " color-grabber.h"
15
+ #import " RCTMultiPeer.h"
15
16
17
+ @interface RCTARKitManager () <MCBrowserViewControllerDelegate>
18
+
19
+ @end
16
20
@implementation RCTARKitManager
17
21
18
22
RCT_EXPORT_MODULE ()
@@ -172,13 +176,21 @@ - (NSDictionary *)constantsToExport
172
176
RCT_EXPORT_VIEW_PROPERTY(onAnchorUpdated, RCTBubblingEventBlock)
173
177
RCT_EXPORT_VIEW_PROPERTY(onAnchorRemoved, RCTBubblingEventBlock)
174
178
179
+ RCT_EXPORT_VIEW_PROPERTY(onMultipeerJsonDataReceived, RCTBubblingEventBlock)
180
+
181
+ // TODO: Option to lock these three below down for host only
182
+ RCT_EXPORT_VIEW_PROPERTY(onPeerConnected, RCTBubblingEventBlock)
183
+ RCT_EXPORT_VIEW_PROPERTY(onPeerConnecting, RCTBubblingEventBlock)
184
+ RCT_EXPORT_VIEW_PROPERTY(onPeerDisconnected, RCTBubblingEventBlock)
185
+
175
186
RCT_EXPORT_VIEW_PROPERTY(onTrackingState, RCTBubblingEventBlock)
176
187
RCT_EXPORT_VIEW_PROPERTY(onFeaturesDetected, RCTBubblingEventBlock)
177
188
RCT_EXPORT_VIEW_PROPERTY(onLightEstimation, RCTBubblingEventBlock)
178
189
RCT_EXPORT_VIEW_PROPERTY(onTapOnPlaneUsingExtent, RCTBubblingEventBlock)
179
190
RCT_EXPORT_VIEW_PROPERTY(onTapOnPlaneNoExtent, RCTBubblingEventBlock)
180
191
RCT_EXPORT_VIEW_PROPERTY(onEvent, RCTBubblingEventBlock)
181
192
RCT_EXPORT_VIEW_PROPERTY(onARKitError, RCTBubblingEventBlock)
193
+ RCT_EXPORT_VIEW_PROPERTY(worldMap, NSObject );
182
194
183
195
RCT_EXPORT_METHOD (pause:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
184
196
[[ARKit sharedInstance ] pause ];
@@ -199,6 +211,43 @@ - (NSDictionary *)constantsToExport
199
211
resolve (@([ARKit isInitialized ]));
200
212
}
201
213
214
+ RCT_EXPORT_METHOD (openMultipeerBrowser:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
215
+ [[ARKit sharedInstance ].multipeer openMultipeerBrowser: serviceType];
216
+ }
217
+
218
+ RCT_EXPORT_METHOD (startBrowsingForPeers:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
219
+ [[ARKit sharedInstance ].multipeer startBrowsingForPeers: serviceType];
220
+ }
221
+
222
+ RCT_EXPORT_METHOD (advertiseReadyToJoinSession:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
223
+ [[ARKit sharedInstance ].multipeer advertiseReadyToJoinSession: serviceType];
224
+ }
225
+
226
+ // TODO: Should be optionally to only be available to host
227
+ RCT_EXPORT_METHOD (sendDataToAllPeers:(NSDictionary *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
228
+ [self sendData: [RCTARKit sharedInstance ].multipeer.connectedPeers data: data callback: resolve];
229
+ }
230
+
231
+ // TODO: Should be optional to lock it down so peers can only send to host
232
+ RCT_EXPORT_METHOD (sendDataToPeers:(NSDictionary *)data recepientPeerIDs:(NSArray *)recepientPeerIDs resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
233
+ NSError *error = nil ;
234
+ NSMutableArray *peers = [NSMutableArray array ];
235
+ for (NSString *peerUUID in recepientPeerIDs) {
236
+ [peers addObject: [[RCTARKit sharedInstance ].multipeer.connectedPeers valueForKey: peerUUID]];
237
+ }
238
+ [self sendData: [RCTARKit sharedInstance ].multipeer.connectedPeers data: data callback: resolve];
239
+ }
240
+
241
+ // TODO: Should be optional to only be available to host
242
+ RCT_EXPORT_METHOD (sendWorldmapData:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
243
+ [[ARKit sharedInstance ] getCurrentWorldMap: resolve reject: reject];
244
+ }
245
+
246
+ // TODO: Should be optional to only be available to host
247
+ RCT_EXPORT_METHOD (getAllConnectedPeers:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
248
+ // TODO: get all peer ids
249
+ }
250
+
202
251
RCT_EXPORT_METHOD (isMounted:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
203
252
if ( [ARKit isInitialized ]) {
204
253
dispatch_async (dispatch_get_main_queue (), ^{
@@ -228,6 +277,23 @@ - (NSDictionary *)constantsToExport
228
277
[[ARKit sharedInstance ] hitTestSceneObjects: point resolve: resolve reject: reject];
229
278
}
230
279
280
+ - (void )sendData : (NSArray *)recipients data : (NSDictionary *)data callback : (RCTResponseSenderBlock)callback {
281
+ NSError *error = nil ;
282
+ NSMutableArray *peers = [NSMutableArray array ];
283
+ // for (NSString *peerUUID in recipients) {
284
+ // [peers addObject:[[ARKit sharedInstance].multipeer.session.connectedPeers valueForKey:peerUUID]];
285
+ // }
286
+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject: data options: 0 error: &error];
287
+ [[ARKit sharedInstance ].multipeer.session sendData: jsonData toPeers: recipients withMode: MCSessionSendDataReliable error: &error];
288
+ NSLog (@" Sending data..." );
289
+ if (error == nil ) {
290
+ callback (@[[NSNull null ]]);
291
+ }
292
+ else {
293
+ callback (@[[error description ]]);
294
+ }
295
+ }
296
+
231
297
232
298
233
299
@@ -398,4 +464,24 @@ - (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTP
398
464
resolve (@{});
399
465
}
400
466
467
+ - (void )browserViewControllerDidFinish : (nonnull MCBrowserViewController *)browserViewController {
468
+ dispatch_async (dispatch_get_main_queue (), ^{
469
+ UIViewController *rootViewController = [UIApplication sharedApplication ].delegate .window .rootViewController ;
470
+
471
+ [rootViewController dismissViewControllerAnimated: YES completion: ^{
472
+
473
+ }];
474
+ });
475
+ }
476
+
477
+ - (void )browserViewControllerWasCancelled : (nonnull MCBrowserViewController *)browserViewController {
478
+ dispatch_async (dispatch_get_main_queue (), ^{
479
+ UIViewController *rootViewController = [UIApplication sharedApplication ].delegate .window .rootViewController ;
480
+
481
+ [rootViewController dismissViewControllerAnimated: YES completion: ^{
482
+
483
+ }];
484
+ });
485
+ }
486
+
401
487
@end
0 commit comments