2014-12-30 2 views
12

Я знаю, что расширение api в комплекте с часами может открыть приложение-хост в фоновом режиме, но не на переднем плане.Запуск приложения-хозяина из приложения-приложения

Я также попытался с помощью openUrl() апи из NSExtensionContext, как показано ниже:

NSExtensionContext *ctx = [[NSExtensionContext alloc] init]; 

NSURL *url = [NSURL URLWithString:@"myScheme://today"]; 
[ctx openURL:url completionHandler:^(BOOL success) { 
    NSLog(@"fun=%s after completion. success=%d", __func__, success); 
}]; 
[ctx completeRequestReturningItems:ctx.inputItems completionHandler:nil]; 

Здесь тоже хост приложение не запускается. Я что-то упускаю? или невозможно, чтобы запустил приложение-хост из расширения набора часов?

ответ

9

Если вам нужно открыть родительское приложение на переднем плане, используйте Handoff!

https://developer.apple.com/handoff/

Пример:

Где-то общие для обоих:

static let sharedUserActivityType = "com.yourcompany.yourapp.youraction" 
static let sharedIdentifierKey = "identifier" 

на часы:

updateUserActivity(sharedUserActivityType, userInfo: [sharedIdentifierKey : 123456], webpageURL: nil) 

на вашем iPhone в App Делегат:

func application(application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool { 
    if (userActivityType == sharedUserActivityType) { 
     return true 
    } 
    return false 
} 

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]!) -> Void) -> Bool { 
    if (userActivity.activityType == sharedUserActivityType) { 
     if let userInfo = userActivity.userInfo as? [String : AnyObject] { 
      if let identifier = userInfo[sharedIdentifierKey] as? Int { 
       //Do something 
       let alert = UIAlertView(title: "Handoff", message: "Handoff has been triggered for identifier \(identifier)" , delegate: nil, cancelButtonTitle: "Thanks for the info!") 
       alert.show() 
       return true 
      } 
     } 
    } 
    return false 
} 

И, наконец, (этот шаг важен !!!): В вашем Info.plist (ы)

enter image description here

+0

Вы читали документацию и смотрели видео? – stk

+0

Этот код показывает предупреждение, о котором вы упоминали ??? –

+0

Должно быть, да. Разве это не работает для вас? – stk

21

Начиная с Beta 3 iOS 8.2 в настоящее время невозможно открыть приложение iOS на переднем плане. Как вы сказали openParentApplication можете открыть приложение в фоновом режиме. К сожалению, API для открытия приложения на iPhone отсутствует.

Несколько сообщений о компании Apple Dev Форум отметил, что это не возможно

https://devforums.apple.com/message/1076125#1076125

Правильно, уведомление может еще объявить фоновое действие, которое iPhone приложение будет обрабатывать, так что в этом смысле он может начать приложение для iPhone. Но приложение iPhone не может быть представлено на переднем плане приложением WatchKit.

И другой пост

https://devforums.apple.com/message/1082620#1082620

На устройстве, он [Смотреть приложение] не будет - привести свое приложение IOS на передний план.

+2

Спасибо за память Меня Форум разработчиков Apple. Это было давно забытое место. Вы заслуживаете 50 повторений. –

+1

Можно ли обнаружить, что хост/главное приложение уже открыто и на переднем плане? –

12

Я надеюсь, что компания Apple предоставит API для запуска родительского приложения из часов приложения в будущем беты, но сейчас мне удалось добиться этого, выполнив следующие действия ...

Вызов openParentApplication:reply: как обычно:

- (void)openPhoneApp { 
    [WKInterfaceController openParentApplication:[NSDictionary new] reply:nil]; 
} 

application:handleWatchKitExtensionRequest:reply: Реализовать в вашем AppDelegate, и запуск с помощью пользовательской схемы URL:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply { 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myappscheme://open"]]; 
} 
+0

Отличное предложение. Я пробовал один и тот же код из расширений, но там не поддерживался. Будет ли одобрено приложение? Является ли это законным? –

+0

Я не уверен, одобрит ли Apple это. Я не понимаю, почему не потому, что, насколько я могу судить, это не нарушает никаких правил. В любом случае, это временное решение, я надеюсь, что Apple предоставит официальный способ сделать это в будущей бета-версии. – JTaylor

+8

Хотя этот подход действительно запускает родительское приложение iOS на переднем плане в симуляторе, я дважды проверял с Apple, что эта функция не будет разрешена в App Store. Этот ответ неверен и не должен использоваться. @Ivp имеет правильный ответ здесь. – cnoon

Смежные вопросы