使用 UIActivityViewController 发布以更正 Instagram 帐户
Posting to correct Instagram Account with UIActivityViewController
我正在使用 UIActivityViewController
到 post 图像从我的应用程序到 Instagram 应用程序。
请注意我的应用不使用 Instagram API 或登录用户的 Instagram 帐户。
let sharingImage = button.backgroundImage(for: [])
let avc = UIActivityViewController(activityItems: [sharingImage as AnyObject], applicationActivities: nil)
avc.excludedActivityTypes = [.addToReadingList,.airDrop,.assignToContact,.copyToPasteboard,.openInIBooks,.postToFacebook,.postToFlickr,.postToTencentWeibo,.postToTwitter,.postToVimeo,.postToWeibo,.saveToCameraRoll,.message,.mail,.print]
if let wPPC = avc.popoverPresentationController {
wPPC.sourceView = followUsButton
}
self.present(avc, animated: true, completion: nil)
我使用多个帐户登录我的 Instagram 应用程序。从我的应用程序分享后,Instagram 会尝试 post 到当前登录的帐户 'A'(在 Instagram 应用程序内)。这是有道理的。
但是,如果我现在切换到 Instagram 应用程序并切换到其中的帐户 'B',返回到我的应用程序然后再次尝试分享,它会继续尝试 post帐户 'A'.
修复它的唯一方法是终止我的应用程序并重新启动它,然后它加载正确的当前登录帐户 'B'。
有没有办法在共享时以编程方式重新加载正确的 Insta 帐户?
简答,我怀疑。
UIActivityViewController
不能让您控制用户的登录状态(这就是使用起来很有趣的原因)。 IMO,这是苹果方面的一个错误。因此,除非有一种秘密方法可以清除 iOS 运行时存储在您的应用程序内存中的授权令牌,否则我看不出您怎么可能实现您想要的。
此外,如果照片应用程序具有相同的行为,那不是一个好兆头...
以防万一,你说切换账号时出现问题,你的意思是
- 在我的应用程序中,您立即尝试从同一个 ViewController?
post
- 您移动到父视图(因此破坏了旧视图)返回,然后移动到与 1/?
相同的视图
两种情况的结果一样吗?我问是因为在新视图中实例化新的 UIActivityViewController
时,运行时可能会获取新的用户登录配置文件,而如果您从用于从旧帐户 post 的相同视图中实例化它,它可能不会这样做(因此它将使用旧登录名)
这是一个 iOS 问题,并非您的应用所特有。
这只是一种解决方法,但可能是您目前唯一的选择,因为您会发现即使是原生照片也有同样的问题,因此需要由 Apple 来解决。
在您的应用程序 Info.plist
中,添加值为 YES
的布尔键 UIApplicationExitsOnSuspend
。有关详细信息,请参阅 Information Property List Key Reference。
通过这种方式,应用程序在进入后台状态时会被终止,一旦您返回它,它就会重新加载。用户可能不会注意到差异。
也许在终止应用程序之前,您可以在以下位置添加一些界面状态保存功能:
optional func applicationWillTerminate(_ application: UIApplication)
我不知道你的应用程序是如何布局的,但你可以创建一个单例 class,它可以实现 Codable 并继续跟踪所有具有保存和加载功能的应用程序状态变量。应用程序启动时终止和加载时将触发保存。
希望对您有所帮助。
EDIT1:应该在 iOS 13 中工作
下面这段代码应该可以工作并终止您的应用程序,但不推荐这样做,并且您在上传到 AppStore 时可能会遇到问题。我想您可以通过解释他们在 SDK 中存在错误并指出问题所在来向 Apple 审核团队提出质疑。
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
exit(0)
}
}
我正在使用 UIActivityViewController
到 post 图像从我的应用程序到 Instagram 应用程序。
请注意我的应用不使用 Instagram API 或登录用户的 Instagram 帐户。
let sharingImage = button.backgroundImage(for: [])
let avc = UIActivityViewController(activityItems: [sharingImage as AnyObject], applicationActivities: nil)
avc.excludedActivityTypes = [.addToReadingList,.airDrop,.assignToContact,.copyToPasteboard,.openInIBooks,.postToFacebook,.postToFlickr,.postToTencentWeibo,.postToTwitter,.postToVimeo,.postToWeibo,.saveToCameraRoll,.message,.mail,.print]
if let wPPC = avc.popoverPresentationController {
wPPC.sourceView = followUsButton
}
self.present(avc, animated: true, completion: nil)
我使用多个帐户登录我的 Instagram 应用程序。从我的应用程序分享后,Instagram 会尝试 post 到当前登录的帐户 'A'(在 Instagram 应用程序内)。这是有道理的。
但是,如果我现在切换到 Instagram 应用程序并切换到其中的帐户 'B',返回到我的应用程序然后再次尝试分享,它会继续尝试 post帐户 'A'.
修复它的唯一方法是终止我的应用程序并重新启动它,然后它加载正确的当前登录帐户 'B'。
有没有办法在共享时以编程方式重新加载正确的 Insta 帐户?
简答,我怀疑。
UIActivityViewController
不能让您控制用户的登录状态(这就是使用起来很有趣的原因)。 IMO,这是苹果方面的一个错误。因此,除非有一种秘密方法可以清除 iOS 运行时存储在您的应用程序内存中的授权令牌,否则我看不出您怎么可能实现您想要的。
此外,如果照片应用程序具有相同的行为,那不是一个好兆头...
以防万一,你说切换账号时出现问题,你的意思是
- 在我的应用程序中,您立即尝试从同一个 ViewController? post
- 您移动到父视图(因此破坏了旧视图)返回,然后移动到与 1/? 相同的视图
两种情况的结果一样吗?我问是因为在新视图中实例化新的 UIActivityViewController
时,运行时可能会获取新的用户登录配置文件,而如果您从用于从旧帐户 post 的相同视图中实例化它,它可能不会这样做(因此它将使用旧登录名)
这是一个 iOS 问题,并非您的应用所特有。
这只是一种解决方法,但可能是您目前唯一的选择,因为您会发现即使是原生照片也有同样的问题,因此需要由 Apple 来解决。
在您的应用程序 Info.plist
中,添加值为 YES
的布尔键 UIApplicationExitsOnSuspend
。有关详细信息,请参阅 Information Property List Key Reference。
通过这种方式,应用程序在进入后台状态时会被终止,一旦您返回它,它就会重新加载。用户可能不会注意到差异。
也许在终止应用程序之前,您可以在以下位置添加一些界面状态保存功能:
optional func applicationWillTerminate(_ application: UIApplication)
我不知道你的应用程序是如何布局的,但你可以创建一个单例 class,它可以实现 Codable 并继续跟踪所有具有保存和加载功能的应用程序状态变量。应用程序启动时终止和加载时将触发保存。
希望对您有所帮助。
EDIT1:应该在 iOS 13 中工作 下面这段代码应该可以工作并终止您的应用程序,但不推荐这样做,并且您在上传到 AppStore 时可能会遇到问题。我想您可以通过解释他们在 SDK 中存在错误并指出问题所在来向 Apple 审核团队提出质疑。
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
exit(0)
}
}