From 165fa2b522099d6a5b928bc08bd89dfdb8177776 Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Wed, 15 Jan 2020 11:32:11 -0500 Subject: [PATCH 01/12] add a podspec so autolinking works --- ios/RCTARKit.podspec | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 ios/RCTARKit.podspec diff --git a/ios/RCTARKit.podspec b/ios/RCTARKit.podspec new file mode 100644 index 00000000..6e228bff --- /dev/null +++ b/ios/RCTARKit.podspec @@ -0,0 +1,18 @@ +require 'json' +version = JSON.parse(File.read('../package.json'))["version"] + +Pod::Spec.new do |s| + + s.name = "RCTARKit" + s.version = version + s.summary = "ARKit for react native" + s.homepage = "https://github.com/react-native-ar/react-native-arkit" + s.license = "MIT" + s.author = { "macrozone" => "https://github.com/macrozone" } + s.platforms = { :ios => "9.0", :tvos => "9.0" } + s.source = { :git => "https://github.com/react-native-ar/react-native-arkit"", :tag => "v#{s.version}" } + s.source_files = 'RCTARKitManager/**/*.{h,m}' + s.preserve_paths = "**/*.js" + s.dependency 'React' + +end \ No newline at end of file From 0c1c878a83d78b4c6850896210004c5cf0dec7a4 Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Wed, 15 Jan 2020 11:45:36 -0500 Subject: [PATCH 02/12] fixing podspec --- ios/RCTARKit.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/RCTARKit.podspec b/ios/RCTARKit.podspec index 6e228bff..e9f303be 100644 --- a/ios/RCTARKit.podspec +++ b/ios/RCTARKit.podspec @@ -10,7 +10,7 @@ Pod::Spec.new do |s| s.license = "MIT" s.author = { "macrozone" => "https://github.com/macrozone" } s.platforms = { :ios => "9.0", :tvos => "9.0" } - s.source = { :git => "https://github.com/react-native-ar/react-native-arkit"", :tag => "v#{s.version}" } + s.source = { :git => "https://github.com/react-native-ar/react-native-arkit"", :tag => #{s.version}" } s.source_files = 'RCTARKitManager/**/*.{h,m}' s.preserve_paths = "**/*.js" s.dependency 'React' From 84dc8e230f52037d18f8d777c02c24289bc50816 Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Wed, 15 Jan 2020 12:05:22 -0500 Subject: [PATCH 03/12] fixing podspec --- ios/RCTARKit.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/RCTARKit.podspec b/ios/RCTARKit.podspec index e9f303be..db4ae68b 100644 --- a/ios/RCTARKit.podspec +++ b/ios/RCTARKit.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.author = { "macrozone" => "https://github.com/macrozone" } s.platforms = { :ios => "9.0", :tvos => "9.0" } s.source = { :git => "https://github.com/react-native-ar/react-native-arkit"", :tag => #{s.version}" } - s.source_files = 'RCTARKitManager/**/*.{h,m}' + s.source_files = '**/*.{h,m}' s.preserve_paths = "**/*.js" s.dependency 'React' From 76729abfdc282afa4fc12515adf4c55b713cc6c1 Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Mon, 27 Jan 2020 22:32:17 -0500 Subject: [PATCH 04/12] peer browser working with 2 phones connecting and getting and sending worldmap.. extreme wip --- .DS_Store | Bin 0 -> 8196 bytes ios/.DS_Store | Bin 0 -> 6148 bytes ios/RCTARKit.h | 4 + ios/RCTARKit.m | 17 +++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ ios/RCTARKitManager.m | 52 +++++++ ios/RCTMultiPeer.h | 43 ++++++ ios/RCTMultiPeer.m | 132 ++++++++++++++++++ 8 files changed, 256 insertions(+) create mode 100644 .DS_Store create mode 100644 ios/.DS_Store create mode 100644 ios/RCTARKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/RCTMultiPeer.h create mode 100644 ios/RCTMultiPeer.m diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7a2506fc5cd7b1d61c68f3349aa400ca81ec2a9d GIT binary patch literal 8196 zcmeHM-A)rh6h1?%Yzqc7DqQZ3i5Ey9{$OHEYH8I*1!JpTD1mObfy%N=x?2j?n%?*f z@(MnQkKlv&0Q#Mop=`Iy4Ht&QnPle7&YW+~*>BEtIRg=iV#i%3nkOO)mF4Udnv}xx zT*u0U9=QQ2fG3J*kv>sa@q)&fwiz%C7zPXjh5^HXVc;S#fNwSz>x}Qdnl-Iqz%cM% zGQhtNHY&@4mIEc_PX`*A0zhUlEDQR`10=@QvY_QaNeRW8DtizbDs+k=6ddz5t3wvF z94M*aBov&4wk&jpBBXWTY^hG7prmOH1BQWd1~_-O=n1`{7u1U9?~WHZnB(L02=(?K zSYC9K`iA(&vPA z`K~EiPB+}wKK^v}y;c}4E&UP`ne3&@la`gY@>lX3)t#VQjp|V+EY{l}_~~^$+HrKh z76jg~Uw7WMn%&LW>#Knu)mwhEEx|3f36+oUTfQ4~i$TYCL%B{>O;}dW%5Bcx?DZZl z*!S+5yPkqW^pD_ji25>4YYDMiJ}cr!5K|Pwvo^fs^A*a7 z96Mzk>EbZPM;@9H-mZ5sjuu?^@y9UOcMK5Ol&?(T-n49#rW0veCyL;(ttXu0;<5W0&C%NDD{8u>;8Y4q*tndD)6TiF#Rmg zCfri2t)0zDt+n)1x|rm(0p}D>d?{wGl;SPAH^!|@h-t(&AR{#W5%4nTpbGq`0w0TC BMTY + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/RCTARKitManager.m b/ios/RCTARKitManager.m index 2df43c4c..e182380a 100644 --- a/ios/RCTARKitManager.m +++ b/ios/RCTARKitManager.m @@ -12,7 +12,11 @@ #import #import #import "color-grabber.h" +#import "RCTMultiPeer.h" +@interface RCTARKitManager () + +@end @implementation RCTARKitManager RCT_EXPORT_MODULE() @@ -179,6 +183,7 @@ - (NSDictionary *)constantsToExport RCT_EXPORT_VIEW_PROPERTY(onTapOnPlaneNoExtent, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onEvent, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onARKitError, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(worldMap, NSObject); RCT_EXPORT_METHOD(pause:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { [[ARKit sharedInstance] pause]; @@ -199,6 +204,33 @@ - (NSDictionary *)constantsToExport resolve(@([ARKit isInitialized])); } +RCT_EXPORT_METHOD(findMultiPeerSession:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + dispatch_async(dispatch_get_main_queue(), ^{ + [ARKit sharedInstance].multipeer.mpBrowser.delegate = self; + UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; + + [rootViewController presentViewController:[ARKit sharedInstance].multipeer.mpBrowser animated: YES completion:^{ + // TODO: have a onPreviewVisible callback + }]; + }); +} + +RCT_EXPORT_METHOD(sendWorldmapData:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + [[ARKit sharedInstance] getCurrentWorldMap:resolve reject:reject]; +// resolve([[ARKit sharedInstance] getCurrentWorldMap:resolve reject:reject]); +// dispatch_async(dispatch_get_main_queue(), ^{ +// ARSession *session = [ARKit sharedInstance]; +// [session getCurrentWorldMapWithCompletionHandler:^(ARWorldMap * _Nullable worldMap, NSError * _Nullable error) { +// if (error) { +// NSLog(@"error====%@",error); +// } +// +// NSData *data = [NSKeyedArchiver archivedDataWithRootObject:worldMap requiringSecureCoding:true error:nil]; +// [[ARKit sharedInstance].multipeer sendToAllPeers:data]; +// }]; +// }); +} + RCT_EXPORT_METHOD(isMounted:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { if( [ARKit isInitialized]) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -398,4 +430,24 @@ - (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTP resolve(@{}); } +- (void)browserViewControllerDidFinish:(nonnull MCBrowserViewController *)browserViewController { + dispatch_async(dispatch_get_main_queue(), ^{ + UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; + + [rootViewController dismissViewControllerAnimated:YES completion:^{ + + }]; + }); +} + +- (void)browserViewControllerWasCancelled:(nonnull MCBrowserViewController *)browserViewController { + dispatch_async(dispatch_get_main_queue(), ^{ + UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; + + [rootViewController dismissViewControllerAnimated:YES completion:^{ + + }]; + }); +} + @end diff --git a/ios/RCTMultiPeer.h b/ios/RCTMultiPeer.h new file mode 100644 index 00000000..3d17c6db --- /dev/null +++ b/ios/RCTMultiPeer.h @@ -0,0 +1,43 @@ +// +// MultipeerConnectivity.h +// ARKit +// +// Created by Mac on 2018/6/5. +// Copyright © 2018年 AR. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol MultipeerConnectivityDelegate +@optional + +- (void)receivedDataHandler:(NSData *)data PeerID:(MCPeerID *)peerID; + +@end + +@interface MultipeerConnectivity : NSObject + +@property(nonatomic, strong)MCPeerID *myPeerID; + +@property(nonatomic, strong)MCSession *session; + +@property(nonatomic, strong)MCNearbyServiceAdvertiser *serviceAdvertiser; + +@property(nonatomic, strong)MCNearbyServiceBrowser *serviceBrowser; +@property(nonatomic, strong)MCBrowserViewController *mpBrowser; + +@property(nonatomic, weak)id delegate; +//@property(nonatomic, weak)id delegate; + +- (void)sendToAllPeers:(NSData *)data; + +- (void)findMultiPeerSession; + +- (NSArray *)connectedPeers; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/RCTMultiPeer.m b/ios/RCTMultiPeer.m new file mode 100644 index 00000000..399795af --- /dev/null +++ b/ios/RCTMultiPeer.m @@ -0,0 +1,132 @@ +// +// MultipeerConnectivity.m +// ARKit +// +// Created by Mac on 2018/6/5. +// Copyright © 2018年 AR. All rights reserved. +// + +#import "RCTMultiPeer.h" + +@interface MultipeerConnectivity () + +@end + +@implementation MultipeerConnectivity + +- (instancetype)init +{ + self = [super init]; + + if (self) { + NSString *serviceType = @"ar-multi-sample"; + + self.myPeerID = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name]; + + self.session = [[MCSession alloc] initWithPeer:self.myPeerID securityIdentity:nil encryptionPreference:MCEncryptionRequired]; + self.session.delegate = self; + + self.mpBrowser = [[MCBrowserViewController alloc] initWithServiceType:serviceType session:self.session]; + self.mpBrowser.delegate = self; + + self.serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.myPeerID discoveryInfo:nil serviceType:serviceType]; + self.serviceAdvertiser.delegate = self; + [self.serviceAdvertiser startAdvertisingPeer]; + + self.serviceBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:self.myPeerID serviceType:serviceType]; + self.serviceBrowser.delegate = self; + [self.serviceBrowser startBrowsingForPeers]; + } + + return self; +} + +- (void)findMultiPeerSession { + NSLog(@"FIND MUltiPeer sessIonn?"); +} + +- (void)sendToAllPeers:(NSData *)data +{ + @try { + [self.session sendData:data toPeers:self.session.connectedPeers withMode:MCSessionSendDataReliable error:nil]; + } @catch (NSException *exception) { + NSLog(@"error sending data to peers: \(error.localizedDescription)"); + } @finally { + + } +} + +- (NSArray *)connectedPeers +{ + return self.session.connectedPeers; +} + +#pragma mark MCSessionDelegate + +// Remote peer changed state. +- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state +{ + +} + +// Received data from remote peer. +- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID +{ + if (self.delegate && [self.delegate respondsToSelector:@selector(receivedDataHandler:PeerID:)]) { + [self.delegate receivedDataHandler:data PeerID:peerID]; + } +} + +// Received a byte stream from remote peer. +- (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID +{ + assert(@"This service does not send/receive streams."); +} + +// Start receiving a resource from remote peer. +- (void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress +{ + assert(@"This service does not send/receive resources."); +} + +// Finished receiving a resource from remote peer and saved the content +// in a temporary location - the app is responsible for moving the file +// to a permanent location within its sandbox. +- (void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(nullable NSURL *)localURL withError:(nullable NSError *)error +{ + assert(@"This service does not send/receive resources."); +} + +#pragma mark MCNearbyServiceBrowserDelegate +// Found a nearby advertising peer. +- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(nullable NSDictionary *)info +{ + // Invite the new peer to the session. + [browser invitePeer:peerID toSession:self.session withContext:nil timeout:10]; +} + +// A nearby peer has stopped advertising. +- (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID +{ + // This app doesn't do anything with non-invited peers, so there's nothing to do here. +} + +#pragma mark MCNearbyServiceAdvertiserDelegate +// Incoming invitation request. Call the invitationHandler block with YES +// and a valid session to connect the inviting peer to the session. +- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(nullable NSData *)context invitationHandler:(void (^)(BOOL accept, MCSession * __nullable session))invitationHandler +{ + // Call handler to accept invitation and join the session. + invitationHandler(true, self.session); +} + +- (void)browserViewControllerDidFinish:(nonnull MCBrowserViewController *)browserViewController { + +} + +- (void)browserViewControllerWasCancelled:(nonnull MCBrowserViewController *)browserViewController { + +} + +@end + From 5437a4f2be7f67be08ebc41dc4efa205ed992d7a Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Mon, 27 Jan 2020 22:47:59 -0500 Subject: [PATCH 05/12] worldmap syncs on two devices! dont use this yet --- ios/RCTARKit.h | 1 + ios/RCTARKit.m | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/ios/RCTARKit.h b/ios/RCTARKit.h index ab34915b..6abcf94e 100644 --- a/ios/RCTARKit.h +++ b/ios/RCTARKit.h @@ -30,6 +30,7 @@ typedef void (^RCTARKitReject)(NSString *code, NSString *message, NSError *error @property (nonatomic, strong) NSMutableArray> *touchDelegates; @property (nonatomic, strong) NSMutableArray> *rendererDelegates; @property (nonatomic, strong) NSMutableArray> *sessionDelegates; +@property (nonatomic, strong) NSMutableArray> *multipeerDelegate; #pragma mark - Properties diff --git a/ios/RCTARKit.m b/ios/RCTARKit.m index 099e8773..0b39bfdd 100644 --- a/ios/RCTARKit.m +++ b/ios/RCTARKit.m @@ -12,7 +12,7 @@ @import CoreLocation; -@interface RCTARKit () { +@interface RCTARKit () { RCTARKitResolve _resolve; } @@ -53,6 +53,7 @@ + (instancetype)sharedInstance { ARSCNView *arView = [[ARSCNView alloc] init]; MultipeerConnectivity *multipeer = [[MultipeerConnectivity alloc] init]; instance = [[self alloc] initWithARView:arView]; + multipeer.delegate = instance; instance.multipeer = multipeer; } }); @@ -61,7 +62,6 @@ + (instancetype)sharedInstance { } - (bool)isMounted { - return self.superview != nil; } @@ -106,7 +106,35 @@ - (instancetype)initWithARView:(ARSCNView *)arView { return self; } - +- (void)receivedDataHandler:(NSData *)data PeerID:(MCPeerID *)peerID +{ + id unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[ARWorldMap classForKeyedUnarchiver] fromData:data error:nil]; + + if ([unarchived isKindOfClass:[ARWorldMap class]]) { + NSLog(@"[unarchived class]====%@",[unarchived class]); + ARWorldMap *worldMap = unarchived; + self.configuration = [[ARWorldTrackingConfiguration alloc] init]; + self.configuration.worldAlignment = ARWorldAlignmentGravity; + self.configuration.planeDetection = ARPlaneDetectionHorizontal|ARPlaneDetectionVertical; + self.configuration.initialWorldMap = worldMap; + [self.arView.session runWithConfiguration:self.configuration options:ARSessionRunOptionResetTracking|ARSessionRunOptionRemoveExistingAnchors]; + + return; + } + + unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[ARAnchor classForKeyedUnarchiver] fromData:data error:nil]; + + if ([unarchived isKindOfClass:[ARAnchor class]]) { + NSLog(@"[unarchived class]====%@",[unarchived class]); + ARAnchor *anchor = unarchived; + + [self.arView.session addAnchor:anchor]; + + return; + } + + NSLog(@"unknown data recieved from \(%@)",peerID.displayName); +} - (void)layoutSubviews { From c29b0ddef4802e973ba2434429ca6431a84a8e5b Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Tue, 28 Jan 2020 21:54:10 -0500 Subject: [PATCH 06/12] exposes commands to js for hosting a multipeer session with a serviceType(stringid) and also joining a session by serviceType(stringid) and opening the browser of connected peers --- ios/RCTARKitManager.m | 29 +++++++++------------------ ios/RCTMultiPeer.h | 5 +++-- ios/RCTMultiPeer.m | 46 +++++++++++++++++++++++++++++-------------- 3 files changed, 43 insertions(+), 37 deletions(-) diff --git a/ios/RCTARKitManager.m b/ios/RCTARKitManager.m index e182380a..895ea62e 100644 --- a/ios/RCTARKitManager.m +++ b/ios/RCTARKitManager.m @@ -204,31 +204,20 @@ - (NSDictionary *)constantsToExport resolve(@([ARKit isInitialized])); } -RCT_EXPORT_METHOD(findMultiPeerSession:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { - dispatch_async(dispatch_get_main_queue(), ^{ - [ARKit sharedInstance].multipeer.mpBrowser.delegate = self; - UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; +RCT_EXPORT_METHOD(findMultiPeerSession:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + [[ARKit sharedInstance].multipeer openMultipeerBrowser:serviceType]; +} - [rootViewController presentViewController:[ARKit sharedInstance].multipeer.mpBrowser animated: YES completion:^{ - // TODO: have a onPreviewVisible callback - }]; - }); +RCT_EXPORT_METHOD(startBrowsingForPeers:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + [[ARKit sharedInstance].multipeer startBrowsingForPeers:serviceType]; +} + +RCT_EXPORT_METHOD(advertiseReadyToJoinSession:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + [[ARKit sharedInstance].multipeer advertiseReadyToJoinSession:serviceType]; } RCT_EXPORT_METHOD(sendWorldmapData:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { [[ARKit sharedInstance] getCurrentWorldMap:resolve reject:reject]; -// resolve([[ARKit sharedInstance] getCurrentWorldMap:resolve reject:reject]); -// dispatch_async(dispatch_get_main_queue(), ^{ -// ARSession *session = [ARKit sharedInstance]; -// [session getCurrentWorldMapWithCompletionHandler:^(ARWorldMap * _Nullable worldMap, NSError * _Nullable error) { -// if (error) { -// NSLog(@"error====%@",error); -// } -// -// NSData *data = [NSKeyedArchiver archivedDataWithRootObject:worldMap requiringSecureCoding:true error:nil]; -// [[ARKit sharedInstance].multipeer sendToAllPeers:data]; -// }]; -// }); } RCT_EXPORT_METHOD(isMounted:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { diff --git a/ios/RCTMultiPeer.h b/ios/RCTMultiPeer.h index 3d17c6db..e09177ee 100644 --- a/ios/RCTMultiPeer.h +++ b/ios/RCTMultiPeer.h @@ -30,11 +30,12 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, strong)MCBrowserViewController *mpBrowser; @property(nonatomic, weak)id delegate; -//@property(nonatomic, weak)id delegate; - (void)sendToAllPeers:(NSData *)data; -- (void)findMultiPeerSession; +- (void)startBrowsingForPeers:(NSString *)serviceType; +- (void)advertiseReadyToJoinSession:(NSString *)serviceType; +- (void)openMultipeerBrowser:(NSString *)serviceType; - (NSArray *)connectedPeers; diff --git a/ios/RCTMultiPeer.m b/ios/RCTMultiPeer.m index 399795af..221bf3d8 100644 --- a/ios/RCTMultiPeer.m +++ b/ios/RCTMultiPeer.m @@ -19,30 +19,46 @@ - (instancetype)init self = [super init]; if (self) { - NSString *serviceType = @"ar-multi-sample"; - self.myPeerID = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name]; self.session = [[MCSession alloc] initWithPeer:self.myPeerID securityIdentity:nil encryptionPreference:MCEncryptionRequired]; self.session.delegate = self; - - self.mpBrowser = [[MCBrowserViewController alloc] initWithServiceType:serviceType session:self.session]; - self.mpBrowser.delegate = self; - - self.serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.myPeerID discoveryInfo:nil serviceType:serviceType]; - self.serviceAdvertiser.delegate = self; - [self.serviceAdvertiser startAdvertisingPeer]; - - self.serviceBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:self.myPeerID serviceType:serviceType]; - self.serviceBrowser.delegate = self; - [self.serviceBrowser startBrowsingForPeers]; } return self; } -- (void)findMultiPeerSession { - NSLog(@"FIND MUltiPeer sessIonn?"); +- (void)startBrowsingForPeers:(NSString *)serviceType +{ + // browseForSessions + // this starts the multi peer service looking for peers that are looking for it's service type (string id) + + self.serviceBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:self.myPeerID serviceType:serviceType]; + self.serviceBrowser.delegate = self; + [self.serviceBrowser startBrowsingForPeers]; +} + +- (void)advertiseReadyToJoinSession:(NSString *)serviceType +{ + self.serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.myPeerID discoveryInfo:nil serviceType:serviceType]; + self.serviceAdvertiser.delegate = self; + [self.serviceAdvertiser startAdvertisingPeer]; +} + +- (void)openMultipeerBrowser:(NSString *)serviceType +{ + if (!self.mpBrowser) { + self.mpBrowser = [[MCBrowserViewController alloc] initWithServiceType:serviceType session:self.session]; + self.mpBrowser.delegate = self; + } + dispatch_async(dispatch_get_main_queue(), ^{ + self.mpBrowser.delegate = self; + UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; + + [rootViewController presentViewController:self.mpBrowser animated: YES completion:^{ + // TODO: have a onPreviewVisible callback + }]; + }); } - (void)sendToAllPeers:(NSData *)data From 955b3d1854617abb35e398e24b66a50b4945e567 Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Wed, 29 Jan 2020 22:03:05 -0500 Subject: [PATCH 07/12] added stuff for sending JSON over multi peer to all peers --- ios/RCTARKit.h | 4 +++ ios/RCTARKit.m | 64 ++++++++++++++++++++++++++++--------------- ios/RCTARKitManager.m | 26 +++++++++++++++++- ios/RCTMultiPeer.m | 3 +- 4 files changed, 72 insertions(+), 25 deletions(-) diff --git a/ios/RCTARKit.h b/ios/RCTARKit.h index 6abcf94e..8afb1a1b 100644 --- a/ios/RCTARKit.h +++ b/ios/RCTARKit.h @@ -64,6 +64,10 @@ typedef void (^RCTARKitReject)(NSString *code, NSString *message, NSError *error @property (nonatomic, copy) RCTBubblingEventBlock onEvent; @property (nonatomic, copy) RCTBubblingEventBlock onARKitError; +@property (nonatomic, copy) RCTBubblingEventBlock onMultipeerJsonDataReceived; + + + @property NSMutableDictionary *planes; // plane detected diff --git a/ios/RCTARKit.m b/ios/RCTARKit.m index 0b39bfdd..7f897c5f 100644 --- a/ios/RCTARKit.m +++ b/ios/RCTARKit.m @@ -108,32 +108,52 @@ - (instancetype)initWithARView:(ARSCNView *)arView { - (void)receivedDataHandler:(NSData *)data PeerID:(MCPeerID *)peerID { - id unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[ARWorldMap classForKeyedUnarchiver] fromData:data error:nil]; - - if ([unarchived isKindOfClass:[ARWorldMap class]]) { - NSLog(@"[unarchived class]====%@",[unarchived class]); - ARWorldMap *worldMap = unarchived; - self.configuration = [[ARWorldTrackingConfiguration alloc] init]; - self.configuration.worldAlignment = ARWorldAlignmentGravity; - self.configuration.planeDetection = ARPlaneDetectionHorizontal|ARPlaneDetectionVertical; - self.configuration.initialWorldMap = worldMap; - [self.arView.session runWithConfiguration:self.configuration options:ARSessionRunOptionResetTracking|ARSessionRunOptionRemoveExistingAnchors]; + id parsedJSON; + @try { + NSError *error = nil; + parsedJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; + } @catch (NSException *exception) { + // TODO: make a onMultipeerDataFailure callback + } @finally { - return; } - unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[ARAnchor classForKeyedUnarchiver] fromData:data error:nil]; - - if ([unarchived isKindOfClass:[ARAnchor class]]) { - NSLog(@"[unarchived class]====%@",[unarchived class]); - ARAnchor *anchor = unarchived; - - [self.arView.session addAnchor:anchor]; - - return; + if (parsedJSON) { + if (self.onMultipeerJsonDataReceived) { + dispatch_async(dispatch_get_main_queue(), ^{ + self.onMultipeerJsonDataReceived(@{ + @"data": parsedJSON, + }); + }); + } + } else { + id unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[ARWorldMap classForKeyedUnarchiver] fromData:data error:nil]; + + if ([unarchived isKindOfClass:[ARWorldMap class]]) { + NSLog(@"[unarchived class]====%@",[unarchived class]); + ARWorldMap *worldMap = unarchived; + self.configuration = [[ARWorldTrackingConfiguration alloc] init]; + self.configuration.worldAlignment = ARWorldAlignmentGravity; + self.configuration.planeDetection = ARPlaneDetectionHorizontal|ARPlaneDetectionVertical; + self.configuration.initialWorldMap = worldMap; + [self.arView.session runWithConfiguration:self.configuration options:ARSessionRunOptionResetTracking|ARSessionRunOptionRemoveExistingAnchors]; + + return; + } + + unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[ARAnchor classForKeyedUnarchiver] fromData:data error:nil]; + + if ([unarchived isKindOfClass:[ARAnchor class]]) { + NSLog(@"[unarchived class]====%@",[unarchived class]); + ARAnchor *anchor = unarchived; + + [self.arView.session addAnchor:anchor]; + + return; + } + + NSLog(@"unknown data recieved from \(%@)",peerID.displayName); } - - NSLog(@"unknown data recieved from \(%@)",peerID.displayName); } diff --git a/ios/RCTARKitManager.m b/ios/RCTARKitManager.m index 895ea62e..6895bbc4 100644 --- a/ios/RCTARKitManager.m +++ b/ios/RCTARKitManager.m @@ -176,6 +176,8 @@ - (NSDictionary *)constantsToExport RCT_EXPORT_VIEW_PROPERTY(onAnchorUpdated, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onAnchorRemoved, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onMultipeerJsonDataReceived, RCTBubblingEventBlock) + RCT_EXPORT_VIEW_PROPERTY(onTrackingState, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onFeaturesDetected, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onLightEstimation, RCTBubblingEventBlock) @@ -204,7 +206,7 @@ - (NSDictionary *)constantsToExport resolve(@([ARKit isInitialized])); } -RCT_EXPORT_METHOD(findMultiPeerSession:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { +RCT_EXPORT_METHOD(openMultipeerBrowser:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { [[ARKit sharedInstance].multipeer openMultipeerBrowser:serviceType]; } @@ -216,6 +218,11 @@ - (NSDictionary *)constantsToExport [[ARKit sharedInstance].multipeer advertiseReadyToJoinSession:serviceType]; } +RCT_EXPORT_METHOD(sendDataToAllPeers:(NSDictionary *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + [self sendData:[RCTARKit sharedInstance].multipeer.connectedPeers data:data callback:resolve]; +} + +// TODO: Should only be able to do if host ? Or thats a config option RCT_EXPORT_METHOD(sendWorldmapData:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { [[ARKit sharedInstance] getCurrentWorldMap:resolve reject:reject]; } @@ -249,6 +256,23 @@ - (NSDictionary *)constantsToExport [[ARKit sharedInstance] hitTestSceneObjects:point resolve:resolve reject:reject]; } +- (void)sendData:(NSArray *)recipients data:(NSDictionary *)data callback:(RCTResponseSenderBlock)callback { + NSError *error = nil; + NSMutableArray *peers = [NSMutableArray array]; +// for (NSString *peerUUID in recipients) { +// [peers addObject:[[ARKit sharedInstance].multipeer.session.connectedPeers valueForKey:peerUUID]]; +// } + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:0 error:&error]; + [[ARKit sharedInstance].multipeer.session sendData:jsonData toPeers:recipients withMode:MCSessionSendDataReliable error:&error]; + NSLog(@"Sending data..."); + if (error == nil) { + callback(@[[NSNull null]]); + } + else { + callback(@[[error description]]); + } +} + diff --git a/ios/RCTMultiPeer.m b/ios/RCTMultiPeer.m index 221bf3d8..5a64cd7b 100644 --- a/ios/RCTMultiPeer.m +++ b/ios/RCTMultiPeer.m @@ -19,7 +19,7 @@ - (instancetype)init self = [super init]; if (self) { - self.myPeerID = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name]; + self.myPeerID = [[MCPeerID alloc] initWithDisplayName:[[NSUUID UUID] UUIDString]]; self.session = [[MCSession alloc] initWithPeer:self.myPeerID securityIdentity:nil encryptionPreference:MCEncryptionRequired]; self.session.delegate = self; @@ -52,7 +52,6 @@ - (void)openMultipeerBrowser:(NSString *)serviceType self.mpBrowser.delegate = self; } dispatch_async(dispatch_get_main_queue(), ^{ - self.mpBrowser.delegate = self; UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; [rootViewController presentViewController:self.mpBrowser animated: YES completion:^{ From 41f315c5a0580b8ab4a6041033fe016bbad79c03 Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Wed, 29 Jan 2020 22:21:40 -0500 Subject: [PATCH 08/12] added a function for js to send json to array of connected peer ids --- ios/RCTARKitManager.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ios/RCTARKitManager.m b/ios/RCTARKitManager.m index 6895bbc4..36c100fd 100644 --- a/ios/RCTARKitManager.m +++ b/ios/RCTARKitManager.m @@ -218,11 +218,22 @@ - (NSDictionary *)constantsToExport [[ARKit sharedInstance].multipeer advertiseReadyToJoinSession:serviceType]; } +// TODO: Should be optionally to only be available to host RCT_EXPORT_METHOD(sendDataToAllPeers:(NSDictionary *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { [self sendData:[RCTARKit sharedInstance].multipeer.connectedPeers data:data callback:resolve]; } -// TODO: Should only be able to do if host ? Or thats a config option +// TODO: Should be optional to lock it down so peers can only send to host +RCT_EXPORT_METHOD(sendDataToPeers:(NSDictionary *)data recepientPeerIDs:(NSArray *)recepientPeerIDs resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + NSError *error = nil; + NSMutableArray *peers = [NSMutableArray array]; + for (NSString *peerUUID in recepientPeerIDs) { + [peers addObject:[[RCTARKit sharedInstance].multipeer.connectedPeers valueForKey:peerUUID]]; + } + [self sendData:[RCTARKit sharedInstance].multipeer.connectedPeers data:data callback:resolve]; +} + +// TODO: Should be optional to only be available to host RCT_EXPORT_METHOD(sendWorldmapData:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { [[ARKit sharedInstance] getCurrentWorldMap:resolve reject:reject]; } From 796bc2e2509085e7e6856693ee1fb0fa72014c78 Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Thu, 30 Jan 2020 19:12:19 -0500 Subject: [PATCH 09/12] adds onPeerConnecting, onPeerConnected and onPeerDisconnected and passed the peer's uuid to the event cb --- ios/RCTARKit.h | 4 ++++ ios/RCTARKit.m | 2 +- ios/RCTARKitManager.m | 10 ++++++++++ ios/RCTMultiPeer.h | 12 ++++++++++- ios/RCTMultiPeer.m | 46 +++++++++++++++++++++++++++++++++++++++---- 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/ios/RCTARKit.h b/ios/RCTARKit.h index 8afb1a1b..0c96997c 100644 --- a/ios/RCTARKit.h +++ b/ios/RCTARKit.h @@ -64,6 +64,10 @@ typedef void (^RCTARKitReject)(NSString *code, NSString *message, NSError *error @property (nonatomic, copy) RCTBubblingEventBlock onEvent; @property (nonatomic, copy) RCTBubblingEventBlock onARKitError; +@property (nonatomic, copy) RCTBubblingEventBlock onPeerConnected; +@property (nonatomic, copy) RCTBubblingEventBlock onPeerConnecting; +@property (nonatomic, copy) RCTBubblingEventBlock onPeerDisconnected; + @property (nonatomic, copy) RCTBubblingEventBlock onMultipeerJsonDataReceived; diff --git a/ios/RCTARKit.m b/ios/RCTARKit.m index 7f897c5f..cec116be 100644 --- a/ios/RCTARKit.m +++ b/ios/RCTARKit.m @@ -151,7 +151,7 @@ - (void)receivedDataHandler:(NSData *)data PeerID:(MCPeerID *)peerID return; } - + NSLog(@"unknown data recieved from \(%@)",peerID.displayName); } } diff --git a/ios/RCTARKitManager.m b/ios/RCTARKitManager.m index 36c100fd..27a8ae1e 100644 --- a/ios/RCTARKitManager.m +++ b/ios/RCTARKitManager.m @@ -178,6 +178,11 @@ - (NSDictionary *)constantsToExport RCT_EXPORT_VIEW_PROPERTY(onMultipeerJsonDataReceived, RCTBubblingEventBlock) +// TODO: Option to lock these three below down for host only +RCT_EXPORT_VIEW_PROPERTY(onPeerConnected, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onPeerConnecting, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onPeerDisconnected, RCTBubblingEventBlock) + RCT_EXPORT_VIEW_PROPERTY(onTrackingState, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onFeaturesDetected, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onLightEstimation, RCTBubblingEventBlock) @@ -238,6 +243,11 @@ - (NSDictionary *)constantsToExport [[ARKit sharedInstance] getCurrentWorldMap:resolve reject:reject]; } +// TODO: Should be optional to only be available to host +RCT_EXPORT_METHOD(getAllConnectedPeers:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + //TODO: get all peer ids +} + RCT_EXPORT_METHOD(isMounted:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { if( [ARKit isInitialized]) { dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/ios/RCTMultiPeer.h b/ios/RCTMultiPeer.h index e09177ee..1d455f1e 100644 --- a/ios/RCTMultiPeer.h +++ b/ios/RCTMultiPeer.h @@ -11,6 +11,10 @@ NS_ASSUME_NONNULL_BEGIN +typedef void (^RCTBubblingEventBlock)(NSDictionary *body); +typedef void (^RCTARKitResolve)(id result); +typedef void (^RCTARKitReject)(NSString *code, NSString *message, NSError *error); + @protocol MultipeerConnectivityDelegate @optional @@ -18,7 +22,7 @@ NS_ASSUME_NONNULL_BEGIN @end -@interface MultipeerConnectivity : NSObject +@interface MultipeerConnectivity : UIView @property(nonatomic, strong)MCPeerID *myPeerID; @@ -29,6 +33,8 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, strong)MCNearbyServiceBrowser *serviceBrowser; @property(nonatomic, strong)MCBrowserViewController *mpBrowser; +@property(nonatomic, strong)NSMutableDictionary *connectedPeersDictionary; + @property(nonatomic, weak)id delegate; - (void)sendToAllPeers:(NSData *)data; @@ -37,6 +43,10 @@ NS_ASSUME_NONNULL_BEGIN - (void)advertiseReadyToJoinSession:(NSString *)serviceType; - (void)openMultipeerBrowser:(NSString *)serviceType; +//@property (nonatomic, copy) RCTBubblingEventBlock onPeerConnected; +//@property (nonatomic, copy) RCTBubblingEventBlock onPeerConnecting; +//@property (nonatomic, copy) RCTBubblingEventBlock onPeerDisconnected; + - (NSArray *)connectedPeers; @end diff --git a/ios/RCTMultiPeer.m b/ios/RCTMultiPeer.m index 5a64cd7b..24d7ea0d 100644 --- a/ios/RCTMultiPeer.m +++ b/ios/RCTMultiPeer.m @@ -7,8 +7,11 @@ // #import "RCTMultiPeer.h" +#import "RCTARKit.h" -@interface MultipeerConnectivity () +@interface MultipeerConnectivity () { + RCTARKitResolve _resolve; +} @end @@ -23,6 +26,7 @@ - (instancetype)init self.session = [[MCSession alloc] initWithPeer:self.myPeerID securityIdentity:nil encryptionPreference:MCEncryptionRequired]; self.session.delegate = self; + self.connectedPeersDictionary = [NSMutableDictionary dictionary]; } return self; @@ -78,10 +82,44 @@ - (void)sendToAllPeers:(NSData *)data #pragma mark MCSessionDelegate -// Remote peer changed state. -- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state -{ +- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state { + // don't react to own state changes + if ([peerID.displayName isEqualToString:self.myPeerID.displayName]) return; + if (state == MCSessionStateConnected) { + [self.connectedPeersDictionary setValue:peerID forKey:peerID.displayName]; + if ([ARKit sharedInstance].onPeerConnected) { + dispatch_async(dispatch_get_main_queue(), ^{ + [ARKit sharedInstance].onPeerConnected(@{ + @"peer": @{ + @"id": peerID.displayName + } + }); + }); + } + } + else if (state == MCSessionStateConnecting) { + if ([ARKit sharedInstance].onPeerConnecting) { + dispatch_async(dispatch_get_main_queue(), ^{ + [ARKit sharedInstance].onPeerConnecting(@{ + @"peer": @{ + @"id": peerID.displayName + } + }); + }); + } + } + else if (state == MCSessionStateNotConnected) { + if ([ARKit sharedInstance].onPeerDisconnected) { + dispatch_async(dispatch_get_main_queue(), ^{ + [ARKit sharedInstance].onPeerDisconnected(@{ + @"peer": @{ + @"id": peerID.displayName + } + }); + }); + } + } } // Received data from remote peer. From d5933caecf854d17b62afe46d1be72a6a12fbaca Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Sat, 1 Feb 2020 18:26:23 -0500 Subject: [PATCH 10/12] exposes getFrontOfCamera to js --- ios/RCTARKitManager.m | 36 +++++++++++++++++++++++------------- ios/RCTMultiPeer.h | 2 +- ios/RCTMultiPeer.m | 11 +++++++++++ 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/ios/RCTARKitManager.m b/ios/RCTARKitManager.m index 27a8ae1e..0484c265 100644 --- a/ios/RCTARKitManager.m +++ b/ios/RCTARKitManager.m @@ -219,23 +219,22 @@ - (NSDictionary *)constantsToExport [[ARKit sharedInstance].multipeer startBrowsingForPeers:serviceType]; } +RCT_EXPORT_METHOD(getFrontOfCameraPosition:resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + resolve(@{@"frontOfCamera": [ARKit sharedInstance].nodeManager.frontOfCamera}); +} + RCT_EXPORT_METHOD(advertiseReadyToJoinSession:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { [[ARKit sharedInstance].multipeer advertiseReadyToJoinSession:serviceType]; } // TODO: Should be optionally to only be available to host RCT_EXPORT_METHOD(sendDataToAllPeers:(NSDictionary *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { - [self sendData:[RCTARKit sharedInstance].multipeer.connectedPeers data:data callback:resolve]; + [self sendDataToAll:data callback:resolve]; } // TODO: Should be optional to lock it down so peers can only send to host -RCT_EXPORT_METHOD(sendDataToPeers:(NSDictionary *)data recepientPeerIDs:(NSArray *)recepientPeerIDs resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { - NSError *error = nil; - NSMutableArray *peers = [NSMutableArray array]; - for (NSString *peerUUID in recepientPeerIDs) { - [peers addObject:[[RCTARKit sharedInstance].multipeer.connectedPeers valueForKey:peerUUID]]; - } - [self sendData:[RCTARKit sharedInstance].multipeer.connectedPeers data:data callback:resolve]; +RCT_EXPORT_METHOD(sendDataToPeer:(NSDictionary *)data recipientId:(NSString *)recipientId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + [self sendData:recipientId data:data callback:resolve]; } // TODO: Should be optional to only be available to host @@ -277,12 +276,23 @@ - (NSDictionary *)constantsToExport [[ARKit sharedInstance] hitTestSceneObjects:point resolve:resolve reject:reject]; } -- (void)sendData:(NSArray *)recipients data:(NSDictionary *)data callback:(RCTResponseSenderBlock)callback { +- (void)sendDataToAll:(NSDictionary *)data callback:(RCTResponseSenderBlock)callback { + NSError *error = nil; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:0 error:&error]; + [[ARKit sharedInstance].multipeer.session sendData:jsonData toPeers:[RCTARKit sharedInstance].multipeer.session.connectedPeers withMode:MCSessionSendDataReliable error:&error]; + NSLog(@"Sending data..."); + if (error == nil) { + callback(@[[NSNull null]]); + } + else { + callback(@[[error description]]); + } +} + +- (void)sendData:(NSString *)recipient data:(NSDictionary *)data callback:(RCTResponseSenderBlock)callback { NSError *error = nil; - NSMutableArray *peers = [NSMutableArray array]; -// for (NSString *peerUUID in recipients) { -// [peers addObject:[[ARKit sharedInstance].multipeer.session.connectedPeers valueForKey:peerUUID]]; -// } + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"peerUUID == %@", recipient]; + NSArray *recipients = [[RCTARKit sharedInstance].multipeer.session.connectedPeers filteredArrayUsingPredicate:predicate]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:0 error:&error]; [[ARKit sharedInstance].multipeer.session sendData:jsonData toPeers:recipients withMode:MCSessionSendDataReliable error:&error]; NSLog(@"Sending data..."); diff --git a/ios/RCTMultiPeer.h b/ios/RCTMultiPeer.h index 1d455f1e..080933ae 100644 --- a/ios/RCTMultiPeer.h +++ b/ios/RCTMultiPeer.h @@ -22,7 +22,7 @@ typedef void (^RCTARKitReject)(NSString *code, NSString *message, NSError *error @end -@interface MultipeerConnectivity : UIView +@interface MultipeerConnectivity : NSObject @property(nonatomic, strong)MCPeerID *myPeerID; diff --git a/ios/RCTMultiPeer.m b/ios/RCTMultiPeer.m index 24d7ea0d..46f5a7e7 100644 --- a/ios/RCTMultiPeer.m +++ b/ios/RCTMultiPeer.m @@ -75,6 +75,17 @@ - (void)sendToAllPeers:(NSData *)data } } +- (void)sendToPeers:(NSArray *)recipients data:(NSData *)data +{ + @try { + [self.session sendData:data toPeers:recipients withMode:MCSessionSendDataReliable error:nil]; + } @catch (NSException *exception) { + NSLog(@"error sending data to peers: \(error.localizedDescription)"); + } @finally { + + } +} + - (NSArray *)connectedPeers { return self.session.connectedPeers; From 2a41081d63d0c2f0af359a2f299d0f21cd1593f5 Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Fri, 14 Feb 2020 21:30:23 -0500 Subject: [PATCH 11/12] Cleaning up some code --- ios/RCTARKit.m | 2 +- ios/RCTARKitManager.m | 8 ++++++++ ios/RCTARKitNodes.m | 2 +- ios/RCTMultiPeer.h | 12 ------------ ios/RCTMultiPeer.m | 8 -------- 5 files changed, 10 insertions(+), 22 deletions(-) diff --git a/ios/RCTARKit.m b/ios/RCTARKit.m index cec116be..a5ba8fd0 100644 --- a/ios/RCTARKit.m +++ b/ios/RCTARKit.m @@ -222,7 +222,7 @@ - (BOOL)debug { - (void)setDebug:(BOOL)debug { if (debug) { self.arView.showsStatistics = YES; - self.arView.debugOptions = ARSCNDebugOptionShowWorldOrigin | ARSCNDebugOptionShowFeaturePoints; + self.arView.debugOptions = ARSCNDebugOptionShowFeaturePoints; } else { self.arView.showsStatistics = NO; self.arView.debugOptions = SCNDebugOptionNone; diff --git a/ios/RCTARKitManager.m b/ios/RCTARKitManager.m index 0484c265..b5622572 100644 --- a/ios/RCTARKitManager.m +++ b/ios/RCTARKitManager.m @@ -223,6 +223,14 @@ - (NSDictionary *)constantsToExport resolve(@{@"frontOfCamera": [ARKit sharedInstance].nodeManager.frontOfCamera}); } +RCT_EXPORT_METHOD(getFrontOfCamera:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { + resolve(@{ + @"x": @([ARKit sharedInstance].nodeManager.frontOfCamera.position.x), + @"y": @([ARKit sharedInstance].nodeManager.frontOfCamera.position.y), + @"z": @([ARKit sharedInstance].nodeManager.frontOfCamera.position.z) + }); +} + RCT_EXPORT_METHOD(advertiseReadyToJoinSession:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { [[ARKit sharedInstance].multipeer advertiseReadyToJoinSession:serviceType]; } diff --git a/ios/RCTARKitNodes.m b/ios/RCTARKitNodes.m index 6379fb8a..b2d5640e 100644 --- a/ios/RCTARKitNodes.m +++ b/ios/RCTARKitNodes.m @@ -15,7 +15,7 @@ @implementation SCNNode (ReferenceFrame) @dynamic referenceFrame; @end -CGFloat focDistance = 0.2f; +CGFloat focDistance = 0.45f; @interface RCTARKitNodes () diff --git a/ios/RCTMultiPeer.h b/ios/RCTMultiPeer.h index 080933ae..9da32ab9 100644 --- a/ios/RCTMultiPeer.h +++ b/ios/RCTMultiPeer.h @@ -1,11 +1,3 @@ -// -// MultipeerConnectivity.h -// ARKit -// -// Created by Mac on 2018/6/5. -// Copyright © 2018年 AR. All rights reserved. -// - #import #import @@ -43,10 +35,6 @@ typedef void (^RCTARKitReject)(NSString *code, NSString *message, NSError *error - (void)advertiseReadyToJoinSession:(NSString *)serviceType; - (void)openMultipeerBrowser:(NSString *)serviceType; -//@property (nonatomic, copy) RCTBubblingEventBlock onPeerConnected; -//@property (nonatomic, copy) RCTBubblingEventBlock onPeerConnecting; -//@property (nonatomic, copy) RCTBubblingEventBlock onPeerDisconnected; - - (NSArray *)connectedPeers; @end diff --git a/ios/RCTMultiPeer.m b/ios/RCTMultiPeer.m index 46f5a7e7..3897dce4 100644 --- a/ios/RCTMultiPeer.m +++ b/ios/RCTMultiPeer.m @@ -1,11 +1,3 @@ -// -// MultipeerConnectivity.m -// ARKit -// -// Created by Mac on 2018/6/5. -// Copyright © 2018年 AR. All rights reserved. -// - #import "RCTMultiPeer.h" #import "RCTARKit.h" From 80446f28da2c1f869393ff76591d9e89430c2dec Mon Sep 17 00:00:00 2001 From: Matthew Thompson Date: Fri, 14 Feb 2020 21:51:40 -0500 Subject: [PATCH 12/12] remove DS_Store and add it to ignore and add some attribution and links --- .DS_Store | Bin 8196 -> 0 bytes .gitignore | 1 + ios/RCTMultiPeer.h | 6 ++++++ ios/RCTMultiPeer.m | 5 +++++ 4 files changed, 12 insertions(+) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 7a2506fc5cd7b1d61c68f3349aa400ca81ec2a9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHM-A)rh6h1?%Yzqc7DqQZ3i5Ey9{$OHEYH8I*1!JpTD1mObfy%N=x?2j?n%?*f z@(MnQkKlv&0Q#Mop=`Iy4Ht&QnPle7&YW+~*>BEtIRg=iV#i%3nkOO)mF4Udnv}xx zT*u0U9=QQ2fG3J*kv>sa@q)&fwiz%C7zPXjh5^HXVc;S#fNwSz>x}Qdnl-Iqz%cM% zGQhtNHY&@4mIEc_PX`*A0zhUlEDQR`10=@QvY_QaNeRW8DtizbDs+k=6ddz5t3wvF z94M*aBov&4wk&jpBBXWTY^hG7prmOH1BQWd1~_-O=n1`{7u1U9?~WHZnB(L02=(?K zSYC9K`iA(&vPA z`K~EiPB+}wKK^v}y;c}4E&UP`ne3&@la`gY@>lX3)t#VQjp|V+EY{l}_~~^$+HrKh z76jg~Uw7WMn%&LW>#Knu)mwhEEx|3f36+oUTfQ4~i$TYCL%B{>O;}dW%5Bcx?DZZl z*!S+5yPkqW^pD_ji25>4YYDMiJ}cr!5K|Pwvo^fs^A*a7 z96Mzk>EbZPM;@9H-mZ #import diff --git a/ios/RCTMultiPeer.m b/ios/RCTMultiPeer.m index 3897dce4..a6d1f952 100644 --- a/ios/RCTMultiPeer.m +++ b/ios/RCTMultiPeer.m @@ -1,3 +1,8 @@ +// Created by Matt Thompson on 01/25/20. +// MIT Licence. +// lwansbrough/react-native-multipeer +// https://developer.apple.com/documentation/arkit/creating_a_multiuser_ar_experience?language=objc + #import "RCTMultiPeer.h" #import "RCTARKit.h"