美文网首页
ipa重签名-ruby实现

ipa重签名-ruby实现

作者: Billlin | 来源:发表于2017-12-13 23:22 被阅读0次

    需要的文件:

    appName.ipa: 要重签名的ipa

    embedded.mobileprovision: 用来签名的provision文件

    entitlements.plist: 授权机制

    distributionName: 指该签名对应的证书的名字,在keychain中可以找到对应证书的名称

    步骤:

    步骤一:将ipa包、mobileprovision文件、plist文件、iOSCodeSign.rb放在同一目录下。

    步骤二:更改entitlements.plist文件,其中application-identifier中的BundleID必须是用来签名的证书下的BundleID,不然会出现安装ipa包不成功。

    步骤三:更改iOSCodeSign.rb脚本,第一部分的内容需要填写,IPA为ipa包的名字,PROVISION为mobileprovision文件的名字,PLIST文件必须命名为entitlements.plist,KEY为证书名字,BUNDLEID为BundleID,如果不修改则不填。

    步骤四:运行脚本 ruby iOSCodeSign.rb。

    iOSCodeSign.rb

    =begin
    需要的文件:
    appName.ipa: 要重签名的ipa
    embedded.mobileprovision: 用来签名的provision文件
    entitlements.plist: 授权机制
    distributionName: 指该签名对应的证书的名字,在keychain中可以找到对应证书的名称
    
    步骤:
    步骤一:将ipa包、mobileprovision文件、plist文件、iOSCodeSign.rb放在同一目录下。
    步骤二:更改entitlements.plist文件,其中application-identifier中的BundleID必须是用来签名的证书下的BundleID,不然会出现安装ipa包不成功。
    步骤三:更改iOSCodeSign.rb脚本,第一部分的内容需要填写,IPA为ipa包的名字,PROVISION为mobileprovision文件的名字,PLIST文件必须命名为entitlements.plist,KEY为证书名字,BUNDLEID为BundleID,如果不修改则不填。
    步骤四:运行脚本 ruby iOSCodeSign.rb。
    =end
    
    # 需要填写
    IPA = "example.ipa" # 用来重签名的ipa包
    PROVISION = "example.mobileprovision" # 用来重签名的provision,可自定义命名
    PLIST = "entitlements.plist" # entitlements文件,必须命名为entitlements.plist
    KEY = "" # 用来重签名的证书,在钥匙串可以获得
    BUNDLEID = "" # BundleID,如果不需要改BundleID则不填
    
    
    @ipa = Dir.pwd + "/" + IPA
    @provision = Dir.pwd + "/" + PROVISION
    @plist = Dir.pwd + "/" + PLIST
    @payLoad = Dir.pwd + "/" + "Payload"
    
    # 解压ipa包
    def unzipIPA
        if Dir.exist? @payLoad
            `rm -rf #{@payLoad}` # 删除非空的文件夹
        end
    
        `unzip #{@ipa}`
    end
    
    # 修改BundleID
    def changeBundleID
        if BUNDLEID.length > 0 # 需要修改BundleID
            appName = getAppName
            infoPlist = "#{@payLoad}/#{appName}/Info.plist"
    
            if File.exist? infoPlist # 可以更改BundleID
                `/usr/libexec/PlistBuddy -c 'Set :CFBundleIdentifier #{BUNDLEID}' #{infoPlist}`
            else
                puts "Info.plist文件不存在"
            end
        end
    end
    
    # 更换证书
    def changeProvision
        oldProvision = @provision
        newProvision = "#{@payLoad}/#{getAppName}/embedded.mobileprovision"
        `cp #{oldProvision} #{newProvision}`
    end
    
    # 重签名
    def reSign
        reSignFrameWork
        reSignApp
    end
    
    # 对framework重签名
    def reSignFrameWork
        frameworks = "#{@payLoad}/#{getAppName}/Frameworks"
        if Dir.exist? frameworks
            Dir.foreach frameworks do |framework|
                if framework.end_with? ".framework"
                    `codesign -fs "#{KEY}" --no-strict --entitlements #{@plist} #{frameworks}/#{framework}`
                end
            end
        end
    end
    
    # 对app重签名
    def reSignApp
        `codesign -fs "#{KEY}" --no-strict --entitlements #{@plist} #{@payLoad}/#{getAppName}`
    end
    
    # 打包
    def zipIPA
        newAppName = getAppName.gsub(".app", "") + "_resign.ipa"
    
        `zip -r #{newAppName} Payload`
    end
    
    # 获取appName
    def getAppName
        appName = ""
         Dir.foreach @payLoad do |file|
            if file.end_with? "app"
                appName = file
                break
            end
         end
         appName
    end
    
    # 程序开始
    if File.exist? @ipa
        if File.exist? @provision
            if File.exist? @plist
                if KEY.length > 0
                    unzipIPA
                    changeBundleID
                    changeProvision
                    reSign
                    zipIPA
                else
                    puts "证书为空"
                end
            else
                puts "entitlements.plist文件不存在"
            end
        else
            puts "provision文件不存在"
        end
    else
        puts "ipa包不存在"
    end
    
    

    相关文章

      网友评论

          本文标题:ipa重签名-ruby实现

          本文链接:https://www.haomeiwen.com/subject/sydtwxtx.html