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

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

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

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

Xcode

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

Swift

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

Q&A

解決済

1回答

294閲覧

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

bizkit.kit

総合スコア30

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/08/23 14:54

編集2017/08/23 23:42

【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
と出てエラーになりました。

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

swift

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

としてみて下さい。

投稿2017/08/24 01:19

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bizkit.kit

2017/08/24 07:51

回答ありがとうございます。 試してみたところ、「有料版」でシリアライズしたファイルを「無料版」で読み込むことが出来ました。 しかし、逆を試したところ(無料版でシリアライズしたファイルを有料版で読み込む)と、やはり例外となりました。 現状、コンパイル時のフラグで有料版と無料版の処理を分けているのですが、デシリアライズの処理を、 有料版の時→forClassNameのターゲット名を無料版のターゲット名に 無料版の時→forClassNameのターゲット名を有料版のターゲット名に とすれば出来そうですね。(すみません、今ちょっと分け合って本番環境のソースが触れないので、テストプロジェクトを作って試していました。) 一つ質問させて下さい。 今回シリアライズしているクラスは数階層になっていて、ルートのクラスだけご教授いただいたsetClassをしてもその下の階層のクラスで例外になりました。 setClassを階層のクラスすべてについて呼ぶとうまく動きました。 このsetClassを呼ぶタイミングなのですがアプリ全体で1回でよいのでしょうか? AppDelegateあたりで1回呼んでおけばよいですか? 以上、よろしくお願い致します。
fuzzball

2017/08/24 08:14

逆の場合もあるのであれば、無料版/有料版のどちらも同じ名前にすればいいと思います。 Archive時にNSKeyedArchiverの setClassName(_:for:) を使えば良さそうです。(試してないです) >>呼ぶタイミング ClassNameについては今回の質問を見て調べただけですので詳しいことは分かりません。 そちらで試行錯誤していただければと思います。
bizkit.kit

2017/08/24 10:30

クラス名を変えるしかないですか。。。 既にリリースしてしまったのでちょっと厳しそうです。 ご助言頂いた内容をキーワードに色々調べてみようと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問