Git Product home page Git Product logo

andante's People

Contributors

e-mon avatar warusun avatar xynophon avatar yubessy avatar

Watchers

 avatar  avatar  avatar

andante's Issues

Unidentified bugs of background rec/play

バックグラウンドでのRec/Playが上手くいかない場合

概要

バックグラウンドでのRec/Playが上手くいかない場合がある。
今のところRec/Playどちらの問題なのかわからないためまず原因を特定する必要がある。

対応

フロント側

  • CoreDataに格納しているPlayRouteをMap上に表示する
    • RecができてないのかPlayができてないのかがわかるはず

バックグラウンド側

  • 詳細なデバッグメッセージを出す
    • 実機をMacにつながずにテストしてる時のデバッグメッセージってどうやって確認するのかな?
  • Accuracyを最高にしてみる
  • 範囲を1辺20m->40mに拡大してみる

Fix bug : do not record while player is "pose"

ポーズ状態で録音機能を使用した際に曲が登録される問題の修正を行います.

source

'Andante/BackgroundRecController.swift'

ついでに,曲があまりに近い場合にも登録しないようにしたほうがいいのかな?と思うんですけど,どうしましょう.

Refactoring LV.1 & 2

#30 で列挙したうち、Lv.1 と Lv. 2 に該当する修正

Lv.1 数行の修正で済むもの

  • 空白の挿入・削除
  • 空行の挿入・削除
  • インデントの修正
  • 型宣言の追加・削除
  • アクセス修飾子の追加
  • var -> let

Lv.2 単一クラスの修正で済むもの

  • private/localな変数/メソッドの名称変更
  • private/localな変数/メソッドの型変更(特にOptionalのimplicit/explicit)
  • ローカル変数のインスタンス変数化
  • 不要なデバッグ用メソッドの削除

Source Code Refactoring

ソースコードの改善

概要

最低限の実装がもうすぐできそうなので、そろそろコードを整理していった方が良さそう。

参考: http://qiita.com/susieyy/items/f71435cc962e70d81b37

詳細

修正の難易度に応じて5つのレベルに分けてみた。

Lv.1 数行の修正で済むもの

  • 空白の挿入・削除
  • 空行の挿入・削除
  • インデントの修正
  • 型宣言の追加・削除
  • アクセス修飾子の追加
  • var -> let

Lv.2 単一クラスの修正で済むもの

  • private/localな変数/メソッドの名称変更
  • private/localな変数/メソッドの型変更(特にOptionalのimplicit/explicit)
  • ローカル変数のインスタンス変数化
  • 不要なデバッグ用メソッドの削除

Lv.3 複数クラスの修正が必要だが、単一クラスの修正が主なもの

  • internal/publicな変数/メソッドの名称変更
  • internal/publicな変数/メソッドの型変更(特にOptionalのimplicit/explicit)

Lv.4 複数クラスの大幅な修正が必要なもの

  • デバッグメッセージ表示用関数を作成

余談

基本機能ができればバージョン番号を付与したほうが良さそう?
git tag やXcodeの機能で何ができるか調べる。

Implement DataStore

CoreDataを用いたDataStoreの実装

概要

CLRegion オブジェクトとそれに付帯するSong,Artist文字列などを永続化するためにCoreDataにて実装する。

参照:http://d.hatena.ne.jp/glass-_-onion/20111015/1318667971

1.DataStore Schema

PlayRoute(Region : CLRegion, ArtistName : String, SongName : String, UserName : String, timestamp: Date)

今後Publicなデータを用いることを考えて、usernameをつけることにした。

2.Classes

  • PlayRouteManager

CoreDataを介してget,setなどを行う管理クラス

  • PrayRoute Class : MSManagedObject

MSManagedObjectを継承したEntityの実装クラス

3.使用方法

let prm = PlayRouteManager()

let clc1 = CLLocationCoordinate2D(latitude: 10, longitude: 10)
let clc2 = CLLocationCoordinate2D(latitude: 150, longitude: 150)
let region1 : CLRegion = CLCircularRegion(center: clc1, radius: 20.0, identifier: "test1")
let region2 : CLRegion = CLCircularRegion(center: clc2, radius: 20.0, identifier: "test1")

