2014-10-08 7 views
9

Widok aplikacji rozszerzenia akcji iOS 8 ma interfejs UIWebView. Kiedy otwieram to rozszerzenie działania w Safari, a następnie aplikacja rozszerzenia wyświetla UIWebView z mobilnego adresu URL Safari.UIWebView iOS 8 Awaria akcji rozszerzenia w iOS 8 mobilnego safari

Aplikacja rozszerzeń czasami się zawiesza podczas ładowania strony internetowej lub przewija ją w przypadku niektórych stron internetowych, takich jak nytimes.com.

Wiem, że użyteczna pamięć aplikacji rozszerzenia zależy od mobilnego Safari.

Ale stwierdziłem, że "Niesamowity zrzut ekranu dla Safari" nie ulega awarii. (https://itunes.apple.com/us/app/awesome-screenshot-for-safari/id918780145)

Zastanawiam się, jak zapobiec awarii aplikacji rozszerzenia akcji.

@interface ActionViewController() 

@property(strong,nonatomic) IBOutlet UIImageView *imageView; 
@property (strong, nonatomic) IBOutlet UIWebView *webView; 
@end 

@implementation ActionViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSExtensionItem *item = self.extensionContext.inputItems.firstObject; 
    NSItemProvider *itemProvider = item.attachments.firstObject; 

    if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeURL]) { 

     __weak typeof(self) weakSelf = self; 
     [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeURL options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) { 
      if (error) { 
       [weakSelf.extensionContext cancelRequestWithError:error]; 
       return; 
      } 

      if (![(NSObject *)item isKindOfClass:[NSURL class]]) { 
       NSError *unexpectedError = [NSError errorWithDomain:NSItemProviderErrorDomain 
                   code:NSItemProviderUnexpectedValueClassError 
                  userInfo:nil]; 
       [weakSelf.extensionContext cancelRequestWithError:unexpectedError]; 
       return; 
      } 

      NSURL *url = (NSURL *)item; 

      [weakSelf.webView loadRequest:[NSURLRequest requestWithURL:url]]; 
     }]; 
    } else { 
     NSError *unavailableError = [NSError errorWithDomain:NSItemProviderErrorDomain 
                 code:NSItemProviderItemUnavailableError 
                userInfo:nil]; 
     [self.extensionContext cancelRequestWithError:unavailableError]; 
    } 
} 
+0

czy masz jakiś dziennik błędów? – ytbryan

+0

Jest w porządku w trybie Simulator lub Debugowanie, ale czasami się zawiesza w trybie rzeczywistym. Nie mam żadnego kodu do rozszerzenia aplikacji, tuż nad kodami. – dobiho

+0

Mam DOKŁADNĄ SAMĄ SUPER ANNOYING problem i czekam na wieki, aby komentować w tym poście, dopóki nie otrzymam 50 punktów :). Czy masz jakieś rozwiązanie? W takim przypadku podejrzewam, że jest to limit alokacji dla JavaScript do 10 MB (patrz [tutaj] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebView_Class/index.html#// apple_ref/occ/instm/UIWebView/stringByEvaluatingJavaScriptFromString :)). Czy wiesz, czy witryny, na których następuje awaria, mają dodatkową aktywność JS? – Antenehs

Odpowiedz

1

byłem przeżywa ten sam problem, przy użyciu UIWebView w tle zeskrobać trochę treści do mojej aplikacji. To działało dobrze, gdy byłem podłączony do debuggera. Ale uruchamianie tej samej wersji bez debuggera zawsze się zawieszało.

Rozwiązałem problem przechodząc na WKWebView, co było całkiem łatwe. Domyślam się, że UIWebView jest po prostu zbyt stary i nieefektywny, by działał w rozszerzeniu wewnątrz Safari. Korzystanie z WKWebView działało idealnie.

Potem odkryłem awarię, gdy skończyłem używać widoku sieci i zapisałem moje dane. Zapisałem go w NSUserDefaults (przy użyciu mojego kontenera grupowego), aby przejść do głównej aplikacji. To też zawsze się zawieszało, więc usunąłem ten kod. Zamiast tego skorzystałem z CoreData, co też działa dobrze.

Teraz mam bezawaryjne rozszerzenie Safari! :)

+0

Miał ten sam problem, przejście na WKWebView naprawiło to. Dzięki! –