1

plist ファイルのデータを保存して使用するアプリがあります。データを表示してファイルに保存するには、同じ plist ファイルにアクセスする必要がある WatchKit 拡張機能に取り組んでいます。アプリ グループを使用する必要があることはわかっていますが、iOS アプリと WatchKit 拡張機能の間で plist を共有する方法がわかりません。

現在、iOSアプリでplistに保存する方法は次のとおりです。

NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docPath = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"locations.plist"];
    BOOL fileExists = [fileManager fileExistsAtPath:docPath];
    NSError *error = nil;

    if (!fileExists) {
        NSString *strSourcePath = [[NSBundle mainBundle]pathForResource:@"locations" ofType:@"plist"];
        [fileManager copyItemAtPath:strSourcePath toPath:docPath error:&error];
    }

    NSString *path = docPath;
    NSMutableArray *plistArray = [[NSMutableArray alloc]initWithContentsOfFile:path];
    NSDictionary *locationDictionary = [NSDictionary dictionaryWithObjectsAndKeys:self.locationNameTextField.text, @"locationName", latString, @"latitude", longString, @"longitude", nil];
    [plistArray insertObject:locationDictionary atIndex:0];
    [plistArray writeToFile:docPath atomically:YES];
4

2 に答える 2

3

(メインの iPhone アプリと Watch 拡張機能の両方で) アプリ グループをセットアップしたら、共有フォルダーへのパスを取得できます。

NSURL *groupContainerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"YourAppGroupSuiteName"];
NSString *groupContainerPath = [groupContainerURL path];

その後、 を使用してgroupContainerPathを構築できますdocPath。それ以外の場合、コードはそのまま動作するはずです。

于 2015-04-23T15:41:19.427 に答える
0

Swift を使用して、メインの既存の iPhone アプリの plist データを WatchKit アプリで正常に使用できました。

次の 2 つの手順があります。

  1. 使用する各 plist の WatchKit アプリ拡張ターゲット メンバーシップを有効にします。plistをクリックしてから:

ここに画像の説明を入力

  1. これは、「id」フィールドと「name」フィールドを持つ plist を読み取るために使用した Swift コードです。

    func valueFromPlist(value: Int, file: String) -> String? {
        if let plistpath = NSBundle.mainBundle().pathForResource(file as String, ofType: "plist") {
    
            if let entries = NSArray(contentsOfFile: plistpath) as Array? {
                var entry = Dictionary<String, Int>()
    
                for entry in entries {
                    if let id = entry.objectForKey("id") as? Int {
                        if id == value {
                            if let name = entry.objectForKey("name") as? String {
                                return name
                            }
                        }
                    }
                }
            }
        }
        return nil
    }
    
于 2015-05-17T16:07:15.850 に答える