Mac Catalyst und OpenSSL

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ja, das ist auch mein aktueller Gedanke. Allerdings vermute ich, dass dies an z. B. der Receipt-Location und exit(173) scheitert, da Mac Catalyst Apps eigentlich iOS-like sind. Leider reagiert der Receigen-Autor nicht auf Support-Anfragen.

    Allerdings ergab ein Test gestern, das die UX ohne grössere Anpassungen noch nicht für eine Veröffentlichung passt ... ich lasse die Mac Catalyst Version wohl noch intern (und somit ist der IAP nicht kritisch).

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Gibt es eine weitere Entwicklung? Ich habe das gleiche Problem: ich bin auch dabei, eine iOS-App für den Mac mit Mac Catalyst vorzubereiten und nutze ebenfalls receigen (Xcode 13.1, macOS 12.0.1). Wenn ich die zum App Store Connect hochgeladene App für den Mac unter Testflight laufen lasse, bekomme ich noch nicht einmal Receipt, es scheitert also schon, bevor Receigen zum Einsatz kommt. Manchmal bekomme ich aber doch ein Receipt und dann scheitert es daran, dass der amerikanische App Store verwendet wird. Es scheint mir alles noch nicht so ausgereift.
  • Den Effekt des US-Stores hatte ich auch kurz. So ganz weiss ich nicht mehr, was ihn behob, aber es war im Rahmen von Abmelden, Anmelden oder so. Allerdings half das Empfangen eines Receipts dann auch nicht, weil der Versions- und Hash-Abgleich in Receigen wie oben beschrieben fehlschlägt. Reaktionen seitens des Autor blieben bisher aus.

    Ich habe die Mac-Catalyst-Version - ausser für die interne Verwendung - wieder auf Eis gelegt, auch wenn mit dem SDK 15 die ärgsten Probleme behoben sind. Allerdings habe ich den Eindruck, dass Mac Catalyst mit zunehmender Verbreitung der M1-Macs schon jetzt ein Stiefkind wird ... können diese doch die native iOS-ARM-App nutzen. Irgendwie werde ich das Gefühl nicht los, hier einen toten Gaul zu reiten...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Reaktionen seitens des Autor blieben bisher aus.
    Die Erfahrung habe ich leider auch gemacht. Receigen funktioniert nämlich nicht mit dem Xcode Storekit, ohne dass ich den generierten Code einer Massage mit sed unterziehe, die dafür sorgt, dass OpenSSL für das Zertifikat, das Xcode Storekit verwendet, NICHT die Zertifikatskette überprüft. Ich habe ihn ohne Reaktionen seinerseits zig mal angeschrieben, habe ihn jetzt auf Twitter gefunden (@letiemble) und dort mal öffentlich freundlich nachgefragt.
  • Ich sehe gerade ein wenig Licht am Ende des Tunnels: Zum ersten Mal ist es mir gelungen, eine Version meiner App mit Mac Catalyst zu bauen, die ich in Testflight auf dem Mac laufen lassen konnte. Zwar konnte ich keine neuen IA-Käufe tätigen, da immer der US-Store verwendet wird, aber ich sehe alle Käufe, die ich bislang mit dem iPhone getätigt habe und kann sie auch wiederherstellen. Den Receigen parametrisiere ich dabei mit os=OSX und version=CFBundleShortVersionString (wie es in der Beschreibung von Receigen for OSX steht) und das Verifizieren des Receipts läuft einwandfrei durch.

    Das Shell-Script für das Bauen von CheckReceipt.h:

    Shell-Script

    1. # XCODE_STOREKIT needs to be added to the User-Defined Build Settings (0: user default apple store, 1: use Xcode Storekit)
    2. BUNDLE_ID="$PRODUCT_BUNDLE_IDENTIFIER"
    3. PREFIX="RV1"
    4. BUNDLE_VERSION=$(eval "echo $(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") | tr -d '()'")
    5. RECEIPT_VERSION=$BUNDLE_VERSION
    6. if [ "$XCODE_STOREKIT" = "1" ]; then
    7. echo "Use XCODE STOREKIT for checking In-App Purchases validity"
    8. CA_NAME="StoreKit"
    9. CA_CER="$PROJECT_DIR/$PROJECT/StoreKitTestCertificate.cer"
    10. # Convert CER to PEM and only keep the base64 part without newlines
    11. CA_PEM=$(openssl x509 -inform DER -in "$CA_CER")
    12. CA_PEM_CONTENT=$(echo "$CA_PEM" | grep -v '\-' | tr -d '\n')
    13. CA_OID=2.5.29.37
    14. else
    15. echo "Use App Store for checking In-App Purchases validity "
    16. CA_NAME="Apple Root CA"
    17. fi
    18. if [ "$IS_MACCATALYST" = "YES" ]; then
    19. # From Receigen documentation:
    20. # On OS X, the version that is checked during validation is the one stored in the CFBundleShortVersionString
    21. # field of the Info.plist file. Never put the version in the CFBundleVersion field.
    22. PLATFORM=OSX
    23. BUNDLE_VERSION=$(eval "echo $(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE") | tr -d '()'")
    24. else
    25. PLATFORM=iOS
    26. fi
    27. # Check if Header file needs to be generated
    28. HEADER="$SCRIPT_OUTPUT_FILE_0"
    29. HEADER_AUX="$HEADER.descr"
    30. SKIP=0
    31. if [ -f "$HEADER_AUX" -a -f "$HEADER" ]; then
    32. egrep -q "Bundle Identifier *: $BUNDLE_ID" "$HEADER_AUX" \
    33. && egrep -q "Bundle Version *: $BUNDLE_VERSION" "$HEADER_AUX" \
    34. && egrep -q "Certificate Name *: $CA_NAME" "$HEADER_AUX" \
    35. && egrep -q "Platform *: $PLATFORM" "$HEADER_AUX" && SKIP=1
    36. fi
    37. # Generate the header file if needed
    38. if [ "$SKIP" == "0" ]; then
    39. echo "Creating new $HEADER"
    40. RECEIGEN="/Applications/Receigen.app/Contents/MacOS/Receigen"
    41. RECEIGEN_PARAMS="--identifier '$BUNDLE_ID' --version '$BUNDLE_VERSION' --openssl-version 1.1 --os $PLATFORM --success checkinappandreceipt --failure callblock --prefix '$PREFIX'"
    42. if [ "$XCODE_STOREKIT" = "1" ]; then
    43. # add parameters for Xcode StoreKit Certificate
    44. RECEIGEN_PARAMS="$RECEIGEN_PARAMS --signer-oid '$CA_OID' --root-ca-content '$CA_PEM_CONTENT'"
    45. fi
    46. eval echo "$RECEIGEN $RECEIGEN_PARAMS"
    47. "$RECEIGEN" $(eval echo "$RECEIGEN_PARAMS") > "$HEADER"
    48. rc=$?
    49. if [ "$rc" != "0" ]; then
    50. rm $HEADER
    51. exit $rc
    52. else
    53. if [ "$XCODE_STOREKIT" = "1" ]; then
    54. # Fix a receigen error: the Xcode StoreKit certificate has no chain and PKCS7_NOCHAIN should be used when verifying.
    55. # See WWDC20 video session "Introducing StoreKit Testing in Xcode" at 16:45. From the transcript to this video session:
    56. # Lastly, the StoreKit Test Certificate is not part of a certificate chain. [...] if I use open SSL for my client-side receipt validation, I would pass in the PKCS7 no chain argument, but only when building for debug.
    57. # We must change calls of __RV1PKCS7_verify with the parameters (pkcs7, NULL, store, NULL, NULL, 0)
    58. # // Check that the PKCS7 content is signed by a chain rooted by the "StoreKit" certificate
    59. # verify = ((__RV1PKCS7_verify) RV1CB00D(RV1CB004, 39, 31, 14, RV1CB003, 662, 5, 12))(pkcs7, NULL, store, NULL, NULL, 0) * 2464;
    60. sed -I "" -e "s/(pkcs7, NULL, store, NULL, NULL, 0)/(pkcs7, NULL, store, NULL, NULL, PKCS7_NOCHAIN)/" "$HEADER"
    61. echo "Fixed Receigen problem of Xcode StoreKit validation by using PKCS7_NOCHAIN"
    62. fi
    63. head -n 19 "$HEADER" | grep -v "^//$" | sed -e "s/^/\t/" > "$HEADER_AUX"
    64. fi
    65. ln -fs $HEADER $PROJECT_DIR/$PROJECT_NAME/$(basename "$HEADER")
    66. else
    67. echo "Reusing existing $HEADER"
    68. fi
    69. cat "$HEADER_AUX"
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von vilmos ()

  • Und inzwischen bin ich durch den Tunnel durch. Die ursprünglich für iPhone/iPad entwickelte App ist nun auch in einer mit MacCatalyst erstellten Variante für den Mac verfügbar (apps.apple.com/de/app/zoigl/id981873298). Auch die In-App-Käufe funktionieren inzwischen einwandfrei. Wer hier mitliest und in der Oberpfalz zu Hause ist und gelegentlich einen Zoigl trinken geht, mag eine Verwendung für die App haben. Alle anderen runzeln vermutlich die Stirn und fragen sich, was denn wohl Zoigl ist.

    vilmos schrieb:

    Ich sehe gerade ein wenig Licht am Ende des Tunnels
  • Glückwunsch ... zur Lösung und App. Vielleicht gehe ich das Thema ja noch einmal an. Ich vermute, der Hauptpunkt blieb die o. g. Unterscheidung zwischen der Platform beim Generieren der Receigen-Header? Oder gibt es noch Details / Fussangeln, die Du teilen magst?

    Mattes ... der sich nachher auch eine "Gersten-Kaltschale" gönnt :D
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Ich vermute, der Hauptpunkt blieb die o. g. Unterscheidung zwischen der Platform beim Generieren der Receigen-Header? Oder gibt es noch Details / Fussangeln, die Du teilen magst?
    Ja, es war im Wesentlichen die korrekte Parametrisierung von Receigen. Alle anderen Punkte (wie In-App-Kauf ging nicht, weil US-AppStore kontaktiert wurde u.ä.) haben sich wie auch immer "von selbst" ?( aufgelöst.
  • MyMattes schrieb:

    Allerdings habe ich den Eindruck, dass Mac Catalyst mit zunehmender Verbreitung der M1-Macs schon jetzt ein Stiefkind wird ... können diese doch die native iOS-ARM-App nutzen
    Ganz so ist es nicht. Ohne Catalyst bekommt man halt 1:1 die iPad-Variante, die sich doch eine wenig wie ein Fremdkörper anfühlt. Will man macOS spezifische Dinge, wie Kontext-Menüs, Toolbar, macOS Menü usw), muss man die Möglichkeiten von Mac Catalyst ausnutzen. Ich habe das bei meiner App teilweise gemacht, aber da ist sicher noch mehr Luft nach oben.
  • vilmos schrieb:

    Ganz so ist es nicht. Ohne Catalyst bekommt man halt 1:1 die iPad-Variante, die sich doch eine wenig wie ein Fremdkörper anfühlt. Will man macOS spezifische Dinge, wie Kontext-Menüs, Toolbar, macOS Menü usw), muss man die Möglichkeiten von Mac Catalyst ausnutzen. Ich habe das bei meiner App teilweise gemacht, aber da ist sicher noch mehr Luft nach oben.
    Fairer Punkt. Allerdings könnte ich mir vorstellen, dass man entsprechende UI-Anpassungen berücksichtigen wird, ohne eine gesonderte Plattform im Build zu unterstützen. Stattdessen könnten macOS-Besonderheiten genauso realisiert werden wie z. Z. Unterschiede zwischen iOS und iPadOS. Das Ergebnis wäre ein und das gleiche ARM-Executable.

    Spätestens wenn die gesamte Produktlinie auf Apple Silicon läuft gibt es m. E. für Apple keine Motivation mehr, Mac Catalyst weiter zu pflegen oder gar auszubauen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.