1

Apple が提案したように、 Handoff in Glance を使用します。Glance Interface で Web API を呼び出したいのですが、このために次のことを行いました

    - (void)awakeWithContext:(id)context
    {
        [super awakeWithContext:context];   
        [self CreateUaerActivity];   
    }
    -(void)CreateUaerActivity
    {
        NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"com.xxx.xxx.glance"];    
        activity.title = @"Glance";
        activity.delegate=self;
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kUserLoginWatchKit,kRequestTypeWatchKit, nil];
        activity.userInfo = dict;
        self.userActivity = activity;
        [self.userActivity becomeCurrent];
    }

- (void)willActivate
{

    [super willActivate];
    [NSTimer scheduledTimerWithTimeInterval:120 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
  }
-(void)doSomething
{

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kUserLoginWatchKit,kRequestTypeWatchKit, nil];
    [super updateUserActivity:@"com.xxx.xxx.glance" userInfo:dict webpageURL:nil];
 }
-(void)handleUserActivity:(NSDictionary *)userInfo
{
//displaying data    
}

およびAppDelegate.mファイルで -

    -(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler
    {
        NSLog(@"Handoff dictionary: %@", userActivity.userInfo);
         NSString *requestType = userActivity.userInfo[kRequestTypeWatchKit];
    if ([requestType  isEqual: kGlanceDataWatchKit])
    {
//calling web API to get Data
}
  return YES;
  }

AppDelegate がcontinueUserActivityメソッドを呼び出して Glance インターフェイスに何かを返すことはありませんでした。Glance インターフェイスを介して API を呼び出す方法を教えてください。

4

1 に答える 1

0

これがあなたが望むものかどうかはわかりませんが、Web Api を呼び出したい場合は、次のようにすることをお勧めします。

GlanceInterfaceController で:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

    [dictionary setObject:@"getSomething" forKey:@"action"];        
    [MainInterfaceController openParentApplication:dictionary reply:^(NSDictionary *replyInfo, NSError *error) {
        NSLog(@"Reply received by Watch app: %@", replyInfo); // the reply from the appDelegate... 
         }

親のアプリ Delegate で:

  - (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply
{
       NSLog(@"Request received by iOS app");
if( [userInfo objectForKey:@"action"] isEqualToString:@"getSomething"] ){
//call you're Web API
//send the reponse to you're glance :              

reply(DictResponse);// some Dictionary from your web API... 

}

*****編集*****

同じ問題が発生しました。簡単な修正の 1 つは、バックグラウンド タスクを開始することです

方法は次のとおりです。

    - (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply
{
    // Temporary fix, I hope.
    // --------------------
    __block UIBackgroundTaskIdentifier bogusWorkaroundTask;
    bogusWorkaroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:bogusWorkaroundTask];
    }];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [[UIApplication sharedApplication] endBackgroundTask:bogusWorkaroundTask];
    });
    // --------------------

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

        // Kick off a network request, heavy processing work, etc.

        // Return any data you need to, obviously.
        reply(nil);
        [[UIApplication sharedApplication] endBackgroundTask:realBackgroundTask];
}

実際、iOSはデータを取得する前に親のアプリを強制終了します...これは(あまりクリーンなソリューションではありません)アプリが強制終了されるのを防ぎます...そして情報を取得する時間を与えます...

*****編集終了*****

于 2015-05-19T13:31:57.940 に答える