在应用程序启动过程中iOS测试连接到服务器太长时间

Ray*_*ang 4 iphone networking reachability ipad ios

我有一个允许用户自动登录的应用程序.我的老板想要的是,当应用程序启动时,应用程序需要测试与我们服务器的连接(而不仅仅是测试是否有WiFi或3G网络).我借用了苹果的Reachability样本,它有效.

问题是需要太长时间,特别是在发布时.我在没有互联网连接的本地无线网络上尝试过,我花了将近半分钟的时间.因为自动登录在-ViewDidLoad()中调用了半分钟,所以ui没有加载.花费很长时间的时间是完全不可接受的.更糟糕的是,如果我的应用程序加载时间太长,iOS甚至可能会关闭应用程序.

此外,我的应用程序中有很多Web服务调用.我理解每个网络服务电话都有可能失败,因为即使用户从一个地方走到另一个地方,iPhone/iPad也可能很容易丢失或获得连接.我个人不喜欢它,但这就是我的老板要我做的事情,我可能不得不经常在应用程序中测试连接.

所以我在这里寻找的是一种非常快速(几秒钟内)检测连接的方法,或者是在幕后进行连接而不影响用户体验的方法.

有人有建议吗?

感谢您抽出宝贵时间阅读我的问题.

Ham*_*son 5

presentModalViewController在测试进行时呈现中间加载视图并使用执行实际测试performSelectorInBackground.然后用以下信号发回主线程performSelectorOnMainThread:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Make this a hidden member
    loadingViewController = [LoadingViewController new];
    [self presentModalViewController:loadingViewController animated:NO];

    [self performSelectorInBackground:@selector(testConnectivity) withObject:nil];
}

- (void)testConnectivity
{
    // Do expensive testing stuff

    [self performSelectorOnMainThread:@selector(testCompleted) withObject:nil waitUntilDone:NO];
}

- (void)testCompleted
{
    [loadingViewController dismissViewControllerAnimated:YES];
    loadingViewController = nil;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在您使用应用程序时,等待30秒使应用程序开始变得糟糕,并且连接经常发生变化的整体用户体验,因此即使您在每次启动时都进行测试,也不太可靠.但如果这是你的老板想要的,我会和你一起受苦.;)


ano*_*234 5

对于它的价值,这是我使用的方法..

- (BOOL)checkServerAvailability {
    bool success = false;
    const char *host_name = [@"host" cStringUsingEncoding:NSASCIIStringEncoding];

    SCNetworkReachabilityRef reachability = 
                  SCNetworkReachabilityCreateWithName(NULL, host_name);
    SCNetworkReachabilityFlags flags;
    success = SCNetworkReachabilityGetFlags(reachability, &flags);
    bool isAvailable = success && (flags & kSCNetworkFlagsReachable) 
                   && !(flags & kSCNetworkFlagsConnectionRequired);

    CFRelease(reachability);
    return isAvailable;
}
Run Code Online (Sandbox Code Playgroud)

这是我的服务器检查方法的记录结果......

2012-07-11 11:29:04.892 ASURecycles[1509:f803] starting server check...
2012-07-11 11:29:04.894 ASURecycles[1509:f803] creating reachability...
2012-07-11 11:29:04.894 ASURecycles[1509:f803] creating flags...
2012-07-11 11:29:04.913 ASURecycles[1509:f803] checking for success of reachability, assigning to flags..
2012-07-11 11:29:04.913 ASURecycles[1509:f803] checking our flags to determine network status...
2012-07-11 11:29:04.913 ASURecycles[1509:f803] not available
Run Code Online (Sandbox Code Playgroud)

如你所见,一秒钟.当然我们的服务器目前正在遇到麻烦,但我认为你的问题可能是服务器问题,而不是框架问题.您总是可以尝试在另一个线程上执行服务器检查.