在iOS App和WatchKit Extension之间共享Plist

时间:2015-04-23 14:39:57

标签: ios objective-c watchkit ios-app-group

我有一个应用程序可以保存和使用plist文件中的数据。我正在使用WatchKit扩展,需要访问相同的plist文件来显示数据并保存到文件中。我知道我需要使用应用程序组,但我不知道如何在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];

2 个答案:

答案 0 :(得分:3)

一旦设置了应用程序组(在主iPhone应用程序和Watch Extension中),您就可以获得共享文件夹的路径:

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

然后,您可以使用groupContainerPath来构建docPath。否则,您的代码应该按原样运行。

答案 1 :(得分:0)

我能够使用Swift在我的WatchKit应用程序中成功使用主要现有iPhone应用程序中的plist数据。

有两个步骤:

  1. 为您要使用的每个plist启用WatchKit App扩展目标成员资格。点击plist,然后:
  2. enter image description here

    1. 这是我用来读取plist的Swift代码,它有“id”和“name”字段。

      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
      }