ねこ島

iOSのこととか、日常について雑に書きます

1Passwordのプラン変更の罠にハマった

1Passwordの個人アカウントをファミリープランに変更しようとしたら詰まりかけた。

TL;DR

  • 1Passwordでファミリープランを使う予定があるならアプリ内課金で支払いしちゃダメ
  • ちゃんとクレジットカード登録しよう
  • 1Passwordのサポートはめちゃくちゃ返信が早くて良いぞ

何が起きたのか

前から1Passwordの個人アカウントを使い続けていたのですが、ある日ヨッメが1Passwordを使いたいと言い出したことから始まった。

個人アカウントは名前の通り個人でしか使えず、例えば他の人を招待して使おうとすると、ファミリープランあるいはビジネスプランに変更する必要がある。

で、今回は家族で使うためファミリープランに変更しようとしたところ…そのような項目がない。

支払い項目を見ても、「サブスクリプションがアクティブです」とあるだけで変更ができない状態となっており、どうなっとんじゃとHelpを見るとこんな一文が

support.1password.com

If you started your subscription with an in-app purchase, you won’t see the option to invite people. For help upgrading your account, contact 1Password Support.

「アプリ内課金から定期購読(サブスクリプション)を始めた場合、招待のオプションが出ないよ!アップグレードしたい場合はサポートに連絡してね!」

なん…だと?

そういえば1Passwordを始める時、アプリ内課金の方がカード支払いより安かったのでそっちを選んだんだっけな…orz

サポートに連絡

11時ごろ

とりあえずここから「I want to upgrade to 1Password Families」を選択。名前とメアドを入力して、詳しい内容を記載して送った。

support.1password.com

すると1分ぐらい後に自動メールがきた。 内容は、

「1Password Familiesに変更したいときは以下の手順を踏んでね! もしアプリ内課金で定期購読を始めた場合はこのメールに返信してね!」

とのことだったので、↑で書いた内容をそのまま返信。

15時ごろ

メールが返ってきた。内容としては、

「君のアカウントではアプリ内課金を使ってるから、サブスクリプションをキャンセルして1Passwordの決済システムに移行する必要があるよ!その際一瞬アカウントが凍結するけど、サインインして1Password Familiesに変更することによって復活できるので安心してね。 理解したら、iTunesから1Passwordのサブスクリプションをキャンセルして連絡をくれよな!」

とのことだったので、AppStore→アカウント→サブスクリプションから1PasswordのAnnual Subscriptionをキャンセル。 そして対応したことを伝える。

20時ごろ

1Passwordからクレジットが追加されたメールと試用期間が終了したというメールが来る。 元々年払いをしていてまだ期限まで残っていたので、その分をクレジットとして追加してもらえたようだ。

サポートからもメールが来ていて、

「アプリ内課金で残っていた分をクレジットに追加したよ! 1Passwordにサインインして、招待からファミリーアカウントにアップグレードしてくれよな!」

とあったので1Passwordにサインインするとサイドバーに招待が追加されている状態となっていた。 そして無事にファミリーアカウントへ変換できましたとさ。

所感

アプリ内課金は楽だけどこういう罠があるんだなーということを思い知りました。

あとこの大変な時期にも関わらず、サポートの返信が爆速で本当に助かりました。

上記には書いていないのですが、返信メールの最初の方に、「大変な時期ですが、あなたとあなたの周りの人が元気でいられることを願っています」の一文があってすごい配慮だなと思いました。

ありがとう1Passwordの中の人。

XcodeGenでEmbedded Frameworkを扱う

今日初めてEmbedded Frameworkを使おうとしたのですが、XcodeGenと組み合わせた時どうするんだっけ?となったのでメモとして残しておきます。

Embedded Frameworkとは

直訳すると「埋め込みフレームワーク」となるEmbedded Frameworkは、アプリのコードの一部をFrameworkとして扱うことができます。

この機能を使う利点は複数あり、

  • 必要なFrameworkだけビルドを行うのでビルドの高速化が期待できる
  • AppExtensionとコードを共有できる
  • 名前空間が分かれるため、テストを意識したコードがかける(はず)

と、アプリ開発する上で最初に導入しておくと後々効いてきそうだと思いました。

XcodeGenと組み合わせる

Embedded FrameworkはXcodeのTargetから追加できますが、前述の通りXcodeGenでプロジェクトデータを管理しているため、FrameworkもXcodeGenで管理の対象とする必要があります。

なので、project.ymlをこんな感じにしました。

name: TestApp
options:
  bundleIdPrefix: com.example
targetTemplates:
  EmbeddedFramework:
    platform: iOS
    type: framework
    sources:
      - path: ${target_name}
  EmbeddedFrameworkTests:
    type: bundle.unit-test
    platform: iOS
    dependencies:
      - target: TestApp
    sources:
      - path: ${target_name}
targets:
  TestApp:
    type: application
    platform: iOS
    sources:
      - path: TestApp
    dependencies:
      - target: TestAppData
      - target: TestAppDomain
      - target: TestAppExtension
  TestAppTests:
    templates:
      - EmbeddedFrameworkTests
  TestAppData:
    templates: 
      - EmbeddedFramework
  TestAppDataTests:
    templates:
      - EmbeddedFrameworkTests
  TestAppDomain:
    templates: 
      - EmbeddedFramework
  TestAppDomainTests:
    templates:
      - EmbeddedFrameworkTests
  TestAppExtension:
    templates: 
      - EmbeddedFramework
  TestAppExtensionTests:
    templates:
      - EmbeddedFrameworkTests
  ...

ここではFrameworkをData, Domain, Extension…と分けており、それぞれ同じBuild Settingsを使いたいので、targetTemplatesを使って共通で使えるようにしています。

参考

github.com techlife.cookpad.com