2017-01-16 3 views
2

확장 프로그램을 사용하여 URL을 호스트 앱과 공유하고 싶습니다. urlShareManager는 앱과 확장 프로그램간에 통신하는 데 사용하는 임베디드 프레임 워크의 싱글 톤입니다. ViewController에서 urlShareManager를 호출하면 url을 추가 할 수 있습니다. 확장 프로그램과 함께 URL을 추가하면 작동하지 않습니다. 나는 줄 단위로 코드를 밟았으며 확장에서 하나를 추가 할 때 url을 저장하는 것으로 보인다. 그러나 내가로드 할 수있는 유일한 URL은 호스트 app viewcontroller로 저장된 URL입니다. 내가 여기서 무엇을 놓치고 있는지 잘 모르겠습니다.내선 번호가 공유 된 URL을 저장할 수 없습니다.

urlShareManager

+ (id)UrlShareManager 
    { 
     static UrlShare *urlShareManager = nil; 
     static dispatch_once_t onceToken; 

     dispatch_once(&onceToken, ^{ 
      urlShareManager = [[self alloc] init]; 
    //  urlShareManager.urlArray = [[NSMutableArray alloc]init]; 
     }); 

     return urlShareManager; 
    } 

    - (id)init 
    { 
     if (self = [super init]) 
     { 
      self.urlArray = [[NSMutableArray alloc]init]; 
      self.urlArray = [self loadURLS]; 
     } 

     return self; 

    } 


    - (NSString *)getFileURL 
    { 
     NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.net.noizystudios.urlGroup"]; 
     NSURL *jsonURL = [NSURL URLWithString:[containerURL.path stringByAppendingString:@"/urlData.dat"]]; 
     NSString *filePath = [jsonURL absoluteString]; 
     NSLog(@"Filepath: %@", filePath); 
     return filePath; 
    } 

    - (void)addURL:(NSString *)url 
    { 
     self.urlArray = [NSMutableArray new]; 
     NSLog(@"URL STRING: %@", url); 
     Bookmark *urlBookmark = [[Bookmark alloc]init]; 
     urlBookmark.urlString = url; 
     [self.urlArray addObject:urlBookmark]; 
     [self saveURLS]; 
    } 

    - (NSMutableArray *)loadURLS 
    { 
     NSString *path = [self getFileURL]; 
     NSMutableArray *url = [[NSMutableArray alloc]init]; 
     url = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
     NSLog(@"URL array inhoud: %@", url); 
     return url; 
    } 

    - (void)saveURLS 
    { 

     NSString *path = [self getFileURL]; 
     BOOL isSaved = [NSKeyedArchiver archiveRootObject:self.urlArray toFile:path]; 
     NSLog (isSaved ? @"saved" : @"not saved"); 

    } 



    @end 

의 ViewController

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


    UrlShare *urlManager = [UrlShare UrlShareManager]; 
    [urlManager addURL:@"http://www.reddit.com"]; 
    articleListArray = [urlManager loadURLS]; 
    [self.tableView reloadData]; 
} 

ActionRequestHandler

- (void)doneWithResults:(NSDictionary *)resultsForJavaScriptFinalize 
{ 
       ... 

        NSString *url = resultsForJavaScriptFinalize[@"URL"]; 
        UrlShare *urlManager = [UrlShare UrlShareManager]; 
        [urlManager addURL:url]; 


       ... 
       // Don't hold on to this after we finished with it. 
       self.extensionContext = nil; 
} 

답변

1

가 되세요 당신은 샌드 박스와 앱 전송 보안에 대해 읽었습니까? 또한 URL 북마크 데이터에?

기본적으로 보안상의 이유로 사용자는 열려는 파일과 URL을 지정해야하며 OS는 앱이 그 파일을 열 수 있어야한다는 것을 알고 있습니다. 한 앱이이 권한을 다른 앱에 전송하도록하려면 (확장 프로그램은 기본적으로 별도의 앱) 권한과 URL을 결합한 북마크 데이터를 전송해야합니다.

+0

App Transport Security와 관련이 없습니다. urlShareManager에 url, 실제로는 nsstring을 전달하는 것은 문제가 아닙니다. info.plist에서 임의로드 허용은 YES로 설정됩니다. 샌드 박스가 문제가되지 않도록 공유 컨테이너를 사용하고 있습니까? 나는 데이터를 전달할 수 있으며 저장할 수도있다. 나는 그것을 찾을 수없는 것 같습니다. – Vimy

+1

콘솔에 로그 메시지가 있습니까? – uliwitness

+0

알았어, 그 버그를 발견했다. 내 viewcontroller에서 url을 추가하지 않고 [urlManager saveURLS]를 호출했습니다. save 메소드를 호출했을 때 urlShareManager 싱글 톤의 self.array가 항상 비어 있었기 때문에 이전 urlData.dat 파일을 덮어 썼습니다. – Vimy