Xcode
AppleScript
GPS
Swift
PokemonGo

iPhoneの実機で位置情報をシミュレーションする方法

More than 1 year has passed since last update.

ポケモンGOで位置情報偽装で不正アカウントがBANされ始めていますが、BANされる方法をご紹介します。
これから、ポケモンGOみたいな位置情報アプリを作れと言われたときに使える便利なデバッグ方法です。

iPhoneのGPSの位置情報はXcodeのSimulate Locationを使うとを偽装できます。
iOSの位置情報は端末内のすべてのアプリで共通になるため、他のiOSアプリにも影響を起こすことができます。

位置情報をシミュレーションする方法

1.Xcodeで新規プロジェクトを作る

中身は空で良いのでSingle View Applicationを選択してプロジェクトを作成します。
スクリーンショット 2016-08-21 2.58.58.png

2.AppDelegate.swiftにバックグランドでも処理を継続するよう書き加える

iOSの位置情報はアプリ内で共通ですが、Simulate Locationはアプリがサスペンドされると機能しなくなります。
そのためアプリにバックグランド継続処理を加えます。

AppDelegate.swift
import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    var backgroundTaskID : UIBackgroundTaskIdentifier = 0

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        return true
    }

    func applicationWillResignActive(application: UIApplication) {
        self.backgroundTaskID = application.beginBackgroundTaskWithExpirationHandler(){
            [weak self] in
            application.endBackgroundTask((self?.backgroundTaskID)!)
            self?.backgroundTaskID = UIBackgroundTaskInvalid
        }
    }
}

backgroundTaskIDとapplicationWillResignActiveメソッドを追記しています。それ以外の部分はそのままでOK

3.実機でこのアプリを実行する

実機のiPhoneを選択して、アプリを実行します。
スクリーンショット 2016-08-21 4.37.52.png

4.Simulate Locationを使用する

アプリを実行中にDebug > Simulate Locationで移動先の都市を選択することができます。
試しにロンドンを選択してみます。
スクリーンショット 2016-08-21 4.44.06.png

この状態でマップを開いてみるとロンドンにいることが確認できます。
IMG_2106.PNG

5.任意の位置情報に偽装する方法

任意の位置情報に変更するにはGPXファイルというものを作成します。
XML形式のファイルで緯度経度の情報を記述するだけのファイルです。

MyLocation.gpx
<?xml version="1.0"?>
<gpx version="1.1">
    <wpt lat="35.6575811" lon="139.7009455" />
</gpx>

このファイルには渋谷駅を指定しました。

そしてDebug > Simulate Location > Add GPX File to Projectからファイルを読み込むと、
2番目に新しく追加された項目増えているので選択します。

スクリーンショット 2016-08-21 5.18.19.png

確認すると、先ほどGPXファイルで指定した渋谷駅に位置情報が書き換わっています。

IMG_2108.PNG

位置情報を徐々に動かしていく方法

読み込ませているGPXファイルの内容を変更してもXcodeからSimulate Locationをクリックしないと、iPhone側の位置情報は書き換わりません。

そのためAppleScriptでXcodeのUIを操作します。

1.スクリプトエディタの補助アクセスを許可する

AppleScriptからMac上のUIを操作しようとすると、「System Events でエラーが起きました:スクリプトエディタ には補助アクセスは許可されません。」という内容のエラーメッセージが表示されてしまします。

まだ設定されていない場合は、システム環境設定 > セキュリティとプライバシー > プライバシー > アクセシビリティアプリケーション > ユーティリティ > スクリプトエディタ.appを許可してください。
スクリーンショット 2016-08-21 5.47.47.png

2.GPXファイルを書き換えるスクリプト

このような感じでAppleScriptからGPXファイルを作り出します。

changeMyLocation.scpt
set gpxfile to "/Users/{username}/Documents/works/{xcodeproject}/MyLocation.gpx"
set lat to 35.6575811
set lon to 139.7009455

set outputStr to "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
set outputStr to outputStr & "<gpx version=\"1.1\">"
set outputStr to outputStr & "<wpt lat=\"" & lat & "\" lon=\"" & lon & "\" />"
set outputStr to outputStr & "</gpx>"

open for access POSIX file gpxfile with write permission
write outputStr to POSIX file gpxfile as «class utf8»
close access POSIX file gpxfile

gpxfileのファイルパスは追加したGPXファイルのものに書き換えてください。

3.Simulate Locationをクリックするスクリプト

changeMyLocation.scpt
tell application "System Events" to tell process "Xcode"
    click menu item "MyLocation" of menu 1 of menu item "Simulate Location" of menu 1 of menu bar item "Debug" of menu bar 1
end tell

4.徐々に位置情報を書き換え続けるループ処理をつくる

repeatでループし緯度と経度に1秒毎に0.001を加算するようにしました。
これで北東方向に進むようになります。

changeMyLocation.scpt
set gpxfile to "/Users/{username}/Documents/works/{xcodeproject}/MyLocation.gpx"
set lat to 35.6575811
set lon to 139.7009455

repeat
    set lat to lat + 1.0E-3 -- +0.001
    set lon to lon + 1.0E-3 -- +0.001

    set outputStr to "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    set outputStr to outputStr & "<gpx version=\"1.1\">"
    set outputStr to outputStr & "<wpt lat=\"" & lat & "\" lon=\"" & lon & "\" />"
    set outputStr to outputStr & "</gpx>"

    open for access POSIX file gpxfile with write permission
    write outputStr to POSIX file gpxfile as «class utf8»
    close access POSIX file gpxfile

    tell application "System Events" to tell process "Xcode"
        click menu item "MyLocation" of menu 1 of menu item "Simulate Location" of menu 1 of menu bar item "Debug" of menu bar 1
    end tell

    delay 1
end repeat

このコードをスクリプトエディタで実行します。
▶ボタンで実行、■ボタンで停止です。
Group.png

実行して実機を確認すると動いていることが確認できました。

Group.png

おわり

継続的に動かすのに慣れてないAppleScriptを使う必要がありますが、iOS側は簡単でしたね。
どのように使うかは自己責任でお願いします。

1つ問題があり、アプリを終了してもSimulate Locationで設定した位置情報が元に戻りません、再起動すれば元にもどるのですが、簡単に戻す方法が不明です・・・