最简单方案

注意:在重签名之前要把从appStore上下载的app砸壳

http://bbs.iosre.com/t/topic/2966

答案是使用签名脚本
Sigh script at github102
安装好brew,先用brew安装ruby,然后用gem安装sigh。

1
2
1、brew install ruby
2、sudo gem install sigh

使用就非常简单了:
1、把.mobileprovision跟 ipa包放在同一个文件夹下。cd到这个目录
2、输入sigh resign,回车。会列出 Avaiable identities:列表
3、复制列表上对应 .mobileprovision的证书名字。粘贴输入。

如果像是微信那种带多targets的应用,可以直接调用resigh.sh进行签名:

1
./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p "bundel id"=<path_to_provisioning_profile_for_app>.mobileprovision -p "bundel id"=<path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p "bundel id"=<path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p "bundel id"=<path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

我详细举个例子说明吧,重签名一个叫乐动力的应用,里面包含一个XQTodayExtension.appex的通知栏插件,我们来看怎么签名:
1、先去导出两个mobileprovision文件,分别是应用和Plugin的,这里我导出了1. mobileprovision和2. mobileprovision,分别对应com.fenzi.xiaoqin和com.fenzi.xiaoqin.XQTodayExtension。
2、在1.4这个版本的sigh里,resigh.sh的位置是/usr/local/lib/ruby/gems/2.3.0/gems/sigh-1.4.0/lib/assets/resign.sh,运行resign.sh进行签名:

1
resign.sh /Users/Dylan/Code/LDL/xiaoqin.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p com.fenzi.xiaoqin=/Users/Dylan/Code/LDL/1.mobileprovision -p com.fenzi.xiaoqin.XQTodayExtension=/Users/Dylan/Code/LDL/2.mobileprovision /Users/Dylan/Code/LDL/xiaoqin2.ipa

保存下来的xiaoqin2.ipa就是重签之后的文件。如果有苹果手表的文件,也同理处理。

sign脚本还有很多实用的功能,比如直接申请ADHOC签名证书,申请Developent签名证书等等。
而sign脚本是fast lane系列工具中的一个,有兴趣可以研究下,功能非常强大。

https://github.com/fastlane/fastlane

自己输命令动手方案

  • 给动态库签名

把对应着“iPhone Developer: Chen Bo (WE5J649Y8C)” 这个证书的 .mobileprovision描述文件跟 libDynamicMachO.dylib放在同一个文件下面。执行下面的命令给动态库签名

1
codesign -f -s "iPhone Developer: Chen Bo (WE5J649Y8C)" libDynamicMachO.dylib
  • 给ipa的可执行文件签名

这里需要一个EntitleMents.plist文件, N629B89TN9.hehele.DyldHook中的 N629B89TN9是developer.apple.com后台上可以查到的开发者Team ID。 hehele.DyldHook是应用包名。

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>N629B89TN9.hehele.DyldHook</string>
<key>get-task-allow</key>
<true/>
</dict>
</plist>

把EntitleMents.plist、mobileprovision、.app放在同一个目录下。执行下面的命令

1
codesign -f -s "iPhone Developer: Chen Bo (WE5J649Y8C)" --entitlements Entitlements.plist DyldHook.app
  • 打包成.ipa命令。 或者放到 Payload目录下面,压缩改后缀名为 .ipa
1
xcrun -sdk iphoneos PackageApplication -v DyldHook.app -o ~/Desktop/hooked.ipa

工具

验证签名是否成功,可以用下面的命令查看签名详情

1
codesign -dv /path/to/YourApp.app