2010-02-20 24 views
11

Tôi đang làm việc trên ứng dụng iPhone cho phép kết nối ngang hàng. Từ những gì tôi hiểu, tôi có sự lựa chọn giữa việc sử dụng GKPeerPicker hoặc GKSession. Tôi không thích ý tưởng sử dụng PeerPicker vì tôi muốn hiển thị một giao diện tùy chỉnh, vì vậy tôi quyết định đi với GKSession, và hey, THƯỞNG là nó cũng hoạt động qua Wi-Fi, trong khi Peer Picker thì không.GKSession - điều gì xảy ra nếu tôi đã tắt Bluetooth và Wi-Fi?

OK, vậy vấn đề là ... nếu người dùng đã tắt cả Bluetooth và Wi-Fi thì sao? Trong Công cụ chọn ngang hàng, có lời nhắc bật Bluetooth khi rời khỏi ứng dụng. GKSession không có nó ... nhưng woah chờ một chút, có vẻ như tôi thậm chí không thể kiểm tra xem Bluetooth có bật hay không lập trình!

Carpe Cocoa claims no problem, chỉ cần sử dụng phương thức session:didFailWithError: của Đại biểu. Nhưng, như nó giải thích trong các ý kiến ​​... mà dường như không hoạt động nữa! Và theo kinh nghiệm của tôi, tôi đồng ý.

Có cách nào khác để kiểm tra theo chương trình nếu Bluetooth đang bật không? Đây có phải là điều tôi nên tận dụng Khả năng hiển thị không? Hay đó chỉ là một lỗi mà Apple chưa sửa?

Để cụ thể hơn, tôi là tạo ra phiên của tôi như thế này:

GKSession *aSession = [[GKSession alloc] initWithSessionID:nil 
                displayName:user.displayName 
                sessionMode:GKSessionModePeer]; 

self.gkSession = aSession; 
[aSession release]; 

self.gkSession.delegate = self; 
self.gkSession.available = YES; 

[self.gkSession setDataReceiveHandler:self withContext:NULL]; 

Lớp thực hiện các GKSessionDelegate, và tôi biết rằng nó đang làm việc bởi vì khi tôi có bluetooth bật, các phương pháp đại biểu được mời gọi không vấn đề gì. Tôi đã thực hiện đối tượng này như:

#pragma mark - 
#pragma mark GKSessionDelegate methods 

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { 
    if (GKPeerStateAvailable == state) { 
      [session connectToPeer:peerID withTimeout:10]; 
    } else if (GKPeerStateConnected == state) { 
      // gets user 

      NSError *error = nil; 
      [session sendData:user.connectionData 
         toPeers:[NSArray arrayWithObjects:peerID,nil] 
       withDataMode:GKSendDataReliable error:&error]; 
      if (error) 
       NSLog(@"%@",error); 
    } 
} 



- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
    NSError *error = nil; 
    [session acceptConnectionFromPeer:peerID error:&error]; 
    if (error) 
      NSLog(@"%@",error); 
} 

- (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

- (void)session:(GKSession *)session didFailWithError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

Không ai trong số những điều khoản đăng nhập được in và tôi đặt breakpoint trong mỗi phương pháp, nhưng không ai trong số họ được nhấn khi người dùng có cả Bluetooth và Wi-Fi tắt. Tôi đã hy vọng rằng điều gì đó sẽ xảy ra để kích hoạt phiên làm việc: didFailWithError: để tôi có thể nhắc người dùng bật Bluetooth hoặc kết nối với mạng Wi-Fi.

+2

Âm thanh như lỗi hoặc có thể là yêu cầu nâng cao. Bạn nên ghi một radar. –

Trả lời

1

Tôi đồng ý với Martin Gordon, nhưng giải pháp thay thế có thể là sử dụng Apple's reachability.

1

Điểm thú vị, bạn đã thử kiểm tra nó bằng TẮT Bluetooth và BẬT WiFi? Gần đây tôi đã phát hiện ra rằng mặc dù chương trình của tôi đang gọi thông báo 'Bluetooth không khả dụng' này nhưng thực tế nó không thực sự sử dụng Bluetooth AT ALL nhưng đã kết nối qua mạng WiFi của tôi. Tôi không biết một cách để buộc GKSession vào một kết nối Bluetooth mà không sử dụng đối tượng PeerPicker của Apple, nhưng đối tượng PeerPicker cho phép mọi người tạo giao diện riêng của họ. Những gì nó không có vẻ cho phép là loại kết nối khác hơn là Peer, vì vậy nếu bạn muốn một khách hàng/Server sắp xếp nó sẽ không được nhiều giúp đỡ.

-Ash

0

Bạn có thể bật Blutooth lập trình, bằng cách sử dụng API riêng của Apple (tôi nghĩ rằng BluetoothManger.h), nhưng phải cẩn thận, nó sẽ gây ra từ chối trong việc đẩy mạnh Apple App Store.

-1

Bạn nên sử dụng cùng một sessionID.

+1

Ý bạn là gì? Tại sao? –

0

Tôi thứ hai khái niệm về việc sử dụng khả năng hiển thị của Apple. Phần thưởng được liệt kê là một trong các nguyên tắc gửi của Apple App Store.

Không khó để thực hiện vì phần lớn mã cần thiết đã được viết cho bạn.

Slf cung cấp liên kết tới một số mã nguồn bằng cách sử dụng lớp Khả năng tiếp cận, ngoài ra, đây là liên kết đến Apple Dev's official reachability example.

Tuy nhiên, hãy đảm bảo bạn đang kiểm tra kết nối không đồng bộ.

Tôi đang sử dụng ứng dụng trong ứng dụng của mình và mặc dù đây không phải là giải pháp tốt nhất ít nhất nó thông báo cho người dùng rằng họ cần điều chỉnh cài đặt kết nối hoặc không có mạng nào tồn tại.

2

Bây giờ trong iOS 5, điều này có thể đạt được như vậy:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
NSMutableArray * discoveredPeripherals = [NSMutableArray new]; 
CBCentralManager * manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 
[manager scanForPeripheralsWithServices:discoveredPeripherals options:options]; 
[manager stopScan]; 

này yêu cầu bạn nhập khuôn khổ CoreBluetooth trong iOS 5. Nếu bluetooth tắt, hệ thống sẽ bật lên một cái nhìn tỉnh táo mà sẽ cung cấp lựa chọn bật bluetooth. Nếu không, nếu nó tìm thấy một thiết bị ngoại vi nó sẽ gọi một phương thức đại biểu tương ứng, nhưng nếu không có gì trong việc thực hiện đó, bạn không cần phải lo lắng về nó.

Các vấn đề liên quan