2017-03-17 2 views
3

Ich habe Probleme mit der Erstellung von Freigabeerweiterung wie Freigabeerweiterung der Pinterest App. Wenn der Benutzer nicht in der übergeordneten App angemeldet ist, enthält die Freigabeerweiterung nur eine Warnung mit der Option log in und cancel.iOS Share Extension Fluss

Wo in Code entscheiden, welche Ansicht Controller in meiner freigegebenen Erweiterung angezeigt werden soll. Ich sehe das so, als müsste ich den Autorisierungsstatus vom geteilten Container überprüfen und wenn dieser Status not logged ist, muss ich den Alarm-Controller präsentieren. Wenn der Status ist logged muss ich meine Haupt-View-Controller ShareViewController zeigen, die eine Unterklasse von SLComposeServiceViewController

Meine Frage ist nicht im Zusammenhang UI aber wo dieses Kontroll Code zu setzen. Ich habe keine Methode gefunden, bei der die App-Erweiterung gestartet wird. Daher kann ich basierend auf einem bestimmten Status einen ersten View-Controller für die Erweiterung auswählen.

In Pinterest-Erweiterung sehe ich nicht ihren Hauptansicht-Controller, wenn Benutzer von ihrer enthaltenen App ausgeloggt ist. Ich sehe nur Warnungen mit Optionen.

Zweite Frage: Wie programmatischer Wechsel von Freigabeerweiterung zu enthalten App. Wie funktioniert diese Pinterest-Freigabeerweiterung, wenn der Benutzer sich authentifizieren muss?

Ich arbeite an neueste iOS SDK 10.2

Antwort

1

Da ich kein Feedback für diese erhalten haben und ich es herausfinden, wie dies zu tun. Hier ist die Antwort.

Um zu steuern, welche Ansicht laden ich loadView Methode von UIViewController Lebenszyklus. Diese Methode wird ausgelöst, wenn die Anwendung zuerst die view-Eigenschaft von UIViewController abrufen muss. Also das ist faules Laden. Diese Methode wird auch ausgelöst, wenn der Benutzer loadViewIfNeeded() von UIViewController API aufruft. Im Körper dieser Methode müssen Sie sehr vorsichtig sein, view Eigenschaft nicht zu lesen, weil dies loadView wieder aufruft und Sie rekursive Schleife haben werden.

Meine Implementierung für diese Methode folgt. Ich muss sagen, ob der Benutzer angemeldet ist oder nicht, in der App enthalten und basierend darauf wählen Sie, welche Ansicht geladen werden soll.

override func loadView() { 
    // check in shared Keychain if user is authenticated 
    self.userAuthenticated = userService.isAuthenticated() 

    if self.userAuthenticated { 
     // load default view of the ShareViewController 
     super.loadView() 
    } else { 
     // if user is not logged in show only alert view controller with transparent dummy view 
     let view = UIView() 
     self.view = view 
    } 
} 

Und wenn der Benutzer angemeldet ist, nicht in I in

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    let context = self.extensionContext! 
    if !self.userAuthenticated { 
     let alert = UIAlertController(title: "Error", message: "User not logged in", preferredStyle: .alert) 
     let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in 
      context.completeRequest(returningItems: nil, completionHandler: nil) 
     } 
     let login = UIAlertAction(title: "Log In", style: .default, handler: { _ in 
      let url = URL(string: "fashionapp://login")! 
      // This is utility method written in Objective-C. 
      // I don't know yet if it passes Apple Review process or not. 
      // We will see ;) 
      self.open(url, options: [:], completionHandler: nil) 
      context.completeRequest(returningItems: nil, completionHandler: nil) 
     }) 

     alert.addAction(cancel) 
     alert.addAction(login) 
     present(alert, animated: true, completion: nil) 
    } 
} 

Alarm zeigen Und hier ist das Verfahren zum Öffnen von Aktien Erweiterung enthält App. Ich hoffe, es wird nützlich sein und Apple wird dies ohne Probleme überprüfen. Es ist in Objective-C geschrieben, da in Swift gibt es keine NSInvocation Klasse, so dass Sie nur Selektoren mit maximal zwei Argumente ausführen können.

#import <UIKit/UIKit.h> 

@interface UIViewController (OpenURL) 

- (void)openURL:(nonnull NSURL *)url 
     options:(nonnull NSDictionary<NSString *, id> *)options 
completionHandler:(void (^ __nullable)(BOOL success))completion; 

@end 

Und Implementierung.

#import "UIViewController+OpenURL.h" 

@implementation UIViewController (OpenURL) 


- (void)openURL:(nonnull NSURL *)url 
     options:(nonnull NSDictionary<NSString *, id> *)options 
completionHandler:(void (^ __nullable)(BOOL success))completion { 

    SEL selector = NSSelectorFromString(@"openURL:options:completionHandler:"); 

    UIResponder* responder = self; 
    while ((responder = [responder nextResponder]) != nil) { 
     if([responder respondsToSelector:selector] == true) { 
      NSMethodSignature *methodSignature = [responder methodSignatureForSelector:selector]; 
      NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; 

      [invocation setTarget: responder]; 
      [invocation setSelector: selector]; 
      [invocation setArgument: &url atIndex: 2]; 
      [invocation setArgument: &options atIndex:3]; 
      [invocation setArgument: &completion atIndex: 4]; 
      [invocation invoke]; 
      break; 
     } 
    } 
} 

@end 
+0

Können Sie bitte erklären, wie Sie diesen Code verwenden? Ich habe auf diesen Teilen Sachen gehangen und nicht im Web gefunden. –