forked from joejulian/gio-cmd
gogio: [macOS] support custom profile
This patch enables `-signkey` to load provisioning profiles. Signed-off-by: inkeliz <inkeliz@inkeliz.com> Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+44
-16
@@ -75,7 +75,29 @@ func buildIOS(tmpDir, target string, bi *buildInfo) error {
|
||||
if err := exeIOS(tmpDir, target, appDir, bi); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := signIOS(bi, tmpDir, appDir); err != nil {
|
||||
|
||||
embedded := filepath.Join(appDir, "embedded.mobileprovision")
|
||||
|
||||
var provisions []string
|
||||
if bi.key == "" {
|
||||
if ext := filepath.Ext(bi.key); ext != ".mobileprovision" && ext != ".provisionprofile" {
|
||||
return fmt.Errorf("sign: -signkey specifies an Apple provisioning profile, but %q does not end in .mobileprovision or .provisionprofile", bi.key)
|
||||
}
|
||||
provisions = []string{bi.key}
|
||||
} else {
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
p, err := filepath.Glob(filepath.Join(home, "Library", "MobileDevice", "Provisioning Profiles", "*.mobileprovision"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
provisions = p
|
||||
}
|
||||
|
||||
if err := signApple(bi.appID, tmpDir, embedded, appDir, provisions); err != nil {
|
||||
return err
|
||||
}
|
||||
return zipDir(out, tmpDir, "Payload")
|
||||
@@ -84,16 +106,8 @@ func buildIOS(tmpDir, target string, bi *buildInfo) error {
|
||||
}
|
||||
}
|
||||
|
||||
func signIOS(bi *buildInfo, tmpDir, app string) error {
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
provPattern := filepath.Join(home, "Library", "MobileDevice", "Provisioning Profiles", "*.mobileprovision")
|
||||
provisions, err := filepath.Glob(provPattern)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// signApple is shared between iOS and macOS.
|
||||
func signApple(appID, tmpDir, embedded, app string, provisions []string) error {
|
||||
provInfo := filepath.Join(tmpDir, "provision.plist")
|
||||
var avail []string
|
||||
for _, prov := range provisions {
|
||||
@@ -117,17 +131,23 @@ func signIOS(bi *buildInfo, tmpDir, app string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
provAppID, err := runCmd(exec.Command("/usr/libexec/PlistBuddy", "-c", "Print:Entitlements:application-identifier", provInfo))
|
||||
|
||||
// iOS/macOS Catalyst
|
||||
provAppIDSearchKey := "Print:Entitlements:application-identifier"
|
||||
if filepath.Ext(prov) == ".provisionprofile" {
|
||||
// macOS
|
||||
provAppIDSearchKey = "Print:Entitlements:com.apple.application-identifier"
|
||||
}
|
||||
provAppID, err := runCmd(exec.Command("/usr/libexec/PlistBuddy", "-c", provAppIDSearchKey, provInfo))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
expAppID := fmt.Sprintf("%s.%s", appIDPrefix, bi.appID)
|
||||
expAppID := fmt.Sprintf("%s.%s", appIDPrefix, appID)
|
||||
avail = append(avail, provAppID)
|
||||
if expAppID != provAppID {
|
||||
continue
|
||||
}
|
||||
// Copy provisioning file.
|
||||
embedded := filepath.Join(app, "embedded.mobileprovision")
|
||||
if err := copyFile(embedded, prov); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -147,10 +167,18 @@ func signIOS(bi *buildInfo, tmpDir, app string) error {
|
||||
}
|
||||
identity := sha1.Sum(certDER)
|
||||
idHex := hex.EncodeToString(identity[:])
|
||||
_, err = runCmd(exec.Command("codesign", "-s", idHex, "-v", "--entitlements", entFile, app))
|
||||
_, err = runCmd(exec.Command(
|
||||
"codesign",
|
||||
"--sign", idHex,
|
||||
"--deep",
|
||||
"--force",
|
||||
"--options", "runtime",
|
||||
"--entitlements",
|
||||
entFile,
|
||||
app))
|
||||
return err
|
||||
}
|
||||
return fmt.Errorf("sign: no valid provisioning profile found for bundle id %q among %v", bi.appID, avail)
|
||||
return fmt.Errorf("sign: no valid provisioning profile found for bundle id %q among %v", appID, avail)
|
||||
}
|
||||
|
||||
func exeIOS(tmpDir, target, app string, bi *buildInfo) error {
|
||||
|
||||
Reference in New Issue
Block a user