質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Swift

    8404questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4728questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    4485questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

XCodeでDupulicateしたプロジェクトで、元のプロジェクトでシリアライズ/デシリアライズしたファイルを扱いたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 457

bizkit.kit

score 21

【Xcode 8.3.3を使用】

既にリリース済みのアプリ(有料版)があり、今回無料版をリリースしました。
無料版はTARGETをDupulicateして作成しています。
(有料版のTARGET名に”Free”という文字列を足して無料版のTARGET名としました)

先にリリースしていた有料版で、データをファイルにシリアライズ/デシリアライズする処理があります。
(NSCording,NSKeyedUnarchiver,NSKeyedArchiverを使っています。)
アプリで作成したデータを保存したり読み込んだりする処理です。

無料版を作成して、有料版で作った方のファイルを読み込もうとすると
the class may be defined in source code or a library that is not linked
と出てエラーになりました。

ファイルへ書き込むクラスの構造は有料版と無料版で同じなのですが、
どうもターゲット名が変わったことが原因のようでした。

※今回の無料版では、有料版のファイル読み込みは保留してリリースしました。

実現したいのは、
・先にリリースしている有料版に影響を与えないで、無料版でも有料版で作成したファイルを読み込めるようにする。
・無料版で作成したファイルも有料版で読み込めるようにする。

です。
調べてみたのですがイマイチわかりませんでした。名前空間とかその辺だとは思うのですが・・・。

以上、よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

TARGET名がHogehoge、クラス名がHogeとして、Unarchiveする前に、

NSKeyedUnarchiver.setClass(Hoge.self, forClassName: "Hogehoge.Hoge")

としてみて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/24 16:51

    回答ありがとうございます。

    試してみたところ、「有料版」でシリアライズしたファイルを「無料版」で読み込むことが出来ました。
    しかし、逆を試したところ(無料版でシリアライズしたファイルを有料版で読み込む)と、やはり例外となりました。

    現状、コンパイル時のフラグで有料版と無料版の処理を分けているのですが、デシリアライズの処理を、
    有料版の時→forClassNameのターゲット名を無料版のターゲット名に
    無料版の時→forClassNameのターゲット名を有料版のターゲット名に

    とすれば出来そうですね。(すみません、今ちょっと分け合って本番環境のソースが触れないので、テストプロジェクトを作って試していました。)

    一つ質問させて下さい。
    今回シリアライズしているクラスは数階層になっていて、ルートのクラスだけご教授いただいたsetClassをしてもその下の階層のクラスで例外になりました。
    setClassを階層のクラスすべてについて呼ぶとうまく動きました。

    このsetClassを呼ぶタイミングなのですがアプリ全体で1回でよいのでしょうか?
    AppDelegateあたりで1回呼んでおけばよいですか?


    以上、よろしくお願い致します。

    キャンセル

  • 2017/08/24 17:14

    逆の場合もあるのであれば、無料版/有料版のどちらも同じ名前にすればいいと思います。
    Archive時にNSKeyedArchiverの setClassName(_:for:) を使えば良さそうです。(試してないです)

    >>呼ぶタイミング
    ClassNameについては今回の質問を見て調べただけですので詳しいことは分かりません。
    そちらで試行錯誤していただければと思います。

    キャンセル

  • 2017/08/24 19:30

    クラス名を変えるしかないですか。。。
    既にリリースしてしまったのでちょっと厳しそうです。

    ご助言頂いた内容をキーワードに色々調べてみようと思います。ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • Swift

    8404questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4728questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    4485questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • トップ
  • iOSに関する質問
  • XCodeでDupulicateしたプロジェクトで、元のプロジェクトでシリアライズ/デシリアライズしたファイルを扱いたい