2016-12-29 7 views
3

iOS10のGameCenterの新機能で正しく動作するようにアプリケーションをアップデートしようとしています。GameCenter for iOS 10のiMessagedベースの招待状

私はdevice1に新しいGKGameSessionを作成し、共有URLを取得し、それでも正常に動作します。共有URLを共有シートを介してデバイス2に送信します。

デバイス2がリンクをクリックすると、デバイスは簡単に「取得中...」と表示してからアプリを起動します。すばらしいです!しかし、今何?何らかの方法でこのURLにアクセスできるコンテキスト情報がありますか?そうでなければ、私はアプリが起動されたときにどのように対応するかを知りません。

以前は、GKLocalPlayerListenerプロトコル、メソッド:player:didAcceptInvite:をコールバックして、そのようにマッチすることができました。しかし、これらのiCloudベースのメッセージでは、プレイヤーはGameCenterにログインしていない可能性もあります。この部分は、WWDCのプレゼンテーションで光沢を帯びているようです。

また、今日(12/28/2016)現在、これらの新しい方法についてのAppleのドキュメントはありません。

+0

こんにちはショーン、あなたは私の答えを受け入れることができますか?私はこれがあなたが解決策に近づくことに最も近いと思います。これは良い回避策です。 – TheBasicMind

答えて

1

GKGameSessionEventListenerコールバックセッション:didAddPlayer:ゲームが既に実行されている場合のみ起動します。回避策が必要なたびにこのコールバックを処理できることを確認してください。私はこれを試して、それは動作します。

iMessageを送信するか、ゲームに招待する電子メールを送信するときは、メッセージにGame Session Invite URLを直接含めないでください。代わりに、アプリがインストールされている端末で開いたときにアプリを開く登録済みのURLを使用してください。

Complete Tutorial on iOS Custom URL Schemes

しかしパーセントを追加し、ゲームのエンコーディングは以下のようなものを、このURLにパラメータとしてURLを招待エスケープ(私は例えば、URLの登録を仮定している:どのように見るにはこちらをチェックnewGameRequestを使用することができますが、これは非常にユニークで、さらに優れたものにするのが最善です。より多くの設定が必要ですが、Universal Link Supportを試してください。これにより、あなたのアプリをインストールしていないユーザーをダウンロードリンクでWebページに誘導できます)

let openOverWordForPlayerChallenge = "newGameRequest://?token=" 

gameState.gameSession?.getShareURL { (url, error) in 
    guard error == nil else { return } 
    // No opponent so we need to issue an invite 
    let encodedChallengeURL = url!.absoluteString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed) 
    let nestedURLString = openOverWordForPlayerChallenge + encodedChallengeURL! 
    let nestedURL = URL(string: nestedURLString)! 
} 

メッセージやメール、WhatsAppなどでURLを送信します。次に、あなたのアプリケーションデリゲートに以下を追加してください:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 
    var success = false 
    if let queryString = url.query { 
     if let urlStringToken = queryString.removingPercentEncoding { 
      let token = "token=" 
      let startIndex = urlStringToken.startIndex 
      let stringRange = startIndex..<urlStringToken.index(startIndex, offsetBy: token.characters.count) 
      let urlString = urlStringToken.replacingOccurrences(of: token, with: "", options: .literal, range: stringRange) 
      if let url = URL(string: urlString) { 
       if UIApplication.shared.canOpenURL(url) { 
        UIApplication.shared.open(url, options: [:], completionHandler: nil) 
        success = true 
       } 
      } 
     } 
    } 
    return success 
} 

これで、session:didAddPlayer:が呼び出されます。このワークアラウンドの賭けは約2週間有効で、WWDC 2017で展示されたiOSの次のリリースでこれを修正します!アップデート:この問題は修正されていないため、上記の回避策は良好なままです!

0

私は同意しますが、文書の欠如はイライラしています。

  • は、クラスのヘッダーに<GKGameSessionEventListener>プロトコルを追加
  • その後、リンクを招待受け入れた後プレイヤーのデバイスを結ぶsession:didAddPlayer:火災:私が見ることができるものから、我々はする必要があります。

更新:残念ながら 、私はあなたの結果を聞いて驚いていませんよ。私はそれらのシナリオのすべてを試していませんでしたが、GKTurnBasedMatchにも同様の欠点がありました。私はそれを周りの周りに持っていた:私はデータ(招待、アクティブ、終了など)に一致するプレーヤーのステータスのリストを追加しました。私はプレーヤーに "招待状の保留中"の見解を与えました。彼らがそのビューを開いたとき、私はすべてのマッチをロードし、プレイヤーが招待された状態にあったエントリを表示します。 GKGameSessionでは、それもうまくいくはずです。

あなたが気付いているセッションのローカルリストを維持できれば、より簡単かもしれません。ゲームがアクティブになるたびに、サーバからセッションのリスト全体を取り出し、新しいエントリを探します。新しいエントリは、共有URLをクリックしてプレーヤーが受け入れたばかりのマッチでなければなりません。

+0

私はチェックしました。これは参加しているプレイヤーがすでにアプリをインストールしていて、バックグラウンドで実行していると仮定して動作します。そうでなければ、アプリケーションがコールド起動されたときにこのメソッドを呼び出すことはありません。違う場合は、返信してください。 –

関連する問題