2015年06月16日

Apple Watch対応のアプリを作ってみました

iOS担当の田中です。
Apple Watchが発売され結構な日が経ちましたが、開発するにあたりどんな感じか確かめるために簡単なアプリを開発してみました。

機能


・地図の表示
・コメント入力
・情報保存

Apple Watch側はこの3機能のみです。
iPhone側は保存データをリストに表示したり編集したりと実装してみましたが、今回はApple Watch側の部分にのみ触れていきたいと思います。

動作


地図表示


アプリ起動時は現在地を表示しています。

map1.png

地図を表示するまでのコードはこんな感じになっています。
#import <CoreLocation/CoreLocation.h>

@interface InterfaceController()
<
  CLLocationManagerDelegate
>

@property (weak, nonatomic) IBOutlet WKInterfaceMap *map;
@property (nonatomic) CLLocationCoordinate2D coordinate;
@property (nonatomic) CLLocationManager *locationManager;

@end

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];
    
    self.locationManager = [CLLocationManager new];
    self.locationManager.delegate = self;

    [self.locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *nowLocation = locations.lastObject;
    double lat = nowLocation.coordinate.latitude;
    double lng = nowLocation.coordinate.longitude;
    
    MKCoordinateSpan currentSpan = MKCoordinateSpanMake(0.01f, 0.01f);
    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(lat, lng);
    MKCoordinateRegion region = MKCoordinateRegionMake(coordinate, currentSpan);
    
    self.coordinate = coordinate;
    
    MKMapPoint newCenterPoint = MKMapPointForCoordinate(coordinate);
    [self.map setVisibleMapRect:MKMapRectMake(newCenterPoint.x, newCenterPoint.y, currentSpan.latitudeDelta, currentSpan.longitudeDelta)];
    [self.map setRegion:region];

    [self.map addAnnotation:coordinate
               withPinColor:WKInterfaceMapPinColorPurple];
}

iPhone側で位置情報取得の許可を取っていない場合は位置情報が取得できないため、先に確認処理を行う必要があります。

文字入力


位置情報の保存に合わせてコメントを残せるようにしました。
Apple Watchではキーボードが使えないため、自前で作成するか絵文字か音声で文字を入力することになります。

map2.png map3.png

絵文字や音声入力のviewの表示は以下のコードで使用することができます。

[self presentTextInputControllerWithSuggestions:nil
                               allowedInputMode:WKTextInputModeAllowAnimatedEmoji
                                     completion:
 ^(NSArray *results) {
    if (results.count) {
        id result = results.firstObject;
    }
 }];
 

入力後はresultsの中に入力結果が入っていますので取得後適切な形で処理をします。

保存


最後に取得したデータをiPhone側に保存します。

[WKInterfaceController openParentApplication:dict
                                       reply:
 ^(NSDictionary *replyInfo, NSError *error) {
 }];

このメソッドを使用することによりiPhone側にデータが送られます。
dictの部分に保存したいデータをDictionaryにしています。

あとはiPhone側のAppDelegateに以下のメソッドを追加しデータを取得し保存処理を行います。

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

以上の流れになります。

今の仕様だと大分iPhone側の処理に依存してしまい制限が大きいですが、Watch OS 2.0からネイティブの開発が可能になるはずなので自由度は大きく広がりそうです。
posted by Seesaa京都スタッフ at 18:02| Comment(0) | iOS | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: