3

これは、このサイトでの最初の質問です。解決できない問題があります。

今日の拡張機能を備えた簡単なメモアプリケーションに取り組んでいます。Swift 2.2 と iOS 9 では問題はありませんでした。iOS 10 の Swift 2.3 と Swift 3 で問題が発生しました。問題は次のとおりです。

ユーザーはメモを書き (UserDefaults に保存)、通知センターを開き、TodayExtension で自分のメモを見ることができます。

UserDefaults にメモを保存し、UserDefaults から取得するこれらのメソッドがあります (グループを使用しているため、アプリケーションと拡張機能の機能ですべてが適切に設定されています - さらに、オブジェクトにはもちろん NSCoding メソッドが必要です) :

open class NoteManager: NSObject {

    private static let kKEY: String! = "Notes"
    private static let kSUITENAME: String! = "Team.group.bundleIdentifier"

    open static func saveNotes(_ notes: [Note]) {
        let notesData = NSKeyedArchiver.archivedData(withRootObject: notes)

        let defaults = UserDefaults(suiteName: kSUITENAME)!
        defaults.set(notesData, forKey: kKEY)
        defaults.synchronize()
    }

    open static func retrieveNotes() -> [Note] {
        let notesFromDefault = UserDefaults(suiteName: kSUITENAME)!.object(forKey: kKEY)
        var returnedNotes: [Note]! = [Note]()

        if notesFromDefault != nil {
            if let notesData: Data? = notesFromDefault as! Data! {
                NSKeyedUnarchiver.setClass(Note.self, forClassName: "Application_Name.Note")
                NSKeyedUnarchiver.setClass(Preference.self, forClassName: "Application_Name.Preferences")
                let unarchivedNotes = NSKeyedUnarchiver.unarchiveObject(with: notesData!) as? [Note]

                if let notes: [Note] = unarchivedNotes! as [Note]! {
                    returnedNotes = notes
                }
            }
        }

        return returnedNotes
    }
}

iOS アプリケーションでは、問題はありません。UserDefaults は、このコードでうまく機能します。しかし、TodayExtension を開くと、次の行 (retrieveNotes() 内) は常に nil を返します。

let notesFromDefault = UserDefaults(suiteName: kSUITENAME)!.object(forKey: kKEY)

そのため、TodayExtension は常にメモがないと言っています。この問題が発生する理由はありますか?

ご協力ありがとうございました !:)

4

2 に答える 2

2

問題を部分的に解決しました。

Xcode とすべての設定 (キャッシュ ファイルなど) を完全に削除してから、スイート名の「チーム」の部分を削除しました。

Xcode コンソールに警告が表示されるようになりましたが、TodayExtension でメモを取得できます。ピウフ!

WatchKit 拡張機能にはまだ問題があります。よくわかりませんが、App Groups を使用しても UserDefaults は Apple Watch Extensions と共有されないことを読んだと思います。

しかし、Apple はドキュメントに次のように書いています。

そのため、Apple Watch からメモを取得できない理由がわかりません。

少なくとも私は最初の問題を解決しました。もし同じ人がいたら。

于 2016-10-15T20:45:48.740 に答える
1

私は同様の問題だと思うものを持っていました (私の問題は、具体的には、ios 9.x swift 2.x でユーザーによって保存されたデフォルトが新しい xcode8/swift3 で取得されないことでした; デフォルトは nil だったので、私は考えましたデータは失われていました)、これをシミュレーターまでさかのぼりました。Xcode8 は、実際には新しい「デバイス」である新しいシミュレーターを導入しました。Xcode8 シミュレーターを iOS 9.x バージョンに戻しましたが、デフォルトは期待どおりでした。

シミュレーターを追加するには、iOS シミュレーター リストの一番下までスクロールし、[追加のシミュレーターを追加] をクリックし、プロンプトに従って iOS 9.x シミュレーターに戻ります。

うまくいけば、これが役に立ちます!

于 2016-10-06T00:15:39.293 に答える