prm.setRegion(region1, songName: "testSong1", artistName: "artist1", userName: "user1")
prm.setRegion(region2, songName: "testSong2", artistName: "artist2", userName: "user2")
for pr in prm{
       println(pr.songName) // -> testSong2
}

4.注意事項

今現在は必要最小限と思われる regin からのsong,artist取得と、各種データのset関数しか用意していないです。メソッド名や任意のfetchが行いたい等の場合はまた別のissueで行います。

Implement get/set function in PlayRouteManagerClass & Modify datastore entity

Description

  • Play,Rec,本体Appでの曲情報表示などのためにCoreDataへのget/setが行えるメソッドの実装
  • それに伴うCoreDataのEntity修正

1.CoreData EntityへのAttribute追加

  • 曲情報のためにDataStoreのエンティティにMediaPlayerのオブジェクトを追加
  • 曲情報は上記で管理するため,songName,artistNameの削除
  • MapKitでの表示の為にCenter位置(Lat,Lng),Regionのradius用オブジェクトを追加

2.メソッドをPlayRouteManagerに追加

  • getAllRegions() -> [CLRegion]?
  • getPlayRoute(lat, lng, radius) -> [PlayRoute]?
  • getPlayRoutes() -> [PlayRoute]?
  • getMediaPlayItem(region) -> MPMediaItem?
  • setPlayRoute(CLRegion, MPMediaItem, lat, lng, radius)

Implement PlayRoute delete function

Description

  • 一度登録したPlayRoute の削除機能の実装
  • 削除は地図上Artworkをタップした際に表示される吹き出し(callout)内にボタンを実装することで実現する

sources

Andante/ViewController.swift
Andante/PlayRouteManager.swift

RECで追加されたPlay routeがリアルタイムに本体で表示出来ない

標記の通りです.現在仕様だと,CoreDataに追加されたタイミングでの表示が行えないので
修正が必要になります.以下のその方法を個人的に検討した結果を書いておきます.

  • Background Rec Controller にVCからデリゲートさせるようにして対応
  • CoreData追加タイミングでNotificationを発生させる

Implement BackgroundPlayController class

BackgroundPlayControllerクラスの実装

概要

Play モードの挙動を担うクラス。
下記のBGPlayControllerにあたる。
https://files.slack.com/files-pri/T02MLD2G1-F02R0JZ8S/slack_for_ios_upload.jpg

大文字プレフィクスはフレームワークを示すという通則があるみたいなので、名前を変えた。
https://developer.apple.com/jp/devcenter/ios/library/documentation/CodingGuidelines.pdf

ファイルパス

AndanteWidget/BackgroundPlayController.swift
Andante/BackgroundPlayController.swift (バックグラウンド処理をAndante本体に任せるため変更)

詳細

https://files.slack.com/files-pri/T02MLD2G1-F02R0JVK6/slack_for_ios_upload.jpg

  • Record/Play/Offモードの切り替えは ViewController が担う
  • ViewControllerBackgroundPlayController のインスタンスを持つ
  • Playモードに切り替わると、ViewControllerBackgroundPlayController を有効化するメソッドを呼ぶ
  • 有効化されるとCoreDataから登録済みのRegionを読み込み、各Regionに対して startMonitoringForRegion() する
  • locationManager(_:didEnterRegion:) でRegionに入ったことを検知したら、Regionに対応付けられている曲を取得して systemMusicPlayer にキュー出し

Improve getMediaItem method for range query

概要

issue #7 で修正したgetMediaItem method のオーバーロードメソッドを追加し,パラメータによって
範囲クエリを扱えるように修正します.

実装内容(予定)

getMediaItem(center : CLLocationCoodinate2D) -> MediaItem?

  • centerを中心とした一辺20m四方の空間内にRegionが存在する場合にそのPlayrouteのMediaItemを返します.
  • 複数のRegionが存在する場合は,配列に格納されている先頭の要素について返します.�

