如何在swift中访问存储在另一个应用程序中的声音文件?

时间:2017-01-04 01:56:06

标签: ios swift avaudioplayer sandbox

这个问题很像Share data between two or more iPhone applications,除了:

  • 我正在寻找一种使用 swift
  • 在iOS 8+(或9+)应用程序中执行此操作的方法
  • 我希望能够使用第一个应用程序中包含的声音文件,因此我正在制作的复活节彩蛋仅在用户安装了两个应用程序时才可用
  • 因为这是复活节彩蛋的一部分,我不想使用任何会导致任何额外的方法在屏幕上显示,例如浏览器重定向或某种权限弹出

(这基本上排除了使用共享表和自定义网址传递数据,如上文所述)

我在第一个应用中使用boolean firstCallDone = false; boolean secondCallDone = false; DataSnapshot firstDataSnapshot = null; DataSnapshot secondDataSnapshot = null; onCreate() { firstRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { firstCallDone = true; firstDataSnapshot = dataSnapshot; if (firsCallDone && secondCallDone) doSomething(); } ... } secondRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { secondCallDone = true; secondDataSnapshot = dataSnapshot; if (firsCallDone && secondCallDone) doSomething(); } ... } } doSomething() { // do something with firstDataSnapshot and secondDataSnapshot ... } AVAudioPlayer播放声音,如果这对我们有帮助的话。

2 个答案:

答案 0 :(得分:2)

使用App Group

您可以通过DataContext分享实际的<local:LoginForm Validator="{Binding DataContext, ElementName=WindowName}"}>

NSData

并从同一组中的其他应用中检索,如下所示:

NSUserDefaults

似乎通过用户默认值传递数据的唯一限制是设备存储容量,并且由于if let userDefaults = NSUserDefaults(suiteName: <group>) { userDefaults.setObject(obj, forKey: key) } 接受if let userDefaults = NSUserDefaults(suiteName: <group>) { if let obj = userDefaults.objectForKey(key) { // magic } } 作为存储格式,因此它成为共享花絮信息的主要候选者。

答案 1 :(得分:0)

如果这两个应用都是你的,你可以在第二个应用程序中实现自定义URL方案,然后从第一个应用程序询问它是否知道如何打开具有该方案的URL。如果答案是肯定的,则安装该应用程序。该函数称为canOpenURL。它是UIApplication的实例方法。

我依稀记得在iOS 9及更高版本中,Apple添加了一项限制,您必须在info.plist中注册您要询问的网址,但我不记得详细信息。这不会阻止这个计划的运作,但这是你必须采取的额外步骤。