Facebook SDK для Unity Android - генерируется неверный файл манифеста, невозможно войти

Хорошо, это заняло больше недели, но я наконец нашел причину, по которой я не могу войти в Facebook, используя Facebook SDK (v4.3.4) с Unity3d (v4.3) на моих устройствах Android. Теперь, чтобы выяснить, как это исправить...?

Симптом: я запускаю приложение на андроид устройстве. Когда я нажимаю кнопку входа в систему, он открывает запрос на разрешения от Facebook. Тогда... ничего. Регистрация не завершена, и, просматривая журналы, становится ясно, что LoginCallback не вызывается. (Несмотря на то, что Facebook appcenter записывает, что вы дали разрешение приложению). Если я попросил несколько разрешений, он запрашивает только первое. (обычно он запрашивает первый, кажется, что возвращается к приложению в течение доли секунды, а затем снова запрашивает второй).

Причина. Файл манифеста создается неправильно.

Вот пример одного файла манифеста для FriendSmash, когда он генерируется ПРАВИЛЬНО:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:theme="@android:style/Theme.NoTitleBar" android:versionCode="1" android:versionName="1.0" package="com.mycompany.mygame" android:installLocation="preferExternal">
  <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" />
  <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.facebook.unity.FBUnityPlayerActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.unity3d.player.UnityPlayerActivity">
    </activity>
    <activity android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="reverseLandscape" android:name="com.mycompany.mygame.UnityPlayerNativeActivity">
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
    </activity>
    <activity android:configChanges="keyboardHidden|orientation" android:name="com.facebook.LoginActivity" android:screenOrientation="portrait">
    </activity>
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="\ 586438214724597" />
  </application>
  <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" />
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-feature android:name="android.hardware.touchscreen" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

Вот пример файла манифеста для FriendSmash, когда он сгенерирован НЕПРАВИЛЬНО:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:theme="@android:style/Theme.NoTitleBar" android:versionCode="1" android:versionName="3.0" package="com.mycompany.mygame" android:installLocation="preferExternal">
  <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" />
  <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="reverseLandscape" android:name="com.mycompany.mygame.UnityPlayerNativeActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
    </activity>
    <activity android:configChanges="keyboardHidden|orientation" android:name="com.facebook.LoginActivity" android:screenOrientation="portrait">
    </activity>
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="\ 586438214724597" />
  </application>
  <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" />
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-feature android:name="android.hardware.touchscreen" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

Два основных различия: (1) основное действие для правильного файла манифеста называется "com.facebook.unity.FBUnityPlayerActivity", а для неправильного файла - "com.mycompany.mygame.UnityPlayerNativeActivity", и (2) правильный файл также имеет "com.unity3d.player.UnityPlayerActivity", а после него появляется "com.mycompany.mygame.UnityPlayerNativeActivity".

Но, к сожалению, в большинстве случаев Unity генерирует неверную версию файла. Я протестировал его с игрой FriendSmash, протестировал пользовательское приложение, которое добавляет SDK facebook, и протестировал другое примерное приложение, которое содержит только SDK facebook (все для Windows и Mac). Все они создали неправильную версию, за исключением случая, когда я впервые скачал полный проект FriendSmash. И когда я скачал FriendSmash fresh для тестирования на Mac, он также начал генерировать файл некорректно.

Кроме того, если вы просто попытаетесь собрать apk-файл в единстве без создания Google Android Project, он использует неправильный манифест и создает испорченное приложение.

Решение: нет идеи. У кого-нибудь есть мысли о том, как это исправить?

1 ответ

Решение

Итак, кажется, что файл манифеста, предоставляемый в новой версии примера проекта и в новом пакете Unity для SDK, используется для создания файла пользовательского манифеста, который использует Google Android Project. Должно быть, он был обновлен неправильно, и это является причиной проблем.

Чтобы исправить это, после импорта SDK Facebook просто замените файл в Assets/Plugins/Android/AndroidManifest.xml на старую версию:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" android:installLocation="preferExternal" android:theme="@android:style/Theme.NoTitleBar" android:versionCode="1" android:versionName="1.0">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name="com.facebook.unity.FBUnityPlayerActivity" android:launchMode="singleTask" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:launchMode="singleTask" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:launchMode="singleTask" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
    </activity>
    <activity android:name="com.facebook.LoginActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation">
    </activity>
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="\ 586438214724597" />
  </application>
</manifest>

Я еще не проверял это при создании нового проекта Google Android, но мне удалось напрямую создать файл apk и запустить его на телефоне.

Другие вопросы по тегам