【发布时间】:2014-05-31 14:34:06
【问题描述】:
我已经被这个问题困扰了一段时间。我正在尝试测试多对等框架。我正在尝试在没有 UI 的情况下做到这一点。换句话说,我正在通过代码手动邀请其他同行。我希望能够启动应用程序,并且对等点会自动开始寻找彼此并连接。
为此,我设置了一个名为 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 运行。任何熟悉该框架的人都可以帮助我或知道为什么这门课什么都没有发生吗?我将不胜感激。
【问题讨论】:
标签: ios objective-c cocoa-touch multipeer-connectivity