2015-03-30 51 views
6

使用WatchKit,您的應用程序可以在手機上運行,​​而手錶應用程序以擴展模式運行。iOS WatchKit - 如何確定您的代碼是在手錶擴展模塊還是應用程序中運行

如果您創建的庫包含用於手機應用程序和手錶擴展中的通用代碼,是否有方法可以確定代碼是在手機應用程序還是手錶擴展中運行?

I.e.

if ([self isRunningInWatchExtension]) { 
    NSLog(@"this is running on watch"); 
} else { 
    NSLog(@"this is running on phone app"); 
} 


- (BOOL)isRunningInWatchExtension { 
    ??? 
} 

回答

4

我已經通過檢查包標識符來實現這一點:

if ([[[NSBundle mainBundle] bundleIdentifier] isEqualToString:kAppBundleIdentifier]) { 

    // Running in main app 
} 
else if ([[[NSBundle mainBundle] bundleIdentifier] isEqualToString:kWatchBundleIdentifier]) { 

    // Running in extension 
} 
+0

這適用於所問的問題。我沒有正確地說出正確的問題來滿足我的需求。在我的情況下,我正在開發一個可供其他應用程序使用的庫,可用於手錶擴展和主應用程序。我不能依賴包標識符,因爲開發者可以根據需要命名它們。 – 2015-03-31 22:01:47

+0

也許是檢查一個獨特的類是否存在的東西?像'BOOL isExtension =(NSClassFromString(@「WKInterfaceDevice」)!= nil);' – 2015-04-01 04:39:25

0
  • 如果要調用在共同的框架類的任何自定義方法這可能是容易的。您只需要爲方法添加其他方法參數。如果您從iOS應用程序或Watchkit應用程序調用此方法,則將相應的鍵值對添加到字典中以獲取參數。並在你的框架方法中比較這一點。

  • 從init或任何其他方法確定這點,你仍然可以通過這個代碼就知道了,

    NSLog(@"%@",[NSThread callStackSymbols]); 
    

所以,你需要分析這個字符串,並獲得相應的目標名稱。如果它被iOS應用程序調用,那麼您將獲得'UIKit'字符串,並且從手錶套件應用程序擴展中,您將獲得'YourApp WatchKit Extension'字符串。您也可以參考這個蘇答案解析這個字符串和比較它 - https://stackoverflow.com/a/9603733/602997

8

在目標條件語句有一些條件語句,可以幫助你,

#if TARGET_OS_WATCH 
//do something for watch 
#else 
//do something for ios ==> assuming you only support two platforms 
#endif 
相關問題