【问题标题】:Why can't this iOS app access the network?为什么这个 iOS 应用无法访问网络?
【发布时间】:2013-06-07 02:54:42
【问题描述】:

我的 (Unity) 应用程序抱怨我的 iPod 没有网络连接,而该设备具有完整的 wi-fi 连接(包括 Safari 在内的所有其他应用程序都证明了这一点)。

这不仅仅是一个 API 点——它们(Facebook、StoreKit 等)都声称网络不可用。

此消息会定期从我的应用发送到控制台:

<Error>: Could not successfully update network info during initialization.

这可能(我认为)来自 CoreTelephony

知道是什么原因造成的吗?我在调试和临时构建中得到它。我在设备上没有任何限制(来自设置)。

设备为 iOS 6,基础 sdk 为 iOS 5。

【问题讨论】:

  • 您是否使用过其他网络库,例如ASIHTTP
  • 不,只有统一插件。
  • 您是否检查了设置 -> devTools -> 网络链接协调器,您没有 100% 丢失互联网连接?
  • 您好,您发现问题所在了吗? @Raptor,如果他使用ASIHTTP 或其他网络库(例如AFNetworking)怎么办?
  • 戴夫你找到解决方案了吗?我也面临同样的问题。

标签: ios networking unity3d


【解决方案1】:

“初始化期间无法成功更新网络信息。”每次在没有 SIM 卡的设备(没有 3G 的 iPod touch 或 iPad)中初始化 CTTelephonyNetworkInfo 时都会显示日志。

如果它很烦人,您只需初始化一次,然后针对该实例进行网络检查。

【讨论】:

  • 哦!你岩石,daswift。这正是我在模拟器上收到这个烦人的消息的原因。谢谢!
  • 我尝试在模拟器中设置位置并在 appDelegate.m 中初始化 CTTelephonyNetworkInfo 但不起作用,你能发布代码吗? @rockdaswift
  • @YaoLi 你只需要这样做一次(如果需要的话): let networkInfo = CTTelephonyNetworkInfo() 然后传递对象,每次你在模拟器或没有SIM卡的设备中这样做时,你将收到该警告。
  • @rockdaswift 我不直接使用 CTTelephonyNetworkInfo,我只使用 AFNetworking 3.1.0 来发出 API 请求,AFNetworking 2.0+ 版可以工作。
  • 很奇怪,AFNetworking 不使用 CTTelephonyNetworkInfo,可能是在另一个依赖中。
【解决方案2】:

检查开发者工具以检查您是否不小心打开了 100% 丢失互联网。它应该在调试菜单中。

【讨论】:

  • 我有同样的问题,我无法解决。调试菜单中未启用网络链接调节器
【解决方案3】:

我尝试在模拟器中设置位置并在 appDelegate.m 中初始化 CTTelephonyNetworkInfo,但无法正常工作。我通过定义一个新的类 APIAgent.m 来修复它:

+ (APIAgent *)manager {
    static APIAgent *_manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _manager = [[APIAgent alloc] initWithBaseURL:[NSURL URLWithString:API_URL]];
        _manager.responseSerializer = [AFJSONResponseSerializer serializer];
        NSMutableIndexSet* codes = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(200, 100)];
        [codes addIndex: 400];
        [codes addIndex: 401];
        [codes addIndex: 404];
        [codes addIndex: 409];
        [codes addIndex: 500];
        _manager.responseSerializer.acceptableStatusCodes = codes;
    });

    return _manager;
}

- (id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];
    if (!self) {
        return nil;
    }

    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];

    [self setHeaders];

    return self;
}

- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters progress:(void (^)(NSProgress *uploadProgress))uploadProgress
                     complete:(void (^)(NSURLSessionDataTask *task, id responseObject, NSError *error))complete {
    return [self GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        if (complete) {
            complete(task, responseObject, nil);
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        if (complete) {
            complete(task, nil, error);
        }
    }];
}

- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters complete:(void (^)(NSURLSessionDataTask *task, id responseObject, NSError *error))complete {
    return [self POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        if (complete) {
            complete(task, responseObject, nil);
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        if (complete) {
            complete(task, nil, error);
        }
    }];
}


- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters progress:(void (^)(NSProgress *uploadProgress))uploadProgress
                      success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
    self.securityPolicy.allowInvalidCertificates = YES; // self signed certificate
    self.securityPolicy.validatesDomainName = NO;
    return [super GET:URLString parameters:parameters progress:nil success:success failure:failure];
}

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
                      progress:(void (^)(NSProgress *uploadProgress))uploadProgress
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
    NSMutableDictionary *params = [parameters mutableCopy];

    self.securityPolicy.allowInvalidCertificates = YES; // self signed certificate
    self.securityPolicy.validatesDomainName = NO;
    return [super POST:URLString parameters:params progress:nil success:success failure:failure];
}

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters constructingBodyWithBlock:(void (^)(id<AFMultipartFormData>))block
                      progress:(void (^)(NSProgress *uploadProgress))uploadProgress
                       success:(void (^)(NSURLSessionDataTask *, id))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure {
    NSMutableDictionary *params = [parameters mutableCopy];

    if (parameters == nil) {
        params = [[NSMutableDictionary alloc] init];
    } else {
        if (parameters[@"postId"] != nil) {
            params[@"postId"] = parameters[@"postId"];
        }
    }

    self.securityPolicy.allowInvalidCertificates = YES; // http://stackoverflow.com/questions/27808249/problems-with-ssl-pinning-and-afnetworking-2-5-0-nsurlerrordomain-error-1012
    self.securityPolicy.validatesDomainName = NO;
    return [super POST:URLString parameters:params constructingBodyWithBlock:block progress:nil success:success failure:failure];

}

- (void)setHeaders {
    NSString *time = [NSString stringWithFormat:@"%f", [[[NSDate alloc] init] timeIntervalSince1970]];
    AFHTTPRequestSerializer * serializer = self.requestSerializer;
    [serializer setValue:time forHTTPHeaderField:@"X-API-TIME"];
    [serializer setValue:[UIDevice currentDevice].identifierForVendor.UUIDString forHTTPHeaderField:@"X-UUID"];

    [serializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

    NSString *preferredLang = [NSLocale preferredLanguages].firstObject;

    [serializer setValue:preferredLang forHTTPHeaderField:@"X-USER-LANGUAGE"];
}

【讨论】:

  • 上面的代码可以作为一个实用程序类来发出网络请求。
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 2012-03-25
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多