0

正如主题所说,我可以在调试模式下在设备上毫无问题地运行我的应用程序,但是当我尝试在测试设备(临时分发)上运行时,有些部分(不是全部)不起作用。

应用程序从服务器下载 json 数据并向用户显示解析后的数据(文本、视频、ecc)。

为了与服务器通信,我在应用程序的每个地方都使用了 ASIFormDataRequest。

有任何想法吗?

谢谢!

一些代码:

NSMutableString *url = [[NSMutableString alloc] initWithString:@"http://url"];
NSURL *urlElaborazioneDati = [NSURL URLWithString:url];

__weak __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:urlElaborazioneDati]; 
[request setCompletionBlock:^{
    __weak NSString *jsonData = [request responseString];
    NSArray *jsonArray = [jsonData JSONValue];scrollView = [[UIScrollView alloc] init];
    scrollView.frame = CGRectMake(0.0, 70.0, 320.0, 312.0);
    scrollView.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0];

    scrollView.contentSize = CGSizeMake(320.0,marginTop*[jsonArray count]);
    [self.listaVideo addSubview:scrollView];

    for (int i=0; i<[jsonArray count]; i++) {
NSString *key = [NSString stringWithFormat:@"%d",i];
        NSArray *elemento = [jsonArray valueForKey:key];

        UIView *item = [[UIView alloc] initWithFrame:CGRectMake(148.0, (marginTop*i), 162.0, 67.0)];
        item.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0];
        [scrollView addSubview:item];

        UILabel *titoloVideo = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 162, 20)];
        titoloVideo.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0];
        titoloVideo.textColor = [UIColor whiteColor];
        titoloVideo.font = [UIFont boldSystemFontOfSize:17];
        [titoloVideo setText:[elemento valueForKey:@"titolo"]];
        [item addSubview:titoloVideo];

        UITextView *testoVideo = [[UITextView alloc] initWithFrame:CGRectMake(0, 30, 162, 37)];
        testoVideo.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0];
        testoVideo.textColor = [UIColor whiteColor];
        testoVideo.font = [UIFont boldSystemFontOfSize:13];
        testoVideo.textAlignment = UITextAlignmentLeft;
        testoVideo.editable = NO;
        [testoVideo setContentInset:UIEdgeInsetsMake(-10, -7, 0, 0)];
        [testoVideo setText:[elemento valueForKey:@"testo"]];
        [item addSubview:testoVideo];

        [self embedYouTube:[elemento valueForKey:@"url"] frame:CGRectMake(10, (marginTop*i), 128, 67)];
}

}];
[request setFailedBlock:^{
    NSError *responseerror = [request error];

    NSString *responseerrorstring = [NSString stringWithFormat:@"%@",responseerror];

    UIAlertView *error = [[UIAlertView alloc] initWithTitle: @"Errore connessione"
                                       message: responseerrorstring
                                      delegate: self
                             cancelButtonTitle: @"Ok"
                             otherButtonTitles: nil];
    [error setTag:1];
    [error show];
}];

然后在 embedYouTube 中:

- (void)embedYouTube:(NSString *)urlString frame:(CGRect)frame {

NSString *embedHTML = @"\
<html><head>\
<meta name = \"viewport\" content = \"initial-scale = 1.0, user-scalable = no, width = %0.0f\"/></head>\
<body style=\"background:#fff;margin-top:0px;margin-left:0px\">\
<div><object width=\"%0.0f\" height=\"%0.0f\">\
<param name=\"movie\" value=\"%@\"></param>\
<embed src=\"%@\"\
type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"%0.0f\" height=\"%0.0f\"></embed>\
</object></div></body></html>";

NSString *html = [NSString stringWithFormat:embedHTML, frame.size.width, frame.size.width, frame.size.height, urlString, urlString, frame.size.width, frame.size.height];
//NSLog(@"%0.0f, %0.0f, %@",frame.size.width, frame.size.height, html);
UIWebView *videoView = [[UIWebView alloc] initWithFrame:frame];
[videoView loadHTMLString:html baseURL:nil];
[scrollView addSubview:videoView];

}

这是似乎不适用于临时分发的部分之一......


如果这可以帮助处于相同情况的人,这里是 Apple Developer Technical Support 的回答:

在进行 Ad Hoc 构建时,默认情况下 Xcode 在编译项目时会应用更多优化。有关更多信息,请参阅https://developer.apple.com/library/ios/qa/qa1764/

优化暴露代码中的错误并不少见。通常这是未定义的行为(例如踩踏内存,例如通过将字符串复制到太小而无法容纳它的缓冲区)在代码意外工作之前导致问题;或 ARC 更积极地提前释放对象,这可能会暴露 __unsafe_unretained 崩溃,或导致 __weak 对象更早消失。

你知道你的完成块是否被调用过吗?如果添加 NSLog(@"%s:%d", func , LINE ); 在您的代码中,您是否看到了您期望的方法?

你知道下载是否开始了吗?请求对象的释放是否比您预期的要快?

要弄清楚出了什么问题,您需要准确地将失败的事情归零。

如果问题仅在通过 iTunes 安装 IPA 时重现,您将需要使用 NSLog() 来跟踪程序流程,并检查变量的实际值,以查看哪些行为不符合您的预期。有关详细信息,请参阅“调试已部署的 iOS 应用程序” http://developer.apple.com/library/ios/qa/qa1747/

您还可以尝试更改构建设置以在进行调试构建时使用与发布构建时相同的优化(通常是“最快、最小 -Os”)。这样您就可以使用调试器,但请注意优化会使其有些不可靠。如有疑问,请使用 NSLog()。

此致,

...

4

0 回答 0