RubyMotionでError when install package on device: code -402620394と出た場合の対処

  • 0
    いいね
  • 0
    コメント

    起きたこと

    ちょっとした興味と実務上の必要性からRubyMotionで簡単なアプリでも作ろうと思い環境を整えたところで掲題のエラーが発生。こんな感じ。

    $ rake devise
    # ゴニョゴニョ
    Error when install package on device: code -402620394
    Make sure RubyMotion is using a valid (non-expired) provisioning profile
    and that no other process (iTunes, Xcode) is connected to your iOS device
    at the same time (even through Wi-Fi).
    
    

    時系列で表すと・・・

    1. 公式でスタータープランで登録、DL
    2. アップルのデベロッパープログラムにてお布施
    3. アップルから48時間後に届くキーを使ってアクティベート
    4. p12ファイル、プロビジョニングプロファイルの用意
    5. Rakefileに必要な項目を入力
    6. rake devise => エラー発生

    設定内容

    5までの手順は特に手こずることもなくググりながらサクッとできた(但しアップルからアクティベーションに必要なきーが届くまではとてもヤキモキした)。
    6もネットに落ちてる情報を元に設定したがこれが非常にハマった。
    結論を知りたい人は結論まで読み飛ばして欲しい。

    以下、問題があったRakefile。

    
      1 # -*- coding: utf-8 -*-
      2 $:.unshift("/Library/RubyMotion/lib")
      3 require 'motion/project/template/ios'
      4 
      5 begin
      6   require 'bundler'
      7   Bundler.require
      8 rescue LoadError
      9 end
     10 
     11 Motion::Project::App.setup do |app|
     12   # Use `rake config' to see complete project settings.
     13   app.name = 'myapp'
     14   app.sdk_version = '9.3'
     15   app.deployment_target = '9.3'
     16   app.identifier = 'ABCDE.com.mydomain.hogehoge'
     17   app.codesign_certificate = 'iPhone Developer: Soudai Sasada (ABCDEFGH)'
     18   app.provisioning_profile = '~/Downloads/myapp.mobileprovision'
     19 end
    
    

    ちなみに他のファイルは全てmotion createコマンドを打ってから何も弄っていない。この時点でrakeを叩いてエミュレータは問題なく動くことを確認済み。

    で、実際にこれで動かすと掲題のエラーが発生。--traceオプションを付けたうえで実際に見てみる。

    
    $ rake device --trace
    
    ** Invoke device (first_time)
    ** Invoke archive (first_time)
    ** Invoke build:device (first_time)
    ** Execute build:device
    # ゴニョゴニョ
    ** Execute archive
    # ゴニョゴニョ
    ** Execute device
    log: subscribing to device notification
    log: found usb mobile device 11111111 # UDID
    log: connecting to device
    log: pairing device
    log: creating lockdown session
    log: copy .app to device
    log: install package on device
    Error when install package on device: code -402620394
    Make sure RubyMotion is using a valid (non-expired) provisioning profile
    and that no other process (iTunes, Xcode) is connected to your iOS device
    at the same time (even through Wi-Fi).
    
    

    こんな感じ。
    で、エラーに分かりやすく説明が書いてあるから楽勝と思っていたがこれがとてもハマった。

    まずprovisioning profileがexpireしてない?と言われているがアップルのサイトで見てもactiveだし期限も1年ある。うん、おかしくない。

    次にiTunesやXcodeでWi-Fi使って繋いでないかい?みたいな内容が書いてある。確かにiTunesやXcodeを立ち上げると即座に端末と繋がる。それもそのはずでUSB経由でiPhone側もMacを信頼しているからそうなる。信頼してはまずいのかと思いiPhoneの設定をリセットしたがそれでも直らない。

    ここらからググる。真っ先に見たのはここ
    けどここではエミュレータ何度か立ち上げるとこのエラーが出て端末繋がらなくなる的な話に見える。そして再起動すれば動くとも書いてある。何より解決策が端末と母艦のWiFiオフにしてやってみろというものでこれがどうやら効果があるらしい。ところが全然ダメ。

    他に情報としてはadhocでやっている場合には端末から一度アプリを削除してみろ、ちゃんと動くぞというものがあったのでXcodeを立ち上げてdeviseからプロビジョニングプロファイルを消し、以下を実行(これも効果なし)。

    
    $ rake clean:all
        Delete ./build
        Delete /Users/username/Library/RubyMotion/build
    $ rake build:devise
         Build ./build/iPhoneOS-9.3-Development
       Compile ./app/app_delegate.rb
        Create ./build/iPhoneOS-9.3-Development/myapp.app
          Link ./build/iPhoneOS-9.3-Development/myapp.app/myapp
        Create ./build/iPhoneOS-9.3-Development/myapp.app/PkgInfo
        Create ./build/iPhoneOS-9.3-Development/myapp.app/Info.plist
          Copy ./resources/Default-568h@2x.png
          Copy ./resources/Default-667h@2x.png
          Copy ./resources/Default-736h@3x.png
          Copy /Library/RubyMotion/lib/motion/project/template/ios/launch_image/launch_screen.png
          Copy /Library/RubyMotion/lib/motion/project/template/ios/launch_image/launch_screen.storyboardc
        Create ./build/iPhoneOS-9.3-Development/myapp.app.dSYM
          Copy ./build/iPhoneOS-9.3-Development/myapp.app.dSYM
        Create ./build/iPhoneOS-9.3-Development/myapp.app/embedded.mobileprovision
      Codesign ./build/iPhoneOS-9.3-Development/myapp.app
    $ 
    
    

    よく見れば同じことをrakeコマンドが全部やっているのでこれは全く意味ないけどやったりした。他にrake devise id=111111という感じでUDID指定してみろという情報もありやったが意味なし。

    冷静に考えるとinstallは途中まで走っている。お膳立ても悪いようには見えない。そこで改めてRakefileを弄るとうまくいった。

    結論

    Rakefileに問題がありこれを弄ったらあっさり動いた。

    
      1 # -*- coding: utf-8 -*-
      2 $:.unshift("/Library/RubyMotion/lib")
      3 require 'motion/project/template/ios'
      4 
      5 begin
      6   require 'bundler'
      7   Bundler.require
      8 rescue LoadError
      9 end
     10 
     11 Motion::Project::App.setup do |app|
     12   # Use `rake config' to see complete project settings.
     13   app.name = 'myapp'
     14   app.sdk_version = '9.3'
     15   app.deployment_target = '9.3'
     16   # app.identifier = 'ABCDE.com.mydomain.hogehoge'
     17   app.identifier = 'com.mydomain.hogehoge'
     18   app.codesign_certificate = 'iPhone Developer: Soudai Sasada (ABCDEFGH)'
     19   app.provisioning_profile = '~/Downloads/myapp.mobileprovision'
     20 end
    
    

    注目すべきは17行目。16行目ではidentifierにseed_idを付加していたが、どうやらこれがまずかった。ではなぜ分かったかと言えばrake configコマンドで表示された内容だった。以下、直す前のもの。

    
    $ rake config
    background_modes       : []
    build_dir              : "./build"
    codesign_certificate   : "iPhone Developer: Soudai Sasada (ABCDEFGH)"
    delegate_class         : "AppDelegate"
    deployment_target      : "9.3"
    device_family          : :iphone
    embed_dsym             : true
    embedded_frameworks    : []
    entitlements           : {}
    external_frameworks    : []
    files                  : ["./app/app_delegate.rb"]
    fonts                  : []
    framework_search_paths : []
    frameworks             : ["UIKit", "Foundation", "CoreGraphics", "CoreFoundation", "CFNetwork", "CoreAudio"]
    icons                  : []
    identifier             : "ABCDE.com.mydomain.hogehoge"
    interface_orientations : [:portrait, :landscape_left, :landscape_right]
    libs                   : []
    manifest_assets        : []
    motiondir              : "/Library/RubyMotion"
    name                   : "myapp"
    prerendered_icon       : false
    provisioning_profile   : "/Users/username/Downloads/myapp.mobileprovision"
    resources_dirs         : ["./resources", "/Library/RubyMotion/lib/motion/project/template/ios/launch_image"]
    sdk_version            : "9.3"
    seed_id                : "ABCDE"
    short_version          : nil
    specs_dir              : "./spec"
    status_bar_style       : :default
    version                : "1.0"
    weak_frameworks        : []
    xcode_dir              : "/Applications/Xcode.app/Contents/Developer"
    
    

    むむ、seed_idが別個に表示されている。もしかしてidentifierにはseed_idいらないんじゃない?と思いseed_idを取りそして起動に至る。

    感想

    とにかく動いて嬉しい。
    半分あきらめてエミュレータでもっそり開発するかと思っていたが、普段サーバサイドばかり書いている人間としてはスマホでアプリが動くのかなりテンションが上がる。
    RubyMotionは情報が少ないこともあり英語が得意ではない層の人間としてはとても困った。何が正解か分からない中だったのでもしこのエラーが出た場合にこの記事が一つの正解として誰かの役に立てば嬉しい。