Я некоторое время задерживался на этой проблеме. Я пытаюсь проверить многоуровневую структуру. И я пытаюсь сделать это без пользовательского интерфейса. Другими словами, я приглашаю других сверстников вручную через код. Я хочу, чтобы приложение могло появиться, и сверстники автоматически начинают искать друг друга и подключаться.Делегаты 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 приведенных выше методов делегата. Может ли кто-нибудь, знакомый с каркасом, помочь мне или понять, почему в этом классе ничего не происходит? Буду весьма признателен за это.
Большое спасибо за то, что пополнили его в своем проекте и дали ему уйти. Я действительно смог найти решение, но забыл обновить его здесь. Да, моя проблема заключалась в том, что у меня не было переменной свойства или экземпляра для бокового менеджера. Он был освобожден сразу же, поскольку это была локальная переменная. – reheej
Я собираюсь дать вам кредит, так как вы получили то же точное решение, и вы загрузили мой файл. – reheej