Implement mode toggling

モード切り替えの実装

概要

AndanteWidgetでモードが切り替えられるごとに、BackgroundPlayControllerやBackgroundRecControllerをON/OFFする

実装すべき内容

TodayViewController.swift (+ MainInterface.storyboad)

担当: wsaito

  • StoryboadからSegmentedControlのOutletを引っ張ってくる
  • modeChangedみたいなメソッドを作って
    • Play -> BackgroundPlayControllerをON, BackgroundRecControllerをOFF
    • Rec -> BackgroundRecControllerをON, BackgroundPlayControllerをOFF
    • Off -> 両方OFF

BackgroundPlayController

担当: yubessy

  • ON, OFF用メソッドをそれぞれ作成
    • ON -> 登録済みRegionに対するモニタリングを開始、Regionに入れば対応する曲を再生
    • OFF -> モニタリングを停止

BackgroundRecController

担当: xynophon

  • ON, OFF用メソッドをそれぞれ作成
    • ON -> 位置情報の検知を開始、位置情報が変化したときに曲が前と変わっていれば位置情報と曲を記録
    • OFF -> 位置情報の検知を停止

Implement BackgroundPlayController class (using location updating)

BackgroundPlayControllerクラスの実装(location updatingによる)

概要

Play モードの挙動を担うクラス。
当初 #1 の通りregion monitoringを使用して実装するつもりだったが、期待すべき仕様
をみたさないのでlocation updatingで作りなおす。

ファイルパス

Andante/BackgroundPlayController.swift

詳細

  • Record/Play/Offモードの切り替えは ViewController が担う
  • ViewControllerBackgroundPlayController のインスタンスを持つ
  • Playモードに切り替わると、ViewControllerBackgroundPlayController を有効化するメソッドを呼ぶ
  • 有効化されると locationManager.startUpdatingLocation() する
  • locationManager(_:didUpdateLocations:) が発火し、かつ次の全ての条件を満たした場合、対応する曲を systemMusicPlayer にキュー出し
    • 最期に居た位置から一定以上離れている
    • 他の曲を再生中でない
    • 新しい位置に対応付けられている曲が存在する

Implement controlling Andante main app from AndanteWidget

Implement function that let TodayViewController in AndanteWidget control BackgroundRecController in Andante main app.
Let BackgroundRecController save song and location information when AndanteWidget in TodayViewController is selected 'Rec' using NSUserDefaults.

Artwork Improvement

アートワーク改善

概要

  1. アートワークサイズを32に固定
  2. アートワークのデザインを角丸に設定

詳細

ViewController.swift内のfunc mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!)で修正。

また、Toucan.swiftファイルを追加。

Bring user location to front on all music annotation

ユーザーの現在位置表示が楽曲アノテーションに隠れてしまうのを修正.
バグというよりは機能向上かな,と思うので,enhancementに設定しました.

source

Andante/ViewController.swift

Show music information on MapView

マップ上に曲情報を表示

概要

  1. 現在地情報を取得する
  2. 地図の中心に現在地を表示する
  3. 地図の中心の緯度経度を取得する
  4. アノテーションの表示

ファイルパス

Andante/ViewController.swift

詳細

func mapView(mapView: MKMapView!, regionDidChangeAnimated animated: Bool) の中で実装。

Project settings

プロジェクトの諸々の設定

  • Andante, AndanteWidgetのInfo.plistに次のキーを追加
    • NSLocationAlwaysUsageDescription
  • Andante, AndanteWidgetに次のフレームワークを追加
    • CoreData.framework
    • CoreLocation.framework
    • MediaPlayer.framework
  • AndanteのCapabilitiesでBackgroundModesを有効化

Implement new BackgroundRecController class

BackgroundRecController.swiftをAndanteに移動。
BackgroundRecController.swift
位置情報と再生中の音楽情報を取って音楽が変更されていればDBに保存。

Change General Settings

プロジェクトの設定変更

  • 画面の向きをPortraitに限定 (Device Orientation)
  • Andante Widgetを一旦本体に含めないようにする (Embedded Binaries)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.