2017-03-17 128 views
3

我在創建共享擴展程序(如Pinterest應用程序的共享擴展程序)時遇到問題。當用戶未登錄到包含應用程序時,共享分機只會顯示警報,其選項爲log incanceliOS共享擴展程序流程

代碼的位置決定了哪個視圖控制器顯示在我的共享擴展中。我看到這就像我需要檢查共享容器的授權狀態,如果這個狀態是not logged我需要提出警報控制器。如果狀態爲logged我需要證明我的主視圖控制器ShareViewController這是SLComposeServiceViewController

我想問一個子類沒有UI相關的,但在那裏把這個校驗碼。我沒有找到任何應​​用程序擴展啓動的方法,所以我可以根據某些狀態選擇一些初始視圖控制器進行擴展。

在Pinterest擴展中,當用戶從其包含的應用程序註銷時,我看不到它們的主視圖控制器。我只看到選項提醒。

第二個問題:如何以編程方式從共享擴展切換到包含應用程序。當用戶需要認證時,這個Pinterest共享擴展是如何實現的?

我工作的最新的iOS SDK 10.2

回答

1

由於我沒有收到這方面的任何反饋,我弄清楚如何做到這一點。這是答案。

爲了控制我使用loadView方法從UIViewController生命週期中查看哪個視圖。當應用程序首先需要從UIViewController獲得view屬性時,會觸發此方法。所以這是懶加載。當用戶從UIViewController api調用loadViewIfNeeded()時,也會觸發此方法。在這個方法的主體中,你需要非常小心,不要讀取view屬性,因爲這將再次調用loadView,並且您將有遞歸循環。

我的這個方法的實現如下。我需要告訴用戶是否已登錄或未包含應用程序,並根據此選擇要加載的視圖。

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

如果用戶沒有登錄我

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) 
    } 
} 

顯示警告這裏是包含從份額擴展的應用程序打開的方法。我希望它會有用,Apple會在沒有任何問題的情況下對此進行審查。它寫在Objective-C中,因爲在Swift中沒有NSInvocation類,因此只能使用最多兩個參數執行選擇器。

#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 

並執行。

#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

你能解釋一下如何使用這段代碼嗎?我堅持這個共享的東西,並沒有幫助在網上找到。 –

相關問題