我很确定我已经知道这次尝试会产生什么样的结果,但在我开始付出很多努力之前,我应该向别人问一下这个问题。这是我想要尝试的:
我正在Swift中开发一个iOS应用程序,我只是编写了一个PHP脚本来向我的设备发送静默推送通知。在这个无声通知中,我正在传递说明,让我的应用委托使用UIApplication.shared.openURL(url:)
方法打开应用。只有当用户点击在线网页上的某个按钮时才会运行此PHP脚本,只有当用户在他的iPhone设备上使用Safari网络浏览器并且我的应用已经在后台运行时才能访问该按钮,因此没有机会除了已经安装了我的应用并在后台运行的iPhone之外,任何人都可以从任何其他设备触发PHP脚本。如果你想知道为什么我会使用这个解决方法,而我也可以使用像URL方案或深层链接这样简单的东西,嗯,这很简单:首先,深度链接要求用户确认他想要我的应用程序在实际打开之前打开。我不想要这个,相反,我希望我的应用程序一旦点击按钮就会自动打开。其次,在通过深层链接或通用链接打开应用程序后,状态栏中会出现这个非常烦人的面包屑按钮,在用户从网页转换到我的应用程序后,该按钮不应再存在。我已经尝试了一切来摆脱确认提示和breadcrumb按钮,这是我能想到的最后一件事。即使应用程序已在后台打开并运行,是否可以使用远程通知触发openURL
方法?
答案 0 :(得分:1)
您无法在没有用户互动的情况下打开/启动应用前景
答案 1 :(得分:0)
您可以使用静音推送通知(Pushkit)。
它也可以在后台和app终止模式下工作。
收到静音推送通知后,您必须在通知中使用交互式按钮安排本地通知。
根据用户点按,您的应用将会打开并在didFinishLaunchingWithOption
上进行跟踪,您可以打开特定的URL
注意 - 如果没有用户互动,您将无法在Safari中打开特定的URL
。
您可以参考以下代码。
import UIKit
import PushKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,PKPushRegistryDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound]
application.registerForRemoteNotificationTypes(types)
self.PushKitRegistration()
return true
}
//MARK: - PushKitRegistration
func PushKitRegistration()
{
let mainQueue = dispatch_get_main_queue()
// Create a push registry object
if #available(iOS 8.0, *) {
let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue)
// Set the registry's delegate to self
voipRegistry.delegate = self
// Set the push type to VoIP
voipRegistry.desiredPushTypes = [PKPushTypeVoIP]
} else {
// Fallback on earlier versions
}
}
@available(iOS 8.0, *)
func pushRegistry(registry: PKPushRegistry!, didUpdatePushCredentials credentials: PKPushCredentials!, forType type: String!) {
// Register VoIP push token (a property of PKPushCredentials) with server
let hexString : String = UnsafeBufferPointer<UInt8>(start: UnsafePointer(credentials.token.bytes),
count: credentials.token.length).map { String(format: "%02x", $0) }.joinWithSeparator("")
print(hexString)
}
@available(iOS 8.0, *)
func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!) {
// Process the received push
}
}
Refer推送套件集成的更多资料。