2016-08-11 3 views
1

Я создал очень простой читатель RSS-каналов. На данный момент это очень просто. Одна из проблем, с которыми я столкнулся, заключается в том, что приложение не работает на Android, если это не сборка разработки.Приложение Unity работает на сборке разработки, а не на обычном

RSS-канал должен выводить фид в виде графического интерфейса. Он делает это в редакторе Unity и в сборке ПК. Но он работает на сборке Android только в том случае, если он установлен как сборка разработки, иначе он просто показывает ярлык «RSS Reader», который жестко закодирован как графический интерфейс.

Ошибок нет, это не сбой и не зависание, что действительно странно.

Я думаю, что проблема в настройке. Когда я заставляю установку занимать больше времени, она работает даже без сборки разработки. Но я не уверен, что это за проблема.

Вот соответствующий скрипт:

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine.UI; 
using System.Xml; 

public class rsstester : MonoBehaviour 
{ 
    public GameObject newsItemObject; 

    XmlTextReader rssReader; 
    XmlDocument rssDoc; 

    string feedUrl = "http://feeds.reuters.com/Reuters/worldNews?format=xml"; 

    void Start() { 
     rssReader = new XmlTextReader (feedUrl); 
     rssDoc = new XmlDocument(); 
     rssDoc.Load (rssReader); 

     XmlNode rssNode = null; 

     for (int i = 0; i < rssDoc.ChildNodes.Count; i++) { 
      XmlNode childNode = rssDoc.ChildNodes [i]; 
      if (childNode.Name == "rss") { 
       rssNode = childNode; 
       break; 
      } 
     } 

     XmlNode channelNode = null; 

     if (rssNode != null) { 
      for (int i = 0; i < rssNode.ChildNodes.Count; i++) { 
       XmlNode childNode = rssNode.ChildNodes [i]; 

       if (childNode.Name == "channel") { 
        channelNode = childNode; 
        break; 
       } 
      } 
     } 

     List<XmlNode> newsItems = new List<XmlNode>(); 

     if (channelNode != null) { 
      for (int i = 0; i < channelNode.ChildNodes.Count; i++) { 
       XmlNode childNode = channelNode.ChildNodes [i]; 

       if (childNode.Name == "item") { 
        newsItems.Add (childNode); 
       } 
      } 
     } 

     foreach (XmlNode newsItem in newsItems) { 
      string title = newsItem ["title"].InnerText; 
      string description = newsItem ["description"].InnerText; 
      string link = newsItem ["link"].InnerText; 

      GameObject childObject = Instantiate(newsItemObject) as GameObject; 
      childObject.transform.SetParent(gameObject.transform, false); 

      childObject.transform.Find ("Title").gameObject.GetComponent<Text>().text = title; 
      childObject.transform.Find ("Title").gameObject.GetComponent<LinkClick>().link = link; 
      childObject.transform.Find ("Description").gameObject.GetComponent<Text>().text = description; 
     } 
    } 
} 

Вот unity package

Вот APK-:

Edit:

Assets will often include AndroidManifest. Are you sure that this is not related with permissions?

Это, кажется, не имеют ничего близкого к этому. Нет .xml файлов. Как ни странно, приложение работает, когда я импортирую только файлы C# из пакета.

Вот unity package со сценариями и здесь являются C# сами файлы: 1234

Edit # 2:

После нескольких проб и ошибок, я узнал, который нужен файл чтобы приложение работало. Я не знаю, как это возможно.

Здесь: Reporter.cs

+1

Вы не объяснили, что вы подразумеваете под «не работает». Вызывает ли ошибка? Это крушение? Я предполагаю, что вы предполагаете, что он медленно запускается и уходит из ОС за то, что он не отвечает? Если это так, я бы посоветовал вам делать слишком много работы в Start(), и вы должны распространять его по нескольким кадрам. Система Coroutine от Unity - это простой способ добиться этого с минимальными изменениями кода. – eAi

+0

О, извините, не понял, что я вообще не писал, что именно не так. RSS-канал должен выводить фид в виде графического интерфейса. Он делает это в Unity Editor, PC build. Он работает на сборке Android только в том случае, если это сборка разработки, иначе она просто показывает ярлык «RSS Reader», который жестко закодирован как графический интерфейс. –

+0

Можете ли вы попробовать сделать сборку без чередования кода? –

ответ

1

На Android, приложение требует разрешений.Вы приложение использует подключение к Интернету для загрузки данных, поэтому вам необходимо добавить следующее разрешение на манифеста:

<uses-permission android:name="android.permission.INTERNET"/> 

Разрабатываемая версия работает потому, что в манифесте есть дополнительные строки, добавленные единства, которые, конечно, не хватает в производственной версии:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:maxSdkVersion="18" android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

Чтобы добавить манифест в Unity создать файл AndroidManifest.xml в {Project root}\Assets\Plugins\Android, а затем вставьте этот манифест (это твое от серийной версии с добавлением дополнительное разрешение):

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.slayther_and_malekian.rss_reader" platformBuildVersionCode="23" platformBuildVersionName="6.0-2704002"> 
     <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true"/> 
     <application android:banner="@drawable/app_banner" android:debuggable="false" android:icon="@drawable/app_icon" android:isGame="true" android:label="@string/app_name" android:theme="@style/UnityThemeSelector"> 
      <activity android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.unity3d.player.UnityPlayerActivity" android:screenOrientation="fullSensor"> 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN"/> 
        <category android:name="android.intent.category.LAUNCHER"/> 
        <category android:name="android.intent.category.LEANBACK_LAUNCHER"/> 
       </intent-filter> 
       <meta-data android:name="unityplayer.UnityActivity" android:value="true"/> 
      </activity> 
     </application> 
     <uses-feature android:glEsVersion="0x00020000"/> 
     <uses-permission android:name="android.permission.INTERNET"/> 
     <uses-feature android:name="android.hardware.touchscreen" android:required="false"/> 
     <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false"/> 
     <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false"/> 
    </manifest> 

Или вы можете использовать магический трюк, который заставляет Unity добавлять разрешение самостоятельно. Поместите этот код в любом месте проекта.

WWW magic = new WWW("magic"); 
+0

Ну, это не проблема с разрешениями. _Когда я заставляю установку занимать больше времени, она работает даже без сборки разработки. Но я не уверен, какова фактическая проблема, которая вызывает это. Я могу заставить приложение работать без сборки разработки, если я импортирую случайный актив, который достаточно велик. –

+0

Активы часто включают AndroidManifest. Вы уверены, что это не связано с разрешениями? – pr0gramist

+0

О, я об этом не думал. Я проверю пакет .. –