2015-06-07 74 views
3

我目前有問題。 我想要的行爲:如果我打開我的WatchKit應用程序,我稱之爲「openParentApplication」。我收到我想要的數據。 但是,如果我在真實設備上測試過,它不起作用,因爲我在iPhone中打開了父應用程序。 但是當我在模擬器中測試時,它無需打開父應用程序。WatchKit openParentApplication:回覆

我的Xcode版本是6.3.2和iOS 8.3。

可能是什麼問題?

InterfaceController.m

- (void)awakeWithContext:(id)context { 
    [super awakeWithContext:context]; 

    NSDictionary *userInfo = @{@"request":@"refreshData"}; 
    [WKInterfaceController openParentApplication:userInfo reply:^(NSDictionary *replyInfo, NSError *error) 
    { 
     entries = replyInfo; 
     NSLog(@"Reply: %@",replyInfo); 
     [self reloadTable]; 
     [self.city setText:[entries valueForKey:@"city"][0] ]; 
    }]; 

} 

AppDelegate.m

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply 
{ 
    NSString *refresh = [userInfo valueForKey:@"request"]; 
    if([refresh isEqualToString:@"refreshData"]) 
    { 
     NSString *city = [[NSUserDefaults standardUserDefaults] stringForKey:@"City"]; 
     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
     [manager GET:[NSString stringWithFormat:@"http://blackdriver.adappter.de/api/retrieve.php?city=%@",[city stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
     { 
      reply(responseObject); 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) 
     { 
      NSLog(@"Error: %@", error); 
     }]; 
    } 
} 

編輯 - 正確答案: 看到評論

+0

看到我的問題。 [鏈接](http://stackoverflow.com/questions/30703590/openparentapplication-only-works-when-the-app-is-running-in-the-foreground) –

+0

這就是它的夥計!謝謝 :)! – TdoubleG

回答

3

一個openParentApplication:reply請求必須立即返回從穆罕默德alwaili鏈接,所以你需要額外的時間請求你的asynchronous完成(交替運行一個synchronous要求,但這是可怕的做法)。

Apple WatchKit Developer Tips and Best Practices

如果你對蘋果關注的應用程序需要進行較長的後臺運行 任務,如網絡電話,你應該依靠你的iPhone應用程序做的工作。使用WKInterfaceController中的openParentApplication:reply:方法在後臺喚醒iPhone應用程序,並返回WatchKit擴展需要的數據。處理WatchKit請求的UIApplicationDelegate方法必須立即返回。 如果需要異步調用,例如執行聯網,請使用後臺任務來確保您的應用在發送其答覆之前未掛起。

2

我也有類似的問題,必須通過一些問題的工作有我WatchKit的應用程序成功地調用發出一個異步API調用iOS應用。

這裏有一個工作的代碼片斷

func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) { 
    let backgroundProcessingToken = application.beginBackgroundTaskWithName("backgroundApiCall", expirationHandler: {() -> Void in 
     reply(["response":["error":"SOME_ERROR_CODE_INDICATING_TIMEOUT"]]) 
    }) 

    request(.GET, "https://api.forecast.io/forecast/[INSERT DARK SKY API CODE]/37.8267,-122.423").responseJSON(options: NSJSONReadingOptions.AllowFragments, completionHandler:{request, response, data, error in 
     if(error != nil || data == nil){ 
      reply(["response":["error":"SOME_ERROR_CODE_INDICATING_FAILURE"]]) 
     } 

     if let json = data as? NSDictionary { 
      reply(["response":["data":json]]) 
     } 

     application.endBackgroundTask(backgroundProcessingToken) 
    }) 
} 

最後,你需要作爲後臺任務進行註冊,以確保您的應用程序不會被操作系統殺死。

我也有一個工作示例here上github FWIW