2014-05-31 2 views
1

Я некоторое время задерживался на этой проблеме. Я пытаюсь проверить многоуровневую структуру. И я пытаюсь сделать это без пользовательского интерфейса. Другими словами, я приглашаю других сверстников вручную через код. Я хочу, чтобы приложение могло появиться, и сверстники автоматически начинают искать друг друга и подключаться.Делегаты MultiPeer Framework не запускаются/работают (нет пользовательского интерфейса)

Для этого я создал класс с именем SideWaysManager, как так:

/** 
    SidewaysManager.m 
*/ 

#import "SidewaysManager.h" 
#import "EPBmyConfig.h" 

@implementation SidewaysManager 
{ 
    NSString *databasePath; 

    MCSession *currentSession; 

    MCNearbyServiceBrowser *nearbyBrowser; 

    MCNearbyServiceAdvertiser *nearbyAdvertiser; 

    NSString *serviceType; 
} 



- (id) init 
{ 

    self = [super init]; 

    if(self) 
    { 

     EPBmyConfig *configInfo = [EPBmyConfig instance]; 

     NSString *assetID = [configInfo getAssetID]; 

     NSString *useageLocation = [configInfo getUseageLocation]; 

     NSString *peerDisplayName = [@"PCTouchPad-" stringByAppendingString:assetID]; 

     if(![useageLocation isEqualToString:@""]) 
     { 
      peerDisplayName = [peerDisplayName stringByAppendingString: [NSString stringWithFormat:@"-%@", useageLocation]]; 
     } 

     MCPeerID *localPeerID = [[MCPeerID alloc] initWithDisplayName:peerDisplayName]; 

     currentSession = [[MCSession alloc] initWithPeer:localPeerID]; 
     currentSession.delegate = self; 

     serviceType = @"EPB-Session"; 

     nearbyBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:localPeerID serviceType:serviceType]; 
     nearbyBrowser.delegate = self; 

     nearbyAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:localPeerID discoveryInfo:nil serviceType:serviceType]; 
     nearbyAdvertiser.delegate = self; 


     NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

     NSString *documentDir = [documentPaths objectAtIndex:0]; 

     databasePath = [documentDir stringByAppendingString:@"/voterdb_Prod"]; 

     [nearbyAdvertiser startAdvertisingPeer]; 

     [nearbyBrowser startBrowsingForPeers]; 

     return self; 
    } 

    return self; 

} 

/** 

Session delegates 
*/ 

// Remote peer changed state 
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state 
{ 
    if(state == MCSessionStateConnected) 
    { 
     [nearbyAdvertiser stopAdvertisingPeer]; 
     [nearbyBrowser stopBrowsingForPeers]; 

     NSLog(@"Peer connected to session"); 
    } 
    else if(state == MCSessionStateNotConnected) 
    { 
     NSLog(@"Peer not connected"); 
    } 
} 

// Received data from remote peer 
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID 
{ 
} 

// Start receiving a resource from remote peer 
- (void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress 
{ 
} 

// 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:(NSURL *)localURL withError:(NSError *)error 
{ 
} 

- (void)session:(MCSession *)session didReceiveCertificate:(NSArray *)certificate fromPeer:(MCPeerID *)peerID certificateHandler:(void(^)(BOOL accept))certificateHandler 
{ 
    NSLog(@"Received certificate"); 
    certificateHandler(YES); 
} 

- (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID 
{ 
    stream.delegate = self; 

    [stream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
    [stream open]; 

} 



/** 
MCBrowser Delegates 
*/ 

// Found a nearby advertising peer 
- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info 
{ 
    NSLog(@"Found Peer"); 

    [browser invitePeer:peerID toSession:currentSession withContext:nil timeout:0]; 
} 

// A nearby peer has stopped advertising 
- (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID 
{ 
    NSLog(@"Lost Peer"); 
} 



/**Advertising Delegates 
*/ 

- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler 
{ 
    invitationHandler(YES, currentSession); 
} 


// Advertising did not start due to an error 
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didNotStartAdvertisingPeer:(NSError *)error 
{ 
    NSLog(@"Did not start advertising"); 
} 


@end 

А вот мой SideWaysManager.h файл:

#import <Foundation/Foundation.h> 
#import <MultipeerConnectivity/MultipeerConnectivity.h> 

@interface SidewaysManager : NSObject <MCNearbyServiceAdvertiserDelegate, MCNearbyServiceBrowserDelegate, MCSessionDelegate, NSStreamDelegate> 


@end 



И тогда я инициализируйте этот класс в классе AppDelegate. Но по какой-то причине NONE приведенных выше методов делегата. Может ли кто-нибудь, знакомый с каркасом, помочь мне или понять, почему в этом классе ничего не происходит? Буду весьма признателен за это.

ответ

2

Я создал проект на основе шаблона приложения Single View. Я добавил код проекта SideWaysManager в проект. Для того, чтобы сделать его компиляции я удалил импорт EPBmyConfig и исправлены ошибки компиляции, как показано ниже:

//  EPBmyConfig *configInfo = [EPBmyConfig instance]; 

//  NSString *assetID = [configInfo getAssetID]; 

//  NSString *useageLocation = [configInfo getUseageLocation]; 

     NSString *peerDisplayName = @"PCTouchPad-Test"; 

// if(![useageLocation isEqualToString:@""]) 
// { 
//  peerDisplayName = [peerDisplayName stringByAppendingString: [NSString stringWithFormat:@"-%@", useageLocation]]; 
// } 

     MCPeerID *localPeerID = [[MCPeerID alloc] initWithDisplayName:peerDisplayName]; 

Выполнение кода на моем iPhone и имитатор методы делегатов были названы и сессия была создана. Похоже, что ваша настройка объектов Multipeer Connectivity в порядке.

Как вы создаете SideWaysManager в своем AppDelegate?

Это, как я это сделал:

@interface PFAppDelegate() 

@property (strong, nonatomic) SidewaysManager *manager; 

@end 


@implementation PFAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.manager = [[SidewaysManager alloc]init]; 
    return YES; 
} 

Важно, чтобы ваш класс AppDelegate содержит ссылку на менеджер, в противном случае он будет де-alloced сразу после didFinishLaunchingWithOptions возвращается. Это может объяснить, что в вашем коде ничего не происходит.

В качестве альтернативы, это может быть проблемой при создании отображаемого имени однорангового узла (в основном, материала, который я прокомментировал).

+0

Большое спасибо за то, что пополнили его в своем проекте и дали ему уйти. Я действительно смог найти решение, но забыл обновить его здесь. Да, моя проблема заключалась в том, что у меня не было переменной свойства или экземпляра для бокового менеджера. Он был освобожден сразу же, поскольку это была локальная переменная. – reheej

+0

Я собираюсь дать вам кредит, так как вы получили то же точное решение, и вы загрузили мой файл. – reheej

Смежные вопросы