17725


[カスタムキーボードエクステンションからファイルが読み込めない](https://ja.stackoverflow.com/questions/14476/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8B%E3%82%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84)  
上記を参考にしていますが・・・

[code]

    print(realmPath)
    
[/code]

では

[code]

    /private/var/mobile/Containers/Shared/AppGroup/****-****--****/test.realm  
    
[/code]

となりますが・・・

[code]

    let realm = try! Realm(path: realmPath)
    
[/code]

のところで、

[code]

    2015-10-16 08:58:46.720 Test-Keyboard[8880:557651] ***storageTaskManagerExistsWithIdentifier:withIdentifier failed: Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service named com.apple.nsurlstorage-cache was invalidated." UserInfo={NSDebugDescription=The connection to service named com.apple.nsurlstorage-cache was invalidated.}; {
    NSDebugDescription = "The connection to service named com.apple.nsurlstorage-cache was invalidated.";}
    fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=1 "open() failed: Operation not permitted" UserInfo={NSLocalizedDescription=open() failed: Operation not permitted, Error Code=1}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.0.59/src/swift/stdlib/public/core/ErrorType.swift, line 50
    (lldb) 
    
[/code]

というエラーが出てしまいます。

データベースファイルを共有エリアにコピーとかが必要なのか？  
でも、それもgoogleで探していますが、方法がわかりません。

ソースは下記の通りです。

どうか改善策を、教えていただけないでしょうか？  
よろしくお願いいたします。

[code]

    import UIKit
    import RealmSwift
    import Foundation
    
    class dic: Object {
        dynamic var ID = 0
        dynamic var yomi = ""
        dynamic var emoji = ""
        dynamic var date = NSDate(timeIntervalSince1970: 1)
    
        override static func primaryKey() -> String? {
            return "ID"
        }
    }
    
    
    
    class KeyboardViewController: UIInputViewController {
    
        @IBOutlet var nextKeyboardButton: UIButton!
        var button11: UIButton!
        var button12: UIButton!
        var fFastBoot = true
        var fPri = CGFloat(20)
        var ifontSize = 18.0
        var RPath = ""
    
        // Portrait表示におけるキーボードの高さ
        private var portraitHeight: CGFloat = 190.0
        private var portraitWidth: CGFloat!
    
        // Landscape表示におけるキーボードの高さ
        private var landscapeHeight: CGFloat = 100.0
        private var landscapeWidth: CGFloat!
    
        override func updateViewConstraints() {
            super.updateViewConstraints()
    
        }
    
    
        var realmPath: String {
            let containerURL = NSFileManager().containerURLForSecurityApplicationGroupIdentifier("group.AppGrouptestKeybora")
            return containerURL!.URLByAppendingPathComponent("test.realm").path!
        }
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Perform custom UI setup here
    
            ・・・
    
            let inputText = "か"
            print("test1")  
            print(realmPath)
            realm = try! Realm(path: realmPath)  //ここでエラー
            print("test1.5")
            let results = realm.objects(dic)
                .filter("yomi BEGINSWITH %@", inputText)
                .sorted("date", ascending: false)
            print("test2")
    
    
            for result in results {
                print(result)
            }
            print("test3")
        }
    ・・・
    
[/code]

こんなのも、関係あるでしょうか？

[code]

    func createPath() -> String {
    
        let docsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory , NSSearchPathDomainMask.UserDomainMask, true)[0]
        let databaseStr = "test.realm"
        let dbPath = docsPath.stringByAppendingString(databaseStr)
    
        // BEGING MODIFICATION
        let fileMan = NSFileManager.defaultManager()
        if !(fileMan.fileExistsAtPath(dbPath)) {    // The database does not already exist in Documents directory
            if let source = NSBundle.mainBundle().resourcePath?.stringByAppendingString(databaseStr) {
                if !(fileMan.fileExistsAtPath(source)) {
                    print("RealmDB - file \(databaseStr) not found in bundle")
                } else {
                    do {
                        try fileMan.copyItemAtPath(source, toPath: dbPath)
                    } catch let error as NSError {
                        print("RealmDB - failed to copy writable version of DB!")
                        print("Error - \(error.localizedDescription)")
                    }
                }
            }
        }
        // END MODIFICATION
    
        return dbPath
    }
    
[/code]


CC BY-SA 3.0
2015-10-16T00:06:46.663
17703
2015-10-16T16:04:56.953
2017-04-13T12:52:38.920
-1
10845
question
swift ios8 realm
iOSでRealmデータベースを開こうとするとエラーになる(AppGroupの使用）


下記にありますように、共有コンテナでファイルを読み書きするには、フルアクセスの許可が必要です。

<https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/Keyboard.html#//apple_ref/doc/uid/TP40014214-CH16-SW3>

まず、キーボードエクステンションのInfo.plistの`NSExtensionAttributes`の`RequestOpenAccess`を`YES`にします。

[![画像の説明をここに入力](https://i.stack.imgur.com/y0jVy.png)](https://i.stack.imgur.com/y0jVy.png)

そうすると、設定.appの自分のキーボードのところが先に進めるようになっているはずなので、「フルアクセスを許可」をオンにします。

[![画像の説明をここに入力](https://i.stack.imgur.com/Eur7a.png)](https://i.stack.imgur.com/Eur7a.png)


CC BY-SA 3.0
2015-10-16T10:59:55.277
17725
2015-10-16T10:59:55.277
5519
17703
answer