2009-12-07 40 views
39

我發現了幾個代碼示例來做我想做的事情(檢查可達性),但沒有一個看起來對我來說足夠準確。我無法弄清楚爲什麼這不想打得好。iPhone的可達性檢查

我有reachability.h/M在我的項目,我做

#import <SystemConfiguration/SystemConfiguration.h> 

和我有框架補充說。我也有:

#import "Reachability.h" 

在我試圖使用可達性的.m的頂部。

Reachability* reachability = [Reachability sharedReachability]; 
[reachability setHostName:@"http://www.google.com"]; // set your host name here 
NetworkStatus remoteHostStatus = [reachability remoteHostStatus]; 

if(remoteHostStatus == NotReachable) {NSLog(@"no");} 
else if (remoteHostStatus == ReachableViaWiFiNetwork) {NSLog(@"wifi"); } 
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) {NSLog(@"cell"); } 

這給了我各種各樣的問題。我究竟做錯了什麼?我是一位好的編碼員,當我需要知道需要在哪裏實現自己想做的事情時,我很難過,無論我想知道自己想做什麼或不想做什麼。 (太令人沮喪了)

更新:這是怎麼回事。這是我的ViewController,我有

#import <SystemConfiguration/SystemConfiguration.h> 

#import "Reachability.h" 

設置了。這是我迄今爲止最不喜歡的編程部分。 reachability problems http://sneakyness.com/reachability.png


FWIW,我們從未結束了在我們的代碼實現這一點。需要訪問互聯網(進入抽獎和購買DVD)的兩個功能並不是主要功能。沒有別的要求互聯網接入。

我們不是添加更多的代碼,而是將兩個互聯網視圖的背景設置爲通知,告知用戶他們必須連接到互聯網才能使用此功能。它與應用程序界面的其餘部分是一致的,並且做得很好。他們在審批過程中沒有提到這件事,但是我們確實收到了一個私人電話,以確認我們放棄了與電影有關的物品。根據他們通常模糊的協議,您不能以其他方式參加抽獎活動。

我也認爲這樣會更嚴格地遵守他們的「只有在絕對需要的情況下才會使用的東西」的想法。

Here's the iTunes link to the application, EvoScanner.

+1

是不是做你想要什麼?我們無法從此代碼中知道您想要什麼或者它不工作。它不會編譯,在某些情況下不會產生正確的結果,或者是什麼? – 2009-12-07 17:56:57

+0

我更新了問題以反映我的問題。對不起,沒有更具體。 – Sneakyness 2009-12-07 19:15:00

+2

原來我們從不需要它!他們確實說**最好的代碼是你永遠不需要寫的代碼!**:D – Sneakyness 2009-12-18 01:53:00

回答

65

從您的屏幕截圖看來,您似乎沒有將Reachability添加到您的項目中。你必須從蘋果下載可達:

https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html

而且兩者的.h和.m文件添加到項目中。

更新:您注意到您有可達性。但是看最新的版本,我可以看到你列出的錯誤原因 - 他們改變了API,你可能使用了你在其他地方找到的示例代碼。嘗試:

在.h文件中:

//import Reachability class 
#import "Reachability.h" 

// declare Reachability, you no longer have a singleton but manage instances 
Reachability* reachability; 

在.m文件:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkChange:) name:kReachabilityChangedNotification object:nil]; 

reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 

NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

if(remoteHostStatus == NotReachable) {NSLog(@"no");} 
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); } 
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); } 

..... 

- (void) handleNetworkChange:(NSNotification *)notice 
{ 

    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

    if(remoteHostStatus == NotReachable) {NSLog(@"no");} 
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); } 
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); } 
} 
+0

不,我有這兩個補充,但這是一件好事,提及檢查。我如何包含它們以便我可以在需要它們的地方使用它們?這真讓我失望。 – Sneakyness 2009-12-07 22:16:42

+1

您需要在文件頂部有一個導入語句。導入可達性。h – bpapa 2009-12-08 03:16:25

+0

更新爲新的數據,請重新閱讀答案 – 2009-12-08 05:33:11

3

你有下面的代碼的任何地方?

[reachability startNotifier]; 

如果你的可達性的代碼是從蘋果公司的例子,那麼你需要做的,然後才能開始報告狀態更新給你。

+0

你需要這樣做嗎?即使你只是像上面的代碼一樣查詢直接狀態而不是等待通知? – 2009-12-07 18:17:42

+0

我相信如此;我可能是錯的,但蘋果的可達性代碼基本上運行在一個單獨的線程中,我相信在設定的時間間隔內檢查可達性,並且您需要啓動該進程,然後才能將狀態報告給您。 – Kevlar 2009-12-07 18:20:59

+1

你不能查詢即時狀態。您嘗試建立連接後可達到工作,然後Reachability開始發出關於狀態的通知。你可以做的最接近的是嘗試一些你知道你存在的小URL結果,然後等待通知。 蘋果在WWDC非常明確地表示這是實現可達性的方法。 – 2009-12-07 18:27:42

28
[reachability setHostName:@"http://www.google.com"]; 

注意!如果使用http://前綴,我遇到了總是「NotReachable」的問題。

Raphael

+28

注意! http://不是主機名的一部分。 – Sneakyness 2010-05-25 20:55:02

+8

這就是我指出的。 – 2010-05-27 17:58:40

+20

不過,有一個有效的缺陷需要指出。並非我們都是網絡協議專家。 – 2012-06-25 13:59:12

7

下面是正確的代碼,因爲它適用於我今天!

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNetworkChange:) name: kReachabilityChangedNotification object: nil]; 

reachability = [Reachability reachabilityForInternetConnection]; 

[reachability startNotifier]; 

NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

if(remoteHostStatus == NotReachable) {NSLog(@"no");} 
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); } 
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); } 
+0

這是正確的。如果你這樣做,它會阻塞主線程,所以你不需要異步版本。 – 2014-08-01 15:57:32

-3

改變這種

reachability = [Reachability reachabilityForInternetConnection]; 

這個

reachability = [[Reachability reachabilityForInternetConnection] retain]; 
以何種方式