我是应用程序开发的新手,已经创建了一个使用uiwebviews的几个viewcontrollers的应用程序。 我想在iphone未连接到互联网时添加警报视图。 我尝试过实现不同的代码,但是不会弹出alertview。
继承我的代码。
//
// ViewControllersocialgo.h
// GO!SocialMedia
//
// Created by Adam Rais on 28/11/2012.
// Copyright (c) 2012 SocialGO. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "Reachability.h"
@interface ViewControllersocialgo : UIViewController <UIWebViewDelegate>
@property (strong, nonatomic) IBOutlet UIWebView *socialgo;
@end
和ViewControllerpractical.m
//
// ViewControllerpractical.m
// GO!SocialMedia
//
// Created by Adam Rais on 28/11/2012.
// Copyright (c) 2012 SocialGO. All rights reserved.
//
#import "ViewControllersocialgo.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>
@interface ViewControllersocialgo ()
@end
@implementation ViewControllersocialgo
-(BOOL) isInternetAvailable {
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
if(reachability != NULL) {
//NetworkStatus retVal = NotReachable;
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
{
// if target host is not reachable
return NO;
}
if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
// if target host is reachable and no connection is required
// then we'll assume (for now) that your on Wi-Fi
return YES;
}
if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
{
// ... and the connection is on-demand (or on-traffic) if the
// calling application is using the CFSocketStream or higher APIs
if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
{
// ... and no [user] intervention is needed
return YES;
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
// ... but WWAN connections are OK if the calling application
// is using the CFNetwork (CFSocketStream?) APIs.
return YES;
}
}
}
return NO;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[_socialgo setDelegate:self];
NSString *fullURL=@"http://adam182testing.comoj.com/socialgo.html";
NSURL *url=[NSURL URLWithString:fullURL];
NSURLRequest *requestOBJ=[NSURLRequest requestWithURL:url];
[_socialgo loadRequest:requestOBJ];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
由于
答案 0 :(得分:3)
不要等待错误告诉用户他没有互联网连接。使用Apple自己的方法来检测使用ARC的连接 - Apple sample project或this version。如果用户失去连接,它会立即告诉您。
答案 1 :(得分:2)
您的视图控制器必须实现UIWebViewDelegate
,请尝试此代码
ViewControllerpractical.h
//
// ViewControllerpractical.h
// GO!SocialMedia
//
// Created by Adam Rais on 28/11/2012.
// Copyright (c) 2012 SocialGO. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewControllerpractical : UIViewController <UIWebViewDelegate>
@property (strong, nonatomic) IBOutlet UIWebView *practical;
@end
ViewControllerpractical.m
//
// ViewControllerpractical.m
// GO!SocialMedia
//
// Created by Adam Rais on 28/11/2012.
// Copyright (c) 2012 SocialGO. All rights reserved.
//
#import "ViewControllerpractical.h"
@interface ViewControllerpractical ()
@end
@implementation ViewControllerpractical
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Can't connect. Please check your internet Connection"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[_practical setDelegate:self];
NSString *fullURL=@"http://adam182testing.comoj.com/practical.html";
NSURL *url=[NSURL URLWithString:fullURL];
NSURLRequest *requestOBJ=[NSURLRequest requestWithURL:url];
[_practical loadRequest:requestOBJ];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
无论如何,正如Eli Ganem所说,使用可达性更好。
我在我的项目中使用此功能:
-(BOOL) isInternetAvailable {
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
if(reachability != NULL) {
//NetworkStatus retVal = NotReachable;
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
{
// if target host is not reachable
return NO;
}
if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
// if target host is reachable and no connection is required
// then we'll assume (for now) that your on Wi-Fi
return YES;
}
if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
{
// ... and the connection is on-demand (or on-traffic) if the
// calling application is using the CFSocketStream or higher APIs
if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
{
// ... and no [user] intervention is needed
return YES;
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
// ... but WWAN connections are OK if the calling application
// is using the CFNetwork (CFSocketStream?) APIs.
return YES;
}
}
}
return NO;
}