iphone - 通过浏览下一页的 iOS 蓝牙连接

标签 iphone ios bluetooth

我有一个关于将 currentSession 传递到下一页的问题。 我已经在第一个页面 View Controller 上测试并成功建立了蓝牙 session 。现在我的问题是,如何将当前 session 传递到下一页,因为导航到下一页后,蓝牙连接丢失。所以在导航到下一页后,当前 session 就丢失了。这是通过用两部手机发送随机图像来测试的。但是,如果第二次在nextpageController提示蓝牙连接,则可以发送图片。

查看 Controller .M:

-(IBAction)btnBluetoothConnect:(id)sender {
    picker = [[GKPeerPickerController alloc] init];
    picker.delegate = self;
    picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;

    [picker show];
}


- (void)peerPickerController:(GKPeerPickerController *)pk didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
    self.currentSession = session;
    session.delegate = self;
    [session setDataReceiveHandler:self withContext:nil];
    picker.delegate = nil;
    [picker dismiss];
}

- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)pk {
    picker.delegate = nil;
}


- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
    switch (state) {
        case GKPeerStateConnected:
            NSLog(@"connected");
            if (GKPeerStateConnected) {
                self.progress = [[ProgressAlertView alloc] init];
                progress.delegate = self;
                progress.task = @selector(compute);
                [progress start];
            }
            break;

        case GKPeerStateDisconnected:
            NSLog(@"disconnected");
            currentSession = nil;

        default:
            break;
    }
}

-(void)compute{
    [self updateUIWithProgress:0.0 andMessage:@"3"];
    [NSThread sleepForTimeInterval:3];
    if([progress isCancelled]){
        self.progress = nil;
        return;
    }
    [self updateUIWithProgress:0.4 andMessage:@"2"];
    [NSThread sleepForTimeInterval:1];
    if([progress isCancelled]){
        self.progress = nil;
        return;
    }
    [self updateUIWithProgress:0.6 andMessage:@"1"];
    [NSThread sleepForTimeInterval:1];
    if([progress isCancelled]){
        self.progress = nil;
        return;
    }
    [self updateUIWithProgress:0.8 andMessage:@"0"];
    [NSThread sleepForTimeInterval:1];
    if([progress isCancelled]){
        self.progress = nil;
        return;
    }
    else
        [self updateUIWithProgress:1.0 andMessage:@"Start!"];
    NSLog(@"Woohahaha");
    **[self performSegueWithIdentifier:@"next page" sender:self];**

    //process the data here or send a notification for data processing
    //when this method returns, the progress alert view disappears.
}

NextPageController.m:

-(IBAction)btnSend:(id)sender{


    if(currentSession){
        NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:[NSString stringWithFormat:@"4.png"]], .7);
        [self.currentSession sendDataToAllPeers:imageData withDataMode:GKSendDataReliable error:nil];
    }
}


- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context{
    imageView.image = [UIImage imageWithData:data];
}

- (void)peerPickerController:(GKPeerPickerController *)pk didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
    self.currentSession = session;
    session.delegate = self;
    [session setDataReceiveHandler:self withContext:nil];
    picker.delegate = nil;
    [picker dismiss];
}

- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)pk {
    picker.delegate = nil;
}

最佳答案

我不知道我的做法是否正确,但我有一个包含很多页面的应用程序,我需要在所有页面中保持这种联系。所以我把我所有的蓝牙连接代码放在一个单例类中,每个 View Controller 都可以与之通信。这样它就可以处理所有的通信,每个页面都可以告诉它它想要发送什么。

所以这是一个很棒的单例类教程 http://www.galloway.me.uk/tutorials/singleton-classes/

就蓝牙方面的问题而言,您似乎拥有所有正确的方法。只需将它们放在您的单例类中即可。然后,当您引用类时 *(MyManager sharedManager = [MyManager sharedManager];) 然后只需创建一个 sendCommand 方法来发送您想要的任何通信,就像这样 [sharedManager sendCommand:data];

所以你有你的蓝牙类。您添加一个蓝牙连接方法,其中包含类似此代码的内容

picker = [[GKPeerPickerController alloc] init];
picker.delegate = self;
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
[picker show];

然后从您的 View Controller 类中引用您的单例类,就像教程中显示的那样。

MyManager sharedManager = [MyManager sharedManager];

然后你可以调用你的新方法:[sharedManager bluetoothconnect];

关于iphone - 通过浏览下一页的 iOS 蓝牙连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132220/

相关文章:

iphone - 刚刚发布到 AppStore 的应用程序在 iOS 3.0 不全面的存档上崩溃

c# - 如何从运行在 Windows 10 Creators Update 上的 WPF 应用注册 BLE 通知?

android - 蓝牙连接无需配对

android - 通过蓝牙安卓玩井字游戏,轮流玩?

iphone - 无法在 iPhone 上下载 .mobileConfig

iphone - webViewDidStartLoad 和 ..FinishLoad 被顺序调用

ios - 如何将图像添加到 ios 中 uicollectionView 单元格的左上角?

ios - 在 Swift 中,当我声明一个非可选属性但不能保证初始化时,我是否会丢失任何资源?

ios - 上下移动 View 有限制

ios - youtube-ios-player-helper 无法在 Youtube 应用中打开视频