来自 AppStore 的 IPA 和来自 XCode 的 IPA 之间的二进制区别是啥?

Posted

技术标签:

【中文标题】来自 AppStore 的 IPA 和来自 XCode 的 IPA 之间的二进制区别是啥?【英文标题】:What is the binary difference between IPA coming from AppStore and those from XCode?来自 AppStore 的 IPA 和来自 XCode 的 IPA 之间的二进制区别是什么? 【发布时间】:2014-05-09 17:57:14 【问题描述】:

长话短说:

如何直接在硬件 (iPhone) 上以与 AppStore 分发的版本/二进制文件完全相同的版本/二进制文件直接调试 iPhone 应用程序,而无需等待 AppStore-Preview-Process?

详情:

我检测到 MKMapView 的行为在使用 Developer Profile 通过 XCode/USB-Cable 在 iPhone 上运行的编译 IPA 和在 Distribution-To-AppStore-Process 之后直接从 AppStore 安装的版本之间存在很大差异。

我将附上两个重要的屏幕截图。

这是应用程序通过 XCode/USB-Cable 在 iPhone 上启动 MKMapView 的方式,指向具有特殊区域的当前用户位置:

这就是从 AppStore没有任何代码更改到上一个版本的分布式版本后,同一个应用程序在同一部 iPhone 上启动的方式:

这里我将提供一些代码:

- (void)viewDidLoad

    [super viewDidLoad];

    [self.mapView removeAnnotations:[self.mapView annotations]];

    CLLocationCoordinate2D noLocation;
    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 6500, 6500);
    MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:viewRegion];
    [self.mapView setRegion:adjustedRegion animated:NO];

    mapView.delegate = self;

    mapView.showsUserLocation = YES;
    mapView.mapType = MKMapTypeStandard;



- (void)mapView:(MKMapView *)theMapView didUpdateUserLocation:(MKUserLocation *)userLocation

    theMapView.centerCoordinate = userLocation.location.coordinate;

顺便说一句,仅供参考:XCode 启动的直接在 iPhone 上运行的 IPA 与通过 AppStore 分发的存档之间存在另一个区别。没有行“[self.mapView removeAnnotations:[self.mapView annotations]];”应用程序在从 AppStore 安装的版本中启动后直接崩溃,但从 XCode 运行时不会。这个问题我在以前的版本中遇到过,不是这个问题的一部分,只是对主要问题的补充

主要问题是:

是否有可能以与 AppStore 分发它的方式完全相同的方式调试 iPhone-App,而无需等待 AppStore-Preview-Process,如果可以,如何调试?

【问题讨论】:

过去,Apple 曾建议我使用可用于在我的设备上安装二进制文件的配置文件重新签署最终的 .app 包。通常,这是使用 Release 方案设置的,可以使用 AppResigner 完成辞职。 感谢您的帮助,夸张。如何在文件系统中找到 .app - 包?通常我使用“产品 => 存档 => 应用商店分发”。我怎样才能在 iPhone 上启动这个 .app-Package? 【参考方案1】:

这里的主要区别可能只是发布版本与调试版本。你有:

CLLocationCoordinate2D noLocation;
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 6500, 6500);

您没有为noLocation 设置任何初始值。这是一个原始的struct,所以没有其他人这样做。它可以有任何价值。因此adjustedRegion 可以是任何区域。毫无疑问,它只是碰巧在您的调试版本中是模糊有效的,而在您的发布版本中是完全荒谬的。然后可能MKMapView 决定显示整个地球,如果它无法理解事物并且当您将中心移动到您所在地区的商店时它不会影响缩放。

要修复,请给 noLocation 一个已定义的有效值。

【讨论】:

【参考方案2】:

您通过 Xcode 在 iphone 上运行的应用程序版本将处于 debug 模式,App Store 上的版本处于 release 模式。如果您使用preprocessors macro(如DEBUG),这可能会改变您的应用程序的行为。

如果您认为这可能是问题所在,请进入 XCode,在 Product > Scheme > Edit Scheme 中,选择您的项目目标并将 BuildConfiguration 更改为 Release。即使您从 Xcode 运行它,您也会看到您的应用程序如何在发布模式下运行。调试应用的行为会更容易。

【讨论】:

非常感谢!我现在得到与 AppStore 版本相同的行为。

以上是关于来自 AppStore 的 IPA 和来自 XCode 的 IPA 之间的二进制区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

IPA(由 Xamarin.iOS 构建)被 Apple Store 拒绝

来自 build.phonegap.com 的 .ipa 文件在 iPhone 中不起作用

如何在发布到应用商店之前在设备上测试 ipa 应用(来自 expo)

应用内购买拒绝和新 IPA

上传到应用商店时二进制文件无效

上传ipa到appstore的步骤说明