1

让我们假设:

  • XCode4 用于“归档”项目并生成已使用 Ad-Hoc 配置文件签名的 app.ipa 文件
  • Ad-Hoc 配置文件可识别 10 种不同的 iOS 设备。这意味着 app.ipa 可以推送给 10 个人进行测试
  • 现在,如果通过苹果门户将第十一 (11) 个设备添加到 Ad-Hoc 配置文件,那么我们最终会得到一个更新的配置文件!

鉴于:

  • 我们不想使用 XCode 创建一个新的“存档”,因为很多代码已经改变
  • 我们只是想要获取完全相同的 app.ipa 文件并使用更新配置文件重新签名它,以便我们可以开始以临时方式将应用程序发送到第 11 台设备。

可以做些什么来做到这一点?

  • 请不要建议使用存储库来签出早期版本的代码,然后将存档与更新的配置文件一起使用。我已经知道这种解决方法,我想要一个技术上更舒适的选择

更新:

感谢这个博客: http ://blog.futureshock-ed.com/xcode-ad-hock-provisioning-certificate-pains

我发现我可以简单地在我的 XCode 4 中打开 Organizer,选择任何一个以前存档的构建,当我再次生成 app.ipa 时,它将使用新导入和更新的 adhoc 配置文件来创建 ipa文件。

在执行您询问的此操作之前如何导入更新的配置文件?好吧,只需双击新下载的配置文件,并确保在弹出的窗口中删除其较旧的兄弟姐妹,以显示它们现在都坐在您的 Mac 上。您可以通过目视检查“创建日期”的值来确定哪个较旧

这应该是显而易见的,但不知何故不是,我想知道有多少其他人遭受同样的痛苦。

4

1 回答 1

0

类似以下的东西应该可以工作(取自我创建的使用 xcodebuild 命令行工具构建应用程序的项目):

- (BOOL)createSignedIPA:(NSError **)error
{
   [self.delegate builder:self didUpdateStatus:@"creating IPA, please be patient ..."];

   NSTask *task = [[NSTask alloc] init];
   NSString *path = @"/usr/bin/xcrun";
   [task setLaunchPath: path];

   NSString *input = [MOB_PROJECT_DIR stringByExpandingTildeInPath];
   input = [NSString stringWithFormat:@"%@/build/%@-iphoneos/yourapp.app", input, isDemoApp ? @"Debug" : @"Release"]; 

   NSString *output = [@"~/Desktop" stringByExpandingTildeInPath];
   output = [NSString stringWithFormat:@"%@/%@%ld.ipa", output, isDemoApp ? @"demo" : @"app", appIdentifier];

   NSString *bundleIdentifier = [self bundleIdentifier];
   NSString *profile = [self pathForProfileWithBundleIdentifier:bundleIdentifier error:error];   
   if (!profile) 
      if (*error) 
         return NO;
      else 
      {
         NSString *message = [NSString stringWithFormat:@"no profile found for bundle %@", bundleIdentifier];
         NSDictionary *userInfo = [NSDictionary dictionaryWithObject:message forKey:NSLocalizedDescriptionKey];
         *error = [NSError errorWithDomain:MOB_APP_DOMAIN code:MOB_ERR_PROFILE_NOT_FOUND userInfo:userInfo];
         return NO;
      }

   NSLog(@"%@", profile);

   NSArray *arguments = [NSArray arrayWithObjects:
                         @"-sdk", @"iphoneos5.0", 
                         @"PackageApplication", input,
                         @"-o", output, 
                         @"--sign", isDemoApp ? @"Wolfgang Schreurs (YK9DVMECC4)" : @"My Company",
                         @"--embed", profile,
                         @"-verbose",
                         nil];
   [task setArguments:arguments];

   NSString *projectDirectory = [MOB_PROJECT_DIR stringByExpandingTildeInPath];
   [task setCurrentDirectoryPath:projectDirectory];

   NSPipe *pipe = [NSPipe pipe];
   [task setStandardOutput: pipe];
   [task setStandardInput:[NSPipe pipe]]; 
   NSFileHandle *file = [pipe fileHandleForReading];

   [task launch];

   NSData *data = [file readDataToEndOfFile];
   NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

   [self.delegate builder:self didUpdateStatus:string];

   return YES;
}

~/Library/MobileProvisioning在上面的这个片段中,我从构建目录中获取 *.app 并使用来自(或类似的东西)的配置文件创建一个签名的 IPA 。

于 2011-08-15T22:31:57.543 回答