我在我的Swift应用程序中从一些HTML 生成PDF .我使用a UIMarkupTextPrintFormatter并且具有与此要点类似的代码.我得到PDF NSData并将其附加到电子邮件中.在附加之前,应用程序不会向用户显示PDF.
我现在想要包含一些图像.NSURL使用我当前的PDF生成策略添加HTML不起作用.如何NSData添加与我的HTML相对应的PDF并添加图像?以下是我尝试过的一些事情:
这个答案建议在HTML中嵌入base64图像并使用UIPrintInteractionController.这确实为我提供了正确嵌入图像的打印预览,但是如何从那里到NSData相应的PDF输出?
我已经看到了一些类似的建议,UIWebView但是那些导致了同样的问题 - 我不想向用户展示预览.
我有一个方法可以改变我的应用程序播放的音轨,AVPlayer并设置MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo新的音轨:
func setTrackNumber(trackNum: Int) {
self.trackNum = trackNum
player.replaceCurrentItemWithPlayerItem(tracks[trackNum])
var nowPlayingInfo: [String: AnyObject] = [ : ]
nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = tracks[trackNum].albumTitle
nowPlayingInfo[MPMediaItemPropertyTitle] = "Track \(trackNum)"
...
MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = nowPlayingInfo
print("Now playing local: \(nowPlayingInfo)")
print("Now playing lock screen: \(MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo)")
}
Run Code Online (Sandbox Code Playgroud)
当用户明确选择专辑或曲目并且曲目结束并且下一曲目自动开始时,我会调用此方法.锁定屏幕在用户设置专辑或曲目时正确显示曲目元数据,但在曲目结束且自动设置下一曲目时不正确.
我添加了print语句以确保我正确填充nowPlayingInfo字典.正如所料,当调用此方法进行用户启动的专辑或曲目更改时,两个打印语句会打印相同的字典内容.但是,在自动跟踪更改后调用方法的情况下,局部nowPlayingInfo变量显示新的,trackNum而MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo显示前一个trackNum:
Now playing local: ["title": Track 9, "albumTitle": Test Album, ...]
Now playing set: Optional(["title": Track 8, "albumTitle": Test Album, ...]
Run Code Online (Sandbox Code Playgroud)
我发现,当我设置就行了断点,设置MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo到nowPlayingInfo,然后曲目编号正确更新锁屏上.sleep(1) …
我正在实现一个控件,其行为类似于NSTokenField(例如,Mail中的地址选择器),以便在iOS中使用.我使用横向UICollectionView,我最右边的单元格是UITextField.此控件将以包含右对齐文本的其他文本字段的形式显示.为了让我的新控件在这个上下文中看起来正确,我希望UITextField始终位于它的右边缘,UICollectionView并且选定的标签显示在它的左侧.
目前,当我第一次点击此行时,文本字段向左滚动,然后在添加更多标签时将其推到右侧.一旦它与右边缘齐平UICollectionView(当下图中添加'开胃菜')时,我开始得到我想要的行为.
我一直在考虑类似于最小宽度的东西,UITextField因此它占用的宽度与最初可用的宽度相同,并且随着标签的添加越来越少.或者,通过某种方式将固定字段固定到右侧.但是,我还没有找到实现这些想法的方法!
我怎样才能使文本字段始终位于右侧UICollectionView?
我在应用程序商店中有一个iOS应用程序,可以下载需要留在设备上以供离线使用的相对较大的文件.这些文件当前存储在应用程序的Documents文件夹中,但我现在正在阅读该Documents文件夹已备份,并且实际上只应用于用户生成的内容.此Apple技术问答表明NSURLIsExcludedFromBackupKey应该设置为防止备份.这表明应用程序/Library/Caches是放置这些类型文件的正确位置,尽管进一步阅读表明当设备存储空间不足时可以清除该文件夹,这对于此应用程序是不可接受的.我认为那/Library/Application Support/是他们最好的位置 - 听起来不错吗?
不幸的是,这个错误通过了应用审核流程.现在人们正在使用应用程序并且已经有一些文件持久保存到Documents文件夹和备份中,有哪些最佳实践可以解决这个问题?我似乎需要移动所有现有文件并设置他们NSURLIsExcludedFromBackupKey的应用程序更新.我如何保证这一次完成并且不会中断?是将文件移出Documents文件夹重要还是我可以将它们留在那里?更改文件的备份状态是否会将其从现有备份中删除?
我使用的是Swift 2.1.1,目标是iOS 8.0+.
我正在使用面向iOS 8并使用Realm的Swift 2.2编写应用程序.我允许用户使用各种可选属性对对象进行排序Results.sorted(_:ascending:).这对于降序排序非常有效,但对于升序排序,nil首先放置的值看起来不正确.许多数据库系统都有一个NULLS FIRST/LAST选项和CoreData,它看起来可能是子类NSSortDescriptor.nil在Realm中排序时,有没有办法始终将值放在最后?即使只有一个hacky策略,也会受到赞赏.
我们有一个SQLite数据库和一个对应的SQLiteOpenHelper子类。这个助手有一个onDowngrade我想为其编写Espresso测试的实现。
完整的onDowngrade实现在这里可用。这是它的简化版本:
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("CREATE TABLE IF NOT EXISTS foo_tmp (_id integer primary key, bar text not null, baz text not null);");
db.execSQL("INSERT INTO foo_tmp(_id,bar,baz) SELECT _id,bar,baz FROM foo;");
db.execSQL("DROP TABLE IF EXISTS foo;");
db.execSQL("RENAME TABLE foo_tmp TO foo;");
}
Run Code Online (Sandbox Code Playgroud)
该测试将加载具有很高版本号以及已添加或已删除列的数据库转储。然后,它将获得一个可读的数据库,并确保该版本已降级为当前的预期版本,并且列名是预期的列名。完整的资源在这里。看起来是这样的:
@Test
public void testMigration() throws IOException {
writeDatabaseFile("database" + File.separator + dbFilename);
InstancesDatabaseHelper databaseHelper = new InstancesDatabaseHelper();
SQLiteDatabase db = databaseHelper.getReadableDatabase(); …Run Code Online (Sandbox Code Playgroud) 我是 Android 应用程序的维护者之一,该应用程序自 2008 年以来一直在开发。我们目前管理自己的发布密钥,并且希望开始使用新的、更安全的密钥。我们的用户通常从 Play 商店安装,但有些需要通用 APK,我们希望继续发布。我们希望这些与 Play 商店安装/更新兼容,并且我们希望每个版本发布一个(即不是使用新旧密钥签名的两个)。我们的应用程序当前使用v1 和 v2 方案进行签名。
\n据我了解,我们有以下选择:
\n继续管理我们自己的密钥。生成新的现代密钥。在两个键之间创建旋转沿袭。发布时,使用旧密钥、新密钥以及使用v3 方案的沿袭文件进行签名。将其上传到 Play 商店并作为自行发布的通用 APK。
\n选择应用程序签名并上传旧密钥。请求新安装的密钥升级(可能会也可能不会被授予)。在本地生成新的现代密钥。上传该密钥作为更新后的密钥。在 Play 商店中,新密钥将用于新安装,旧密钥将用于现有安装。对于自行发布的通用 APK,我们可以在两个密钥之间创建一个旋转谱系并用它进行签名。
\n选择应用程序签名并上传旧密钥。升级 Android 13+ 的签名密钥。在本地生成新的现代密钥。上传该密钥作为更新后的密钥。在 Play 商店中,Android 13+ 设备将获得使用新密钥签名的安装和更新,所有其他设备将获得使用旧密钥签名的安装和更新。从自行发布的通用 APK 中,我们可以在两个密钥之间创建一个旋转谱系并用它进行签名。
\n在理想的情况下,我们可以注册应用程序签名,让 Google 管理签名并下载单个通用 APK 进行共享。这两种路径都适用于升级所有 Android 版本(我们支持低至 Android 5.1)上的现有安装(旧密钥)。我的理解是,这是不可能的,因为应用程序签名不使用 v3 签名方案或任何其他标准来建立新旧密钥之间的关系。我可以在2020 年 5 月关于应用签名的开发相关文章中找到这方面的最新信息:
\n\n\n当前的密钥升级过程未利用 Android 9 (Pie) 及更高版本中引入的密钥轮换功能。我们目前正在研究对这些操作系统版本上的设备使用应用程序签名 v3 进行密钥轮换的支持,一旦准备就绪,我们将在单独的公告中通知开发人员社区。
\n
我找不到相关的公告或文档。
\n …我正在尝试将项目更新为Gradle 3.0.1/gradle wrapper 4.1.过去运行的Robolectric测试现在在运行时失败./gradlew testDebugUnitTest:
android.content.res.Resources$NotFoundException: org.odk.collect.android:integer/google_play_services_version
at org.robolectric.android.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:72)
at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:319)
at org.robolectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:220)
at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:108)
at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:35)
Run Code Online (Sandbox Code Playgroud)
这是一个开源项目 - 此处提供了更新的配置.
它似乎没有关联,但为了以防万一 - 我们也开始看到pmd和lint我们之前没有的错误.那些配置或版本没有改变.
我发现了以下可能相关的问题:
到目前为止,关于这些职位的任何建议都没有帮助.我已经阅读了gradle和robolectric的发行说明,但没有看到任何提示.知道哪个工具可能导致问题?还有什么别的我可以试试吗?