Ale*_*dro 8 ios multipeer-connectivity
我希望我没有通过发布这个问题来违反NDA.
我正在使用新的多路连接,使用蓝牙将一些文件发送到附近的设备.我已设法发送邀请,但我似乎没有得到如何显示UIAlertView,用户可以接受或拒绝邀请.现在,当用户发送时,文件会自动保存,并且没有接受/拒绝警报.
代码是:
- (void) advertiser:(MCNearbyServiceAdvertiser *)advertiser
didReceiveInvitationFromPeer:(MCPeerID *)peerID
withContext:(NSData *)context
invitationHandler:(void(^)(BOOL accept,
MCSession *session))invitationHandler{
... save the data context
Run Code Online (Sandbox Code Playgroud)
但有警报:
- (void) advertiser:(MCNearbyServiceAdvertiser *)advertiser
didReceiveInvitationFromPeer:(MCPeerID *)peerID
withContext:(NSData *)context
invitationHandler:(void(^)(BOOL accept,
MCSession *session))invitationHandler{
DevicePeer = [MCPeerID alloc];
DevicePeer = peerID;
ArrayInvitationHandler = [NSArray arrayWithObject:[invitationHandler copy]];
// ask the user
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@""
message:@""
delegate:self
cancelButtonTitle:@"NO"
otherButtonTitles:@"YES", nil];
[alertView show];
alertView.tag = 2;
}
Run Code Online (Sandbox Code Playgroud)
和警报视图方法:
- (void) alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex
{
// retrieve the invitationHandler
// get user decision
BOOL accept = (buttonIndex != alertView.cancelButtonIndex) ? YES : NO;
// respond
MCSession *session = [ArrayInvitationHandler objectAtIndex:0];
void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0];
invitationHandler(accept, session);
}
Run Code Online (Sandbox Code Playgroud)
当用户按YES时,应用程序崩溃,我收到错误:
[__NSMallocBlock__ nearbyConnectionDataForPeer:withCompletionHandler:]: unrecognized selector sent to instance 0x14d4e3b0'
Run Code Online (Sandbox Code Playgroud)
我已经查看了IOS开发人员库,除此之外没有其他方法
- (void)nearbyConnectionDataForPeer:(id)arg1 withCompletionHandler:(id)arg2{
}
Run Code Online (Sandbox Code Playgroud)
这没用.没有关于IOS开发人员论坛的信息.有任何想法吗?
亚历山德罗是对的,这在WWDC 2013视频中没有解释.我自己也在努力.
我认为你走在正确的轨道上,你只有几个逻辑错误.我不明白这两行:
MCSession *session = [ArrayInvitationHandler objectAtIndex:0];
void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
存储在数组中的对象只是您的处理程序.你遇到这种崩溃的原因是浏览器看到这accept是真的并试图将对等体连接到会话,但你给它的会话是零.要解决此问题,您需要传回您创建的新会话.
起初我对浏览器端已经创建了一个新会话的概念感到困惑,但后来我意识到我们没有从浏览器那里得到那个会话,我们无法真正传回去进入邀请处理程序,如果它不存在!
所以,是的,改为:
BOOL accept = (buttonIndex != alertView.cancelButtonIndex) ? YES : NO;
// respond
MCSession *session;
if(accept) {
session = [[MCSession alloc] initWithPeer:peer];
session.delegate = self;
}
void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0];
invitationHandler(accept, session);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6849 次 |
| 最近记录: |