2017-01-16 56 views
2

我想使用擴展程序與主機應用程序共享網址。 urlShareManager是我用於在應用程序和擴展之間進行通信的嵌入式框架中的單例。當我在Viewcontroller中調用urlShareManager時,我可以添加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 

視圖控制器

- (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

有您瞭解了沙箱和App Transport Security?還有關於URL書籤數據?

基本上,出於安全原因,用戶必須指定要打開的文件和URL,並且操作系統知道您的應用程序應該可以打開它們。如果您希望一個應用程序將此權限轉移到其他應用程序(並且擴展程序基本上是單獨的應用程序),則必須傳輸書籤數據,該數據結合了權限和URL。

+0

我沒有看到App Transport Security與此有關。將url,實際上只是一個nsstring傳遞給urlShareManager不是問題。允許任意負載在info.plist中設置爲YES。 我正在使用共享容器,所以沙盒不應該是一個問題?我可以傳遞數據,我甚至可以保存它。我似乎無法檢索它。 – Vimy

+1

你在控制檯上得到任何日誌消息嗎? – uliwitness

+0

好的,我發現了這個錯誤。在我的視圖控制器中,我調用了[urlManager saveURLS],但沒有添加url。因爲當我調用save方法時,urlShareManager單例的self.array總是空的,它覆蓋了之前的urlData.dat文件。 – Vimy