What’s new in Apphud: Paywall Analytics, Stripe Web Payments Support and Xiaomi SDKLet’s see
Apphud
Why Apphud?PricingContact
Ren
Ren
March 27, 2021
1 min read

Баг в StoreKit Testing: не работают Subscription Offers

На данный момент ни для кого не работает покупка промо-офферов с использованием ключа подписки из Xcode. Незасивимо от того, используете ли вы Apphud.

Баг в StoreKit Testing: не работают Subscription Offers

Ключ подписки из App Store Connect

Как вы возможно знаете, для покупки промо-офферов необходимо сгенерировать подпись с помощью ключа подписки, скачанного из App Store Connect. Ключ можно создать в разделе Users & Access > Keys.

Сам по себе PKCS#8 приватный ключ имеет расширение .p8 и использует эллипитический алгоритм ECDSA P-256. Более подрубно описано в документации Apple.

Если открыть содержимое ключа в текстовом редакторе, то будет выглядеть так:

\-----BEGIN PRIVATE KEY----- 
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgKfLl2Sldom13UQJi  
WdTL8aRc90qEigTA/QelysCOTiCgCgYIKoZIzj0DAQehRANCAASm29jY3KbTHtJI  
GkOgiXtvWnidZp5N+B/RDC9T0n/vZV/UCmbAA1wa1f5jF6E2YwzK5r/fsTAEac66  
IlbfvTT4  
\-----END PRIVATE KEY-----

Данные ключи работают исправно и Apphud умеет создавать подписи для них при покупке промо офферов.

Ключ подписки из Xcode 12

Ключ подписки, сгенерированный в Xcode, имеет другой формат и алгоритм, описанный в документации Apple, не подходит!

Ключ подписки в Xcode 12Ключ подписки в Xcode 12

Чтобы найти данное попап окно:

  • Создайте конфигурационный файл StoreKit, как описано в нашем предыдущем посте по ссылке выше.
  • Выбрав данный файл в Xcode, перейдите в Editor -> Subscription Offers Key.

Ключ подписки состоит из пары публичного и приватного ключа. Xcode отображает в попапе только приватный ключ. Чтобы посмотреть пару ключей, откройте ваш Configuration.storekit файл в любом текстовом редакторе, он имеет JSON формат. Там вы найдете ключ subscriptionOffersKeyPair. Пара выглядит таким образом:

"subscriptionOffersKeyPair" : {  
    "id" : "AD97257D",  
    "privateKey" : "MF8CAQEEGNSWDVsrVXfxGfn2wvQAUUNHA/S+nqDvwqAKBggqhkjOPQMBAaE0AzIA\\nBK0s7Oq6mdN0mcimQvy+ofIpVfnZx7b/KZ7uesoNx6LwwQ3w5XyjrUN5Mx1onhl8\\nQg==",  
    "publicKey" : "MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAErSzs6rqZ03SZyKZC/L6h8ilV+dnH\\ntv8pnu56yg3HovDBDfDlfKOtQ3kzHWieGXxC"  
  }

Баг

Сам баг состоит в том, что приватный ключ, скачанный из App Store Connect использует ECDSA P-256 эллиптический алгоритм, тогда как приватный ключ из StoreKit Testing использует кривую P-192. OpenSSL идентифицирует ключ как prime192v1. При попытке прочитать ключ с помощью OpenSSL обычным образом выдается ошибка "Unable to load key" либо "Could not parse PKey: no start line".

Мы связались с премиум поддержкой Apple DTS Support, они подтвердили данный баг в Xcode. Ошибка сохраняется в Xcode 12.4 (12D4e) и Xcode 12.5 beta (12E5220o).

Обходной путь

По умолчанию, OpenSSL не может прочитать ключ с хедером и футером, который отображает Xcode.

Можно это обойти, вручную изменив хедер на:

```
-----BEGIN EC PRIVATE KEY-----
```

//и футер на:

 `-----END EC PRIVATE KEY-----`

Мы продолжаем коммуникацию с Apple, чтобы добиться успешной работы ключей попдиски из StoreKit Testing и обновим данную статью, когда проблема будет решена. Надеемся в следующем обновлении Xcode 12 данная проблема будет исправлена.

Спасибо!

Ren
Ren
Co-founder at Apphud
Ex iOS app and game developer. 11 years in the industry since iOS 3. More than 50 apps are in the background with 4 exits. Entrepreneur and traveler.

Related Posts