2015-05-21 14 views
6

Tôi đang cố gắng khởi chạy ứng dụng ios gốc từ ứng dụng watchkit. Tôi đang sử dụng lược đồ url để khởi chạy ứng dụng.Nhưng có vẻ nhưhandleWatchKitExtensionRequest không được gọi là

chưa bao giờ được gọi. Có vẻ như ứng dụng đồng hồ không khởi chạy ứng dụng trong backgound. Nhưng ứng dụng gốc không xử lý yêu cầu của bộ theo dõi. Tôi đã thử cách tiếp cận của mình trong một dự án mới và nó hoạt động hoàn hảo. Có điều gì tôi cần chú ý không?

Tôi đã cố gắng gỡ lỗi> Đính kèm vào quá trình> myapp và đặt điểm ngắt bên trong handleWatchKitExtensionRequest để xác nhận xem nó có được gọi hay không và nó không được gọi.

Đây là tiến trình, tôi gọi openParentApplication khi một nút được nhấp vào trong ứng dụng đồng hồ.

@IBAction func viewOniPhoneAction() { 


    let userInfo: [NSObject : AnyObject] = [ 
     "userID" : user.userID 
    ] 


    WKInterfaceController.openParentApplication(userInfo, reply: { (userInfo : [NSObject : AnyObject]!, error : NSError!) -> Void in 

    }) 

} 

Đây là ứng dụng của tôi delegeate

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply 
{ 
NSDictionary *replyDict = @{@"response": @"done"}; 
reply(replyDict); 
} 

tôi đã cố gắng reply() trong handleWatchKitExtensionRequest nhưng tôi đã nhận lỗi này trong khối trả lời từ ứng dụng đồng hồ

Error Error Domain=com.apple.watchkit.errors Code=2 "The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]" UserInfo=0x60800026e0c0 {NSLocalizedDescription=The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]} 
+0

Nope, tôi đã cố gắng mà một. Tôi tin rằng vấn đề là để bắt đầu một nhiệm vụ nền trong handleWatchKitExtensionRequest, phương pháp phải được gọi. Vì vậy, mã bên trong phương thức có thể được thực hiện. Có vẻ như phương pháp này thậm chí còn không được gọi. – cloudy45man

+0

Bạn đã thử cái này chưa? http://stackoverflow.com/questions/28112445/handlewatchkitextensionrequest-not-responding-to-openparentapplication-in-watchk – vomako

+0

Có, nó không hoạt động. Có bất kỳ cài đặt nào tôi có thể kiểm tra xem ứng dụng chính và ứng dụng xem có được liên kết chính xác hay không. – cloudy45man

Trả lời

0

handleWatchKitRequest không được gọi khi bạn mở ứng dụng thông qua lược đồ URL. Nó chỉ được gọi để đáp lại các yêu cầu được thực hiện trong phần mở rộng WatchKit được thực hiện bằng cách sử dụng openParentApplication:reply:. Đó là lý do tại sao bạn không nhìn thấy nó đang được thực hiện.

+0

Xin lỗi vì nhầm lẫn, tôi sử dụng cả hai phương pháp để đạt được những gì tôi muốn. Tôi sử dụng ứng dụng mở WKInterfaceController bên trong ứng dụng đồng hồ và sử dụng sau để khởi chạy ứng dụng. - (void) ứng dụng: (UIApplication *) ứng dụng handleWatchKitExtensionRequest: (NSDictionary *) UserInfo trả lời: (void (^) (NSDictionary *)) trả lời { [[UIApplication sharedApplication] openURL: [NSURL URLWithString: @" HandlingWatchKitTest: // "]]; } – cloudy45man

0

Bạn cần phải trả lời câu trả lời của mình trong tác vụ nền để đảm bảo ứng dụng gốc của bạn có thời gian trả lời.

-

(void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *replyInfo))reply{ 

    UIApplication *app = [UIApplication sharedApplication]; 

    UIBackgroundTaskIdentifier bgTask __block = [app beginBackgroundTaskWithName:@"watchAppRequest" expirationHandler:^{ 

     [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 

    }]; 

//make your calls here to your tasks, when finished, send the reply then terminate the background task 

//send reply back to watch 
reply(replyInfo); 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask=UIBackgroundTaskInvalid; 
    }); 
} 
+0

Tôi đã thử mã của bạn nhưng chưa hoạt động. – cloudy45man

2

tôi đã nhận nó làm việc !!! Có cùng một vấn đề ....

Chỉ cần tăng phần bắt đầuBackgroundTaskWithExpirationHandler có thời gian lớn hơn nếu bạn vẫn không nhận được dữ liệu !!! Tôi đã sử dụng 2 giây trước đây nhưng mạng của tôi quá yếu !!!

tôi gọi openParentApplication khi một nút được nhấp vào ứng dụng đồng hồ:

[WKInterfaceController openParentApplication:loadDetailChatDataDictionary reply:^(NSDictionary *replyInfo, NSError *error) { 

Đây là đại biểu ứng dụng của tôi:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply { 

    __block UIBackgroundTaskIdentifier bogusWorkaroundTask; 
    bogusWorkaroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:bogusWorkaroundTask]; 
    }]; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // increase the time to a larger value if you still don't get the data!!! I used 2 secs previously but my network is too weak!!! 
     [[UIApplication sharedApplication] endBackgroundTask:bogusWorkaroundTask]; 
    }); 
    // -------------------- 

    __block UIBackgroundTaskIdentifier realBackgroundTask; 
    realBackgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     reply(nil); 
     [[UIApplication sharedApplication] endBackgroundTask:realBackgroundTask]; 
    }]; 

    NSString *value = userInfo[@"key"]; 
    if ([value isEqualToString:@"loadRecentChatData"]) { 
       reply(@{@"recents":recents}); // Add your reply here 
    } 
+0

Bạn có thể giải thích tại sao bạn cần bogusWorkaroundTask này không? Không rõ ràng cho tôi lý do tại sao bạn dường như tăng thời gian trên nó, và không phải trên realBackgorundTask ... – blackbox

+1

@blackbox nhiệm vụ workaround không có thật là có workaround một vấn đề ở đây đôi khi Apple đã giết chết các ứng dụng ngay cả khi bạn đã bắt đầu một nhiệm vụ nền. Đối với một số lý do, bắt đầu một nhiệm vụ không có thật ngay lập tức và giết nó sau một vài giây hoạt động để cho phép mã xử lý thực sự thiết lập nhiệm vụ nền của riêng mình trước khi bị cắt sớm. Giải pháp này làm việc cho tôi là tốt, tuy nhiên tôi thấy rằng 'ứng dụng: handleWatchKitExtensionRequest: trả lời:' ngừng được gọi sau khi một số yêu cầu được thực hiện và thiết bị bị khóa. –

Các vấn đề liên